Total Pageviews

Monday, 18 November 2019

利用shadowsocks-libev解決DNS污染问题

shadowsocks-libev从2.5.1 版本开始,正式支持了 access control list (ACL) 功能,在 3.0.6 版本 ss-local 的內置分流功能在這個 commit 之後就如常工作了,這裡是一些使用例子。ACL 功能使得 shadowsocks-libev 能對接受的請求按照一定的規則進行直連或代理。內置分流是如何實現的呢?實際上,shadowsocks-libev 還內置了一個異步 DNS client,並允許用戶將系統的 SOCKS5 代理設置為 shadowsocks-libev。這樣,shadowsocks-libev 便幾乎全局接管了系統流量,當 shadowsocks-libev 接收到一個域名時候,首先會對 ACL 列表中的條目進行正則匹配,如果沒有結果,則利用自帶的 DNS client 進行解析,得到 IP 之後再次匹配。就這樣,shadowsocks-libev 把本來在瀏覽器解析 PAC 的功能移動到 shadowsocks-libev 內部,解決了 PAC 分流在不同應用間行為不一致的問題。更重要的是,當域名解析為 IP,並且根據 ACL 規則觸發代理時,shadowsocks-libev 會將域名,而不是 IP 交給 ss-server,就這樣優雅地解決了DNS污染和CDN解析不是最優的問題。

分流代理在內建 DNS Client這件事上,shadowsocks-libev 並不是唯一一個,V2Ray 和 Surge 還有 Clash均是內建了 DNS Client。特別是 Clash 支持部署在 Linux 系統,利用系統的 Netfilter 功能實現對 OUTPUT 鏈和 NAT 鏈上的 TCP 包進行代理,讓我們在 OpenWrt 路由器,部署代理又多了一種新選擇。

shadowsocks-libev版有一个ss-tunnel工具,可以把远端主机(比如8.8.8.8)的端口(比如53)转发到本地的端口(比如53)。如果把8.8.8.8的53端口转发到本地的53端口,那么相当于开通了一个走shadowsocks-libev协议的DNS代理
在mac上,安装 shadowsocks-libev:brew install shadowsocks-libev
此命令会生成2个可执行文件:ss-local和ss-tunnel.
运行ss-tunnel -h
会显示:
...
 [-u]                       Enable UDP relay.
...
 [-L :]         Destination server address and port
                                  for local port forwarding.


 所以,运行的命令就是:
sudo ss-tunnel -s vps-ip -p 服务器上的shadowsocks-libev的端口号 -k my-key -m aes-256-cfb -l 53 -L 8.8.8.8:53 -u 

上面这条命令就相当于一个dns proxy,是一个走shadowsocks-libev通道的dns proxy.妈妈说:你再也不用怕dns污染了。我觉得此法是解決DNS污染问题的终极大法。

实际使用例子:
 
sudo wg-quick up wg0

sudo networksetup -setdnsservers "Wi-Fi" 127.0.0.1

 
sudo ss-tunnel -s vps-ip -p 服务器上的shadowsocks-libev的端口号 -k my-key -m aes-256-cfb -l 53 -L 8.8.8.8:53 -u  

然后,你就可使用wireguard vpn任意翻墙了。 

--------