关于 TPROXY 透明代理使 V2Ray 占满 CPU 问题的研究 #505
ToutyRater
started this conversation in
General
Replies: 2 comments 1 reply
-
Beta Was this translation helpful? Give feedback.
1 reply
-
emmmm,早年sstap也有这个问题,猜测是你用了路由表的缘故? |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
自从白话文推出 TPROXY 模式的透明代理之后,曾看到多位网友反映 V2Ray 占用了大量 CPU,另有人指出这是 iptables 的 PREROUTING 链缺失
iptables -t mangle -A V2RAY -j RETURN -m mark --mark 0xff
规则。我对此感到很奇怪,因为我使用了一年多的 TPROXY 透明代理,始终没有遇到这个问题,甚至有时在怀疑是不是网友配置跟教程有差异导致出问题。后来看到有好多人出现几乎一样的问题,越发觉得这不是偶然,应该有特定的因素导致,但是我一直无法复现,也搞不出个结果。然后仔细研究,终于从 v2ray/v2ray-core#2621 , v2ray/v2ray-core#2549 , v2ray/v2ray-core#2461 发现了关键,占用大量 CPU 的问题是由于 DNS 的 PRT 查询导致的。
由于 V2Ray 的 DNS 可以使用 dlc 进行分流,几乎跟 routing 规则进行复用,使用 V2Ray DNS 相比使用第三方 DNS 减少对域名列表的维护。因此教程中直接使用了 V2Ray 作为 DNS 服务器。但是:
以上几点任何一点不满足都不会出现 V2Ray 占用大量 CPU 的问题。
先贴一下当时有问题的 iptables 规则。
因此,当有设备查询非 A 和 AAAA DNS 时,iptables 劫持发给 V2Ray,V2Ray 无法处理只能转发至 dokodemo 指定的服务器,但是这个 dokodemo 是透明代理用的,没有指定转发的地址,然后 V2Ray 只能识别到是透明网关本机的地址(假设是192.168.1.5),然后 V2Ray 就把 DNS 查询的包发往 192.168.1.5:53,虽然在 OUTPUT 根据
iptables -t mangle -A V2RAY_MASK -j RETURN -m mark --mark 0xff
直接发出去了,但由于是发给自己,下一时刻就进入到了 自己的 PREROUTING 链,由于 PREROUTING 链没有处理有标记的包,还把 53 端口的 UDP 包劫持给了 V2Ray。就这样进入了死循环,占用了大量 CPU。虽然说现在教程已加上了
iptables -t mangle -A V2RAY -j RETURN -m mark --mark 0xff
,不会有此类问题,后续我还是打算修改教程,把 2、3 点也给规避掉。Beta Was this translation helpful? Give feedback.
All reactions