最近在家办公,发现天朝的网络限制越来越严了。周末终于有时间,把家里电脑的上网状况改善一下了,这里记录一下。

搭FQ的梯子

在香港买了台服务器,在上面装了个shadowsocks-libev。为什么用shadowsocks-libev,因为买的服务器配置不太高,这个是用c语言和libev写的,资源占用低。

$ yum install -y epel-release
$ curl -o /etc/yum.repos.d/librehat-shadowsocks-epel-7.repo https://copr.fedorainfracloud.org/coprs/librehat/shadowsocks/repo/epel-7/librehat-shadowsocks-epel-7.repo
$ yum install -y shadowsocks-libev

编辑shadowsocks-libev的配置文件:

$ vim /etc/shadowsocks-libev/config.json

{
    "server":"0.0.0.0",
    "server_port":55387,
    "local_port":1080,
    "password":"<A-PASSWORD>",
    "timeout":60,
    "method":"xchacha20-ietf-poly1305"
}

这里用xchacha20-ietf-poly1305这个算法,据说效率好一点,而且也能稍微抗点干扰。

启动并设置开机自启动:

$ systemctl enable shadowsocks-libev && systemctl start shadowsocks-libev

在家里的Mac电脑上也安装shadowsocks-libev

$ brew install shadowsocks-libev

编辑shadowsocks-libev的配置文件:

$ vim /usr/local/etc/shadowsocks-libev.json

{
    "server": "xx.xx.xx.xx",
    "server_port": 55387,
    "local_port": 1086,
    "password": "<A-PASSWORD>",
    "timeout": 600,
    "method": "xchacha20-ietf-poly1305"
}

这里的server设置为上面那台服务器的公网IP,passwordmethod要与上面的设置保持一致。

启动它并设置开机自启动:

$ brew services enable shadowsocks-libev

至此即在本机Run起了一个Socks5代理127.0.0.1:1086,任何程序使用该代理上网,即是FQ了。

自动使用FQ梯子

显然所有的请求都走上述Socks5代理,上网速度肯定很慢,还好已经有人整理了gfwlist,即应该FQ的网站地址列表。那么我们只需要搭建一个智能代理,当遇到FQ地址时使用上述Socks5代理,否则就直接访问。在网上找了下,这里使用privoxy这个软件完成这件事。

首先用autoproxy2privoxy这个工具将gfwlist转成privoxy识别的actionsfile文件。

$ make -B proxy=socks5://127.0.0.1:1086
# 这里会生成gfwlist.action

安装privoxy:

$ brew install privoxy

将上述生成的gfwlist.action放到privoxy的配置目录,并进行相应的配置:

$ cp -r gfwlist.action /usr/local/etc/privoxy/gfwlist.action
$ vim /usr/local/etc/privoxy/config

....
actionsfile default.action   # Main actions file
actionsfile user.action      # User customizations
actionsfile gfwlist.action   # 增加gfwlist.action
actionsfile custom.action    # 增加自定义代理规则
....

有些地址虽然不在gfwlist列表里,但也要FQ才能访问,因此这里添加了一个custom.action

$ cat /usr/local/etc/privoxy/custom.action
{+forward-override{forward-socks5 127.0.0.1:1086 .}}
.githubusercontent.com
github.com

这里提一句,actionsfile文件里除了设置这些地址走Socks5代理外,还可以设置其它类型的代理,因此很适合做层次结构的代理服务器方案,参见这里

启动它并设置开机自启动:

$ brew services start privoxy

然后在系统的网络设置处设置全局代理,System Preferences-Network-Advanced...-Proxies,这里设置Web Proxy(HTTP)Secure Web Proxy(HTTPS)均为127.0.0.1:8118

注意一直明显不需要走代理的IP或域名填写到下面的Bypass proxy settings for these Hosts & Domains里,如localhost、127.0.0.1、114.114.114.114

现在打开游览器应该可以正常FQ上网了,而且访问网内的网站速度也很快。

处理DNS污染问题

