前言
为什么我们打不开谷歌,因为我们有强大的长城帮我们挡住外来不好的网络,但是我们真的需要访问一些学术资料时,我们第一步就得需要一个VPN来帮助我们翻越这座长城,为什么我们打开VPN后,浏览器就可以正常的访问到一些之前打不开的网站呢?
前提
本次使用的VPN是shadowsocks软件(后面简称ss软件),并且已经打开代理自动配置模式(Proxy Auto Config Proxy Mode)
发现问题
首先来看下访问本站(国内站)的请求头是什么样的
Request URL: https://zmis.me/
Request Method: GET
Status Code: 200 (from ServiceWorker)
Referrer Policy: no-referrer-when-downgrade
然后看下访问谷歌(被墙站)的请求头是什么样的
Request URL: https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png
Request Method: GET
Status Code: 200
Remote Address: 127.0.0.1:1086
Referrer Policy: origin
我们发现访问正常站与被屏蔽站的http请求头的区别是多了个Remote Address: 127.0.0.1:1086
。
那问题来了,1086
是什么端口?
打开ss软件,点击preferences
,然后点击Advanced
,我们发现了1086
端口是本地socks5监听的端口。
那为什么浏览器这么聪明的知道ss使用的是1086端口呢?
寻找答案
因为chrome自动读取系统的proxy配置,在chrome中的设置中搜索proxy
点击Open Proxy Setting后,会自动跳转到系统网络的代理页面
用sublime text打开127.0.0.1:1089/proxy.pac
文件,然后你就恍然大悟了!
截图下面的rules是被墙的过滤规则,如果URI正则可以匹配rules中的一条,系统自动走代理模式。
上图为搜索google
关键字。
当然上面我是开自动配置代理模式,如果发现某些网站还是不能访问,建议开启ss的全局模式。下图为开启全局模式时访问本站的效果
可以看到已经出现了Remote Address: 127.0.0.1:1086
字样,说明此时浏览器已经走了ss代理。
代码中使用ss代理
之前发现一个国外的美图网站,因为喜欢里面的图片,所以我想用go写一个爬虫,当使用http.get
后,一直会超时结束,我排查了代码,没问题,使用浏览器访问页没有问题。此时我看了下浏览器的请求头,发现此网站走了代理,于是我把ss软件关闭,再次访问此网站,网站打不开,于是找到原因,我需要在http请求前设置一个代理,然后再去请求就可以了。
打开ss软件preferences
,然后点击HTTP
,里面的会有http代理监听的地址和端口。
所以我这的http代理为http://127.0.0.1:1087
,下面为代码片段
targetURL = "xxxxx.com"
proxyStr, err := url.Parse("http://127.0.0.1:1087")
if err != nil {
fmt.Println(err)
return
}
tr := &http.Transport{
Proxy: http.ProxyURL(proxyStr),
}
client := &http.Client{
Transport: tr,
Timeout: time.Second * 10, //超时时间
}
request, err := http.NewRequest("GET", targetURL, nil)
if err == nil {
_, err := client.Do(request)
if err == nil {
//todo
}
}