关于 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
Uh oh!
There was an error while loading. Please reload this page.
-
自从白话文推出 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