macOS使用了代理也无法ping通google的原因及其解决办法
Table of Contents
终端不走代理的解决方法
终端不走代理主要是终端不读取系统的配置,只认终端的变量,我们可以在~/.bashrc
或~/.zshrc
添加以下配置
# 设置使用代理
alias setproxy="export http_proxy=http://127.0.0.1:1087; export https_proxy=$http_proxy; export all_proxy=socks5://127.0.0.1:1080; echo 'Set proxy successfully'"
# 设置取消使用代理
alias unsetproxy="unset http_proxy; unset https_proxy; unset all_proxy; echo 'Unset proxy successfully'"
添加上述配置后,就可以通过在终端执行setproxy
命令来设置终端走代理,使用unsetproxy
来取消走代理,具体请查看:Mac让Mail(自带邮箱客户端)的gmail走代理及终端走代理。
当我们使用setproxy
命令设置走代理之后,网络请求类的命令都会走代理,比如brew
、npm
、composer
、git
、curl
等等。
但是,ping www.google.com
还是ping不通,这是为什么呢?
使用了代理也无法ping通的原因
先说结论:ping使用的是ICMP协议,ICMP处于网络层(第三层),而SOCKS5是传输层代理协议(第四层),HTTP和HTTPS是应用层协议(第五层或者第七层),协议层不同是无法代理的。
因为上层协议是作为下层协议的数据来传输的,如图,TCP和和UDP是作为IP的数据部分来传输的,IP段本身是不知道数据是什么的。
ICMP协议是Internet Control Message Protocol,把“Protocol”往前挪,事实上它就是“Internet Protocol Control Message”,而“Internet Protocol”其实就是我们平时说的IP协议,所以“ICMP”其实就是“IP Control Message”,翻译成中文就是“IP协议控制信息”,ping、traceroute用的都是ICMP协议。
ICMP协议是封装在IP数据报的数据部分的(TCP/UDP也是在IP数据报),但它不作为一个独立的层次,只是作为IP层的一部分存在。
解决方法一:使用httping
首先安装httping(我是macOS,其它系统请自行安装)
brew install httping
但是httping也不直接使用终端的http_proxy
和https_proxy
变量,我们需要通过它的-x
参数手动指定使用代理
httping -x 127.0.0.1:1087 -g https://www.google.com
但是这样ping太麻烦了,我们可以写个alias放到~/.bashrc
或~/.zshrc
里(记得source重新加载才能读取到)
alias hping="httping -x 127.0.0.1:1087 -g"
或者也可以把-g
换成-h
,实则这两个参数完全一样用,看不出区别
alias hping="httping -x 127.0.0.1:1087 -h"
添加之后,我只需要这样ping就可以了
hping https://www.google.com
更简单的写法,不写协议(当然这样它会走80端口,即http协议)
hping www.google.com
当然也可以在不写协议的情况下添加443端口,这样虽然没写https协议,但它还是会走https,因为443端口是https默认端口
hping www.google.com:443
-x
表示指定http代理地址;-g
表示指定要ping的url;-h
表示指定要ping的主机名(即域名),h是hostname的首字母。
解决方法二:使用curl
使用setproxy
设置终端走代理后,直接使用curl来请求,比如:
curl https://www.google.com
如果返回一大片内容,说明是通的,那一大片内容就是goole首页的html代码,如果返回的是以下这样的报错,则说明没走代理或者代理不通
curl: (7) Failed connect to www.google.com:443; Connection timed out
Nice!