以为万事大吉了,但有些网站仍然打不开,最终查明是域名的DNS的域名解析结果被污染了。这里在本机搭建DNS服务解决该问题。

安装dnsmasqdnscrypt-proxy

$ brew install dnsmasq
$ brew install dnscrypt-proxy

国内的一些域名可以安全地使用国内的DNS服务进行解析,这样快一点,有人已经将这些域名整理出来了,直接使用它。

$ /usr/bin/curl -x socks5://127.0.0.1:1086 -o /usr/local/etc/dnsmasq.d/accelerated-domains.china.conf https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf

这里用的是电信的DNS服务器,如果你是联通的网络,你可以执行下面的脚本将配置文件中的DNS服务器换成联通的:

sed -i -e 's/114.114.114.114/221.6.4.66/g' /usr/local/etc/dnsmasq.d/accelerated-domains.china.conf

然后配置dnsmasq的主配置文件:

$ vim /usr/local/etc/dnsmasq.conf

listen-address=127.0.0.1
no-resolv
conf-dir=/usr/local/etc/dnsmasq.d
server=127.0.0.1#5300

这里除上面的accelerated-domains.china.conf列表中的域名使用114.114.114.114解析外,其它域名解析转发给dnscrypt-proxy处理。

配置dnscrypt-proxy的主配置文件:

$ vim /usr/local/etc/dnscrypt-proxy.toml

# 监听5300端口
listen_addresses = ['127.0.0.1:5300', '[::1]:5300']
# 使用下面3个公开的DNS服务
server_names = ['google', 'cloudflare', 'cloudflare-ipv6']
# 如果找不到合适的公开DNS服务,则使用下面的DNS服务
fallback_resolvers = ['9.9.9.9:53', '8.8.8.8:53']
# 担心这些DNS请求被墙,设置使用代理发送DNS请求
force_tcp = true
proxy = 'socks5://127.0.0.1:1086'

启动dnsmasqdnscrypt-proxy

$ sudo brew services start dnsmasq
$ brew services start dnscrypt-proxy

注意因为dnsmasq要监听53端口,因此要使用root权限启动

然后在网络设置处设置全局DNS服务器为127.0.0.1System Preferences-Network-Advanced...-DNS,在这个界面中删除原来的所有DNS Servers,添加127.0.0.1

强制老旧程序使用全局代理

有些老旧程序并不会使用系统的全局代理,这点很讨厌,我这里可以使用proxychains-ng强制这些老旧程序使用全局HTTP代理。

安装proxychains-ng

$ brew install proxychains-ng

编辑proxychains-ng的主配置文件:

$ vim /usr/local/etc/proxychains.conf

# Quiet mode (no output from library)
quiet_mode

# Proxy DNS requests - no leak for DNS data
proxy_dns

[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
# socks4 	127.0.0.1 9050
http 127.0.0.1 8118

然后在启动老旧程序前加上/usr/local/bin/proxychains4即可,也可以写成脚本,如下:

#!/bin/bash

(/usr/local/bin/proxychains4 '/Applications/Navicat for MySQL.app/Contents/MacOS/Navicat for MySQL' </dev/null >/dev/null 2>&1) &

上面的例子里,启动的Navicat即会使用到全局的HTTP代理。

至此系统中所有程序均可以自动选择连网的方式,终于可以愉快地享受自由的网络了。

DONE!

参考

  1. https://www.howru.cc/articles/350.html
  2. https://github.com/jeremyxu2010/autoproxy2privoxy
  3. https://www.privoxy.org/user-manual/actions-file.html#FORWARD-OVERRIDE
  4. https://w2x.me/2019/06/12/Mac-OS%E9%85%8D%E7%BD%AEDnsmasq-Dnscrypt%E6%9D%A5%E8%A7%A3%E5%86%B3DNS%E6%B1%A1%E6%9F%93%E9%97%AE%E9%A2%98/
  5. https://github.com/felixonmars/dnsmasq-china-list
  6. https://www.hi-linux.com/posts/48321.html