记录一下最近几天在搞的一个更舒服地上网的方案,尽量讲得详细一点。 参考的文章是:博客 有几个点和这篇文章不太一样,都会详细写出。

用到的几个开源项目:

shadowsocks-libev

服务器配置:

{
  "server": ["0.0.0.0"],
  "mode": "tcp_and_udp",
  "server_port": "18388",
  "password": "<PASSWORD>",
  "timeout": "60",
  "method": "chacha20-ietf-poly1305",
  "nameserver": "208.67.222.222",
  "fast_open": true,
  "no_delay": true
}

这里我开启了no_delay这个参数,表示关闭 tcp 的 Nagle 算法,这个算法大概的意思就是 tcp 发包的时候,如果发送的数据量没有达到一定的值,会等一下后面的数据再发,这样无疑增加了网络的延迟;而关闭的意思就是如果有了哪怕一点数据就发送,不用等待。感兴趣的话可以去了解一下。这个参数具体对于网速究竟有没有提升不是很清楚,反正我开了。

服务器的内核参数优化

privoxy

这个软件是一个比较老的 http 代理软件,老不代表差,主要就是用它来做分流。
上面那篇文章里面用的是 GFW 黑名单,意思就是维护一个全部被墙的域名列表,如果请求的域名在列表里面就走代理,如果不在就直连,这样有一个弊端就是如果有新的网站被墙,而列表没有及时更新的话,访问就还是困难。所以我这里就选择另一个方案,白名单;如果访问的域名不在列表里面,全部走代理。

但是我好像没有找到适合privoxy的白名单这样的配置,国内域名的列表是有,就是这个:https://github.com/felixonmars/dnsmasq-china-list,那就用这个列表来自己动手生成一个配置文件。

因为后面也是要用到dnsmasq,也需要这个配置,所以先安装dnsmasq并配置。

dnsmasq

dnsmasq 我们用它的 dns 分流和 dns 缓存功能。

sudo pacman -S dnsmasq

wget https://github.com/felixonmars/dnsmasq-china-list

# 修改一下dns
sudo ./install.sh

会发现/etc/dnsmasq.d下面多了一些文件,

-rw-r--r-- 1 root root 2.0M Jun  8 20:37 accelerated-domains.china.223.5.5.5.conf
-rw-r--r-- 1 root root 2.0M Jun  8 20:37 accelerated-domains.china.223.6.6.6.conf
-rw-r--r-- 1 root root 5.2K Jun  8 20:37 apple.china.223.5.5.5.conf
-rw-r--r-- 1 root root 5.2K Jun  8 20:37 apple.china.223.6.6.6.conf
-rw-r--r-- 1 root root 5.3K Jun  8 20:37 bogus-nxdomain.china.conf
-rw-r--r-- 1 root root 1.9K Jun  8 20:37 google.china.223.5.5.5.conf
-rw-r--r-- 1 root root 1.9K Jun  8 20:37 google.china.223.6.6.6.conf

后面还会用到。 再来修改一下dnsmasq本身的配置,在/etc/dnsmasq.conf

no-resolv

# 将请求转发到5300端口的上游dns服务器,后面会提到。

server=127.0.0.1#5300

# 默认监听在127.0.0.1的53端口

listen-address=127.0.0.1

# 该目录下在域名dns请求都走配置的国内dns服务器,这里就是上面的233.5.5.5和233.6.6.6

conf-dir=/etc/dnsmasq.d

重启dnsmasq.

privoxy

接下来继续来配置没配置完的privoxy白名单:

因为privoxy的配置是以'.action'结尾的:

cut -f 2 -d/ accelerated-domains.china.223.6.6.6.conf | sudo tee direct.action
cut -f 2 -d/ apple.china.223.6.6.6.conf | sudo tee -a direct.action
cut -f 2 -d/ google.china.223.6.6.6.conf | sudo tee -a direct.action

然后编辑'direct.action',在所有的域名前面加上".",并且在第一行加上"{+forward-override{forward .}}",表示下面这些请求直连。
最后加上内网地址,访问内网不能走代理:
10.*.*.*
192.168.*.*
一个A类私有地址,一个C类的私有地址,应该就差不多了。

direct.action文件移动到目录/etc/privoxy

然后编辑主配置文件config

找到'actionsfile'
...
actionsfile match-all.action
actionsfile default.action
actionsfile user.action
actionsfile direct.action # 关键是在这里加上这个
...

listen-address  127.0.0.1:8118

...
# 这个是本地的socks5代理客户端监听的端口,这里的意思是将所有的请求发送到本地代理客户端。
因为前面的actionsfile将所有直连的请求过滤了,所以后面的所有请求走代理。

forward-socks5t   /         127.0.0.1:1080 .

重启privoxy.

dnscrypt-proxy

这个软件是加密 dns 请求,其实 http 代理本身会解析 dns 请求,而且由于我们是 socks5 代理,dns 请求会被发送到远端服务器解析,也就是前面在 ss 里面配置的’nameserver',这样也有一个好处就是保证 socks5 代理服务器获得的 dns 解析的 ip 是有 cdn 优化的,比如新加坡的代理解析出来的就是新加坡的服务器。这样我们只要保证我们的域名白名单没问题,就不会发生国内的域名解析到国外的 ip。
但是还有一些本地的应用也需要走代理,但是它不读取系统的 http 代理配置,那么就会用本地的 dns 解析,从而可能获得污染的 dns 结果,所以还是要在dnsmasq分流一下,部署dnscrypt-proxy, 编辑dnscrypt-proxy.toml:

比较重要的几个配置:

server_names = ['google']

listen_addresses = ['127.0.0.1:5300']

ipv6_servers = false

# 因为我们的ss开启了udp转发,所有这里不用tcp

force_tcp = false

# dns代理其实还是走了socks5代理,所以应该是dns over socks5?

proxy = 'socks5://127.0.0.1:1080'

fallback_resolvers = ['9.9.9.9:53', '8.8.8.8:53']

cache ture

重启,从日志中可以看到,它使用了’DoH'(dns over https)。

注意:从包管理器安装 dnscrypt-proxy,默认启动两种会互斥的启动方式,需要关闭dnscrypt-proxy.socket arhcwiki

本机及浏览器配置

打开电脑的网络设置,添加 http 代理:HTTP_PROXY:127.0.0.1:8118,HTTPS_POROXY:127.0.0.1:8118

浏览器打开设置,同样设置 http 代理。

完成!

dns 泄漏

其实用 http 代理的还有一个原因就是如果你直接用浏览器设置 socks5 代理,会有 dns 泄漏的风险,就是说虽然 socks5 是远程 dns 解析,但是浏览器在解析 dns 的时候可能还是用的本地的 dns 解析。isp 还是能够看到你要访问的网站是什么。http://www.chromium.org/developers/design-documents/network-stack/socks-proxy 所以这也是一个要在本地搭建一个加密 dns 服务器的原因之一。 也有很多网站可以测试 dns 泄漏问题。就是如果你配置了代理,但是你的 dns 服务器还是用的 isp 的,而不是代理的,那么就是 dns 泄漏。很多 vpn 如果配置不正确也会有 dns 泄漏问题。你以为你在匿名访问一些网站其实被 isp 看得一清二楚。

总结

上面一些开源软件的功能都异常强大,这里只用了很小一部分的功能。如果有错误的地方请大家指出,其实还有更好的方案就是用 v2ray,v2ray 一个软件应该就能做上面的所有事情。但是我不太会配置 v2ray,所有用了上面的方案。最关键的是上面的白名单,感觉确实比黑名单要好很多,也解决了 dns 污染和 dns 泄漏问题。

20220502 更新

因为我这边直接用的 NetworkManager 管理网络连接,而它可以集成dnsmasq,我们只要装好dnsmasq不用配置自己启动:

启动 dnsmasq

vim /etc/Networkmanager/conf.d/dns.conf
[main]
dns=dnsmasq

dnsmasq 配置文件目录

vim /etc/NetworkManager/dnsmasq.d/dnsmasq.conf
配置如上所述。

安装 dnsmasq-china-list-git

arch 可以直接装这个包。

重新加载网络连接

sudo nmcli general reload

20231022 更新

最近发现了 smartdns,配置以后发现确实能优选 dns 地址,所以将分流的 dnsmasq 替换了,dnscrypt-proxy 也不需要了。 直接安装:

yay -S smartdns smartdns-china-list-git

配置:

conf-file /etc/smartdns/accelerated-domains.china.smartdns.conf
conf-file /etc/smartdns/apple.china.smartdns.conf
conf-file /etc/smartdns/google.china.smartdns.conf

bind [::]:53

cache-size 4096
cache-persist yes
cache-file /var/cache/smartdns.cache

# default proxy
proxy-server socks5://127.0.0.1:1080 -name ssproxy
server 8.8.8.8 -proxy ssproxy
server 1.1.1.1 -proxy ssproxy
# openDNS DoH
server-https https://146.112.42.2/dns-query -proxy ssproxy
# openDNS DoT
server-tcp 208.67.220.220:443 -proxy ssproxy

# china direct
server 223.5.5.5 -group china -exclude-default-group
server-tls 223.5.5.5:853 -group china -exclude-default-group
server-tls 223.6.6.6:853 -group china -exclude-default-group
server-tls 114.114.114.114 -group china -exclude-default-group
server-tls 114.114.115.115 -group china -exclude-default-group

dualstack-ip-selection yes
dualstack-ip-selection-threshold 5

log-level info
log-file /var/log/smartdns/smartdns.log
log-size 128k

china 组走国内的 dns 查询,其他的走 default 也就是 socks5 代理,通过代理远程查询 dns,这样的好处是可以获取 cdn 优化的 ip,举个例子,如果我的代理在伦敦,我要访问谷歌,那么最好是能获得离伦敦近的地方的谷歌服务器,如果在本地解析,获得的 ip 就可能是新加坡等地方,这样伦敦的代理还要访问新加坡的谷歌服务器就比较慢。但是坏处就是远程解析第一次获得的速度会比较慢。 还开启了双栈的支持,smartdns 会对解析到的 ip 进行测速,然后返回速度最快的地址,这里配置了如果 ipv6 地址比 ipv4 快 5ms,就用 ipv6 的地址。 修改 dns 为 127.0.0.1:

vim /etc/NetworkManager/conf.d/dns-servers.conf
[global-dns-domain-*]
servers=::1,127.0.0.1

重启 NetworkManager.