浏览器中的SOCKS代理

发布于 2019-06-11 20:38:34 阅读 3733

前言

为什么我们打不开谷歌,因为我们有强大的长城帮我们挡住外来不好的网络,但是我们真的需要访问一些学术资料时,我们第一步就得需要一个VPN来帮助我们翻越这座长城,为什么我们打开VPN后,浏览器就可以正常的访问到一些之前打不开的网站呢?

前提

本次使用的VPN是shadowsocks软件(后面简称ss软件),并且已经打开代理自动配置模式(Proxy Auto Config Proxy Mode)

发现问题

首先来看下访问本站(国内站)的请求头是什么样的

WX20190611-204324.png

Request URL: https://zmis.me/
Request Method: GET
Status Code: 200  (from ServiceWorker)
Referrer Policy: no-referrer-when-downgrade

然后看下访问谷歌(被墙站)的请求头是什么样的

WX20190611-205019.png

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

Image.png

点击Open Proxy Setting后,会自动跳转到系统网络的代理页面

1560258178514.jpg

用sublime text打开127.0.0.1:1089/proxy.pac文件,然后你就恍然大悟了!

WX20190611-210429.png

截图下面的rules是被墙的过滤规则,如果URI正则可以匹配rules中的一条,系统自动走代理模式。

WX20190612-094217.png

上图为搜索google关键字。

当然上面我是开自动配置代理模式,如果发现某些网站还是不能访问,建议开启ss的全局模式。下图为开启全局模式时访问本站的效果

WX20190612-094519.png

可以看到已经出现了Remote Address: 127.0.0.1:1086字样,说明此时浏览器已经走了ss代理。

代码中使用ss代理

之前发现一个国外的美图网站,因为喜欢里面的图片,所以我想用go写一个爬虫,当使用http.get后,一直会超时结束,我排查了代码,没问题,使用浏览器访问页没有问题。此时我看了下浏览器的请求头,发现此网站走了代理,于是我把ss软件关闭,再次访问此网站,网站打不开,于是找到原因,我需要在http请求前设置一个代理,然后再去请求就可以了。

打开ss软件preferences,然后点击HTTP,里面的会有http代理监听的地址和端口。

WX20190612-101407.png

所以我这的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
        }
    }