SS导致本地DNS连接数暴涨

解决用ss代理科学上网,dns数量请求很多的问题。

近期发现Openwrt路由器里连接数居高不下,在只有一台电脑联网的时候只要一访问网站,连接数就暴涨,甚是奇怪。以前未注意过该问题。打开了路由器 状态实时信息连接 处查看,发现udp连接较多,一访问网站,路由器发送了n多连接到dns服务器。比较奇怪的是我的路由器里dnsmasq等dns服务程序里没有配置运行商的dns服务器,但是在该界面里却出现大量的对运行商DNS的ipv4和ipv6请求。

出现了这种情况,定位问题还是比较困难的,排查了几天smartdns、dnsmasq、ssrplus软件。我用的机场是用的是ss和trojan协议。刚开始以为是ssrp程序对dns的处理有问题,所谓方向不对努力白费,在这方面ssrp是没有任何问题的。后来发现如果ssrp里面采用shadowsocks-rust代理就会出现该问题,把服务程序改为Xray就没有该问题。说明问题主要出在shadowsocks-rust问题上。

对shadowsocks-rust简单看了下,也没有发现有什么不对的。只好修改ssrp源码,在订阅时将ss改为xray格式进行代理,处理起来也比较简单。

解决办法一

local v2_ss = luci.sys.exec('type -t -p ss-redir sslocal') ~= "" and "ss" or "v2ray"
local v2_tj = luci.sys.exec('type -t -p trojan') ~= "" and "trojan" or "v2ray"

SSRP里面这两句是判断ssrp安装了什么代理工具就使用相应的代理工具程序,我们只需要对这两句进行修改就可以。
修改代码如下:

###########################修改使用xray代替ss、trojan####################################

sed -i '/Through proxy update list, Not Recommended/a \\no = s:option(Flag, "usexray", translate("SS、Trojan使用Xray代理"))' /usr/lib/lua/luci/model/cbi/shadowsocksr/servers.lua
sed -i '/Flag, "usexray"/a o.default = "0"' /usr/lib/lua/luci/model/cbi/shadowsocksr/servers.lua
sed -i '/Flag, "usexray"/a o.description = translate("SS、Trojan自动选择程序或强制Xray,选中确定后需更新订阅")' /usr/lib/lua/luci/model/cbi/shadowsocksr/servers.lua
sed -i '/Flag, "usexray"/a o.rmempty = false' /usr/lib/lua/luci/model/cbi/shadowsocksr/servers.lua

sed -i '/local v2_ss /d' /usr/share/shadowsocksr/subscribe.lua
sed -i '/local v2_tj /d' /usr/share/shadowsocksr/subscribe.lua
sed -i "/local save_words/a local isxray = ucic:get_first(name, 'server_subscribe', 'usexray', '0')" /usr/share/shadowsocksr/subscribe.lua
sed -i "/local isxray/a end" /usr/share/shadowsocksr/subscribe.lua
sed -i '/local isxray/a \ \tv2_tj = "v2ray"' /usr/share/shadowsocksr/subscribe.lua
sed -i '/local isxray/a \ \tv2_ss = "v2ray"' /usr/share/shadowsocksr/subscribe.lua
sed -i "/local isxray/a else" /usr/share/shadowsocksr/subscribe.lua
sed -i "/local isxray/a \ \tv2_tj = luci.sys.exec('type -t -p trojan') ~= \"\" and \"trojan\" or \"v2ray\"" /usr/share/shadowsocksr/subscribe.lua
sed -i "/local isxray/a \ \tv2_ss = luci.sys.exec('type -t -p ss-redir sslocal') ~= \"\" and \"ss\" or \"v2ray\"" /usr/share/shadowsocksr/subscribe.lua
sed -i "/local isxray/a if isxray == '0' then" /usr/share/shadowsocksr/subscribe.lua
sed -i "/local isxray/a local v2_ss, v2_tj" /usr/share/shadowsocksr/subscribe.lua

修改完成后增加了控制选项,需要用xray只需要在SSRP服务器节点里勾选 SS、Trojan使用Xray代理 即可。完成后图片如下:

SS导致本地DNS连接数暴涨

解决办法二

上面虽然用xray替换了ss-rust程序,但是xray对路由器资源的耗用量相对较高,不是完美的解决方法。偶然发现,在机场ss节点里是用的域名作为服务器地址,猜想路由器多出的对ISP运营商DNS请求可能与此有关。手工将ss节点里的域名地址换为IP地址,发现对ISP运营商DNS请求消失了,而且访问任何网站也不会再出现大量的对运行商DNS的ipv4和ipv6域名解析请求。由于不了解shadowsocks-rust源码,这一切估计是因为ss节点是域名的原因。猜测sslocal(ssrp里重定向到了ss-redir)程序用自带的dns模块对节点进行解析,他获取的是openwrt路由器/var/resolv.conf.d/resolv.conf.auto里的运营商DNS服务器地址,并用运营商DNS进行解析。ss节点使用ip地址,sslocal就不开启dns模块,自然也就不向运营商dns服务器发送解析请求。由于未抓包,Shadowsocks-rust开启dns模块后,不清楚shadowsocks-rust是对ss节点进行了解析还是对电脑访问的域名进行了解析。

知道了原因,修改一下ssrp的代码就可以处理,我们只需让ssrp生成配置文件时用解析的ip代替域名即可。
代码如下:

###########################ss软件用ip代替域名####################################
sed -i '/local json/a require "luci.sys"' /usr/share/shadowsocksr/gen_config.lua
sed -i '/local ss =/i local ssserver = luci.sys.exec("resolveip -4 -t 3 " .. server.server)' /usr/share/shadowsocksr/gen_config.lua
sed -i '/local ss =/i ssserver = ssserver:gsub("[\\r\\n]", "")' /usr/share/shadowsocksr/gen_config.lua
sed -i 's/"127.0.0.1" or server.server/"127.0.0.1" or ssserver/' /usr/share/shadowsocksr/gen_config.lua

修改后我们查看ss配置文件时候,server就变成了ip地址,对代理完全没有影响。这样我们就可以完全不使用方法一来解决。还是用shadowsocks-rust来代理,效果也是很不错的。

以上修改的代码在ssh里运行一次即可。

最后说明下,openwrt路由器的luci状态界面看活动连接数,该数字会不断上升的主要原因是luci的js不断发送刷新请求,导致连接数增加。当tcp连接释放后,活动连接数又开始下降,周而复返,类似薛定谔的猫。

技术不断升级,请注意文章时效性。
本站文章,欢迎转发。转载请注明出处:https://www.bandwh.com/net/1550.html

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注