记录一下最近几天在搞的一个更舒服地上网的方案,尽量讲得详细一点。 参考的文章是:博客 有几个点和这篇文章不太一样,都会详细写出。
用到的几个开源项目:
- shadowsocks-libev
- privoxy: http 代理
- dnsmasq: dns 转发和缓存服务器
- dnscrypt-proxy: 加密 dns 请求代理
- dnsmasq-china-list: 国内域名列表。
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.