xiaorouji / openwrt-passwall

7.21k stars 2.65k forks source link

[Bug]: 在使用 nft 规则时,TCP 转发端口设置为所有端口,导致 xray 进程异常占用内存及 CPU #2132

Closed EdiTurn closed 2 years ago

EdiTurn commented 2 years ago

描述您遇到的bug

luci-app-passwall 版本为 4.55,源码来源于 immortalwrt 仓库,编译时仅选择 nftables 规则。 当TCP 转发端口设置为所有,设备的CPU或内存会被 xray 进程快速占满。

在3台设备(一台 r2s,两台 x86)上都复现了问题,其中: 在 r2s (1G RAM)上,内存会在约半分钟内占满,并导致设备卡死。 48a538c64807cb3556b3b1ad4fe755f2

在一台 x86 (2G RAM)上,内存会在升高到一定水平后回落,然后反复重新上涨: image

在另一台 x86 (4G RAM)上,内存会在增长到一定程度后(占用约40+%)回落并稳定在一个稍高的水准上,随后其中一个进程大量占用CPU image_2022-10-10_13-44-18

复现此Bug的步骤

  1. 在 passwall - 高级设置中,将TCP 代理端口设置为所有并提交
  2. 制造一些流量,比如点击 passwall 首页的连接检测即可
  3. 观察 CPU 或内存占用

您想要实现的目的

代理所有端口功能正常工作

日志信息

2022-10-10 14:37:23: 删除相关防火墙规则完成。 2022-10-10 14:37:25: 清空并关闭相关程序和缓存完成。 2022-10-10 14:37:25: 分析 Socks 服务的节点配置... 2022-10-10 14:37:25: - Socks节点:domain,启动 0.0.0.0:8089 2022-10-10 14:37:25: 检测fw4防火墙,使用nftables进行透明代理,一些不支持nftables的组件如smartdns分流等将不可用。 2022-10-10 14:37:26: TCP节点:domain,监听端口:1041 2022-10-10 14:37:26: 过滤服务配置:准备接管域名解析... 2022-10-10 14:37:26: - 域名解析:dns2tcp + 使用(TCP节点)解析域名... 2022-10-10 14:37:26: * 请确认上游 DNS 支持 TCP 查询,如非直连地址,确保 TCP 代理打开,并且已经正确转发! 2022-10-10 14:37:27: - PassWall必须依赖于Dnsmasq,如果你自行配置了错误的DNS流程,将会导致域名(直连/代理域名)分流失效!!! 2022-10-10 14:37:27: 开始加载防火墙规则... 2022-10-10 14:37:33: 加入负载均衡的节点到ipset[vpsiplist]直连完成 2022-10-10 14:37:33: 加入所有节点到ipset[vpsiplist]直连完成 2022-10-10 14:37:34: 加载路由器自身 TCP 代理... 2022-10-10 14:37:34: - [0]将上游 DNS 服务器 1.1.1.1:53 加入到路由器自身代理的 TCP 转发链 2022-10-10 14:37:34: - [0],屏蔽代理UDP 端口:80,443 2022-10-10 14:37:34: 加载路由器自身 UDP 代理... 2022-10-10 14:37:34: 访问控制: DELETED 2022-10-10 14:37:40: 防火墙规则加载完成! 2022-10-10 14:37:42: 重启 dnsmasq 服务 2022-10-10 14:37:42: 配置定时任务:自动更新规则。 2022-10-10 14:37:43: 运行完成!

系统相关信息

Passwall 版本:4.55

其他信息

已尝试恢复 passwall 默认配置,将 TCP 转发端口设置为所有端口,TCP 节点选择 xray 分流总节点,默认选择直连,上述问题仍然存在。 已尝试使用 immortalwrt 默认配置且仅选中 passwall 编译 x86 固件,测试中问题仍然存在。

ShanStone commented 2 years ago

fixed

ShanStone commented 2 years ago

如果是直接从本源码编译的,只编译安装ipk,请尝试使用清除ipset功能,或重启设备,以便psw重新生成临时文件,然后再看看问题有没有复现。如果是immoralwrt源码请同步最新源码编译,然后按照上述操作再看看有没有复现

在 2022年10月11日,11:46,EdiTurn @.***> 写道:



我是在 immortalwrt 目前的 master 源码下遇到的这个问题。 今天单独编译了 passwall 的 ipk 安装试了下,CPU及内存占用的问题仍然存在,且观察到的现象未有变化。隔壁 tproxy 下路由器自身代理的问题确认已经修复。

— Reply to this email directly, view it on GitHubhttps://github.com/xiaorouji/openwrt-passwall/issues/2132#issuecomment-1274047897, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AHSXQJQD3BIN5RAXC4TJOJTWCTPI3ANCNFSM6AAAAAARBBYA7A. You are receiving this because you modified the open/close state.Message ID: @.***>

EdiTurn commented 2 years ago

因为昨天评论发布后在不同的设备上获得了不同的结果,所以删掉评论进行了更多的测试。 大概说一下问题出现的原因: 我在 53 端口上部署了 AdGuardHome,其上游为本机 dnsmasq。同时节点填写的是服务器域名。 passwall 服务重启时 nftset vpsiplist 被清空,而 AdGuardHome 有时会直接返回缓存中的节点 IP 而不转发到 dnsmasq,因此造成节点 IP 被延迟写入 vpsiplist。而当 TCP 转发端口中包含节点所使用的端口时,就会导致以上问题。 不知能否直接在 filter_vpsip 函数中先查询一遍节点 IP 并写入 vpsiplist?

(让我疑惑的是:若使用 iptables,即便 ipset vpsiplist 始终为空,上述问题也不会出现。)

另外提交一个在测试中发现的问题: iptables 中使用 ":" 表示端口段,而 nftables 则使用 "-",因此目前自定义端口段在切换防火墙时不能兼容。

Coolkids commented 2 years ago

使用最新代码长时间测试了一下。有几个问题

  1. 使用nftables+redirect 用chnroute模式 总分流节点 代理常用端口 所有流量都会走xray,连接数暴涨到3万多 在节点日志中可以看到大量连接。
  2. 用nftables+tproxy 其他条件同上,没连接数暴涨的问题 但是会影响网络,具体表现在很多app加载速度变慢,甚至无法加载特别是斗鱼。

我的上游dns是mosdns并开启了广告过滤。使用传统的iptables+redirect模式没有问题,各功能正常。

ShanStone commented 2 years ago

使用最新代码长时间测试了一下。有几个问题

  1. 使用nftables+redirect 用chnroute模式 总分流节点 代理常用端口 所有流量都会走xray,连接数暴涨到3万多 在节点日志中可以看到大量连接。
  2. 用nftables+tproxy 其他条件同上,没连接数暴涨的问题 但是会影响网络,具体表现在很多app加载速度变慢,甚至无法加载特别是斗鱼。

我的上游dns是mosdns并开启了广告过滤。使用传统的iptables+redirect模式没有问题,各功能正常。

试一下最新源码,已尝试优化。 斗鱼cdn相关域名在白名单内,dnsmasq+nftset资源消耗似乎比dnsmasq+ipset大,在一些性能比较弱的机子上可能会遇到性能问题。即使只配置ipv4,在遇到如斗鱼等大量查询域名的情况下会导致dnsmasq吃满单核cpu,加载速度变慢。建议在一些单核性能较弱的机子上使用iptables模式,体验会好一些。