yichya / luci-app-xray

(Almost) full feature Xray client for OpenWrt
Mozilla Public License 2.0
615 stars 547 forks source link

iptables规则屏蔽掉了 WAN 侧入站连接 #50

Open ttimasdf opened 3 years ago

ttimasdf commented 3 years ago

先前的issue已有讨论。 https://github.com/yichya/luci-app-xray/issues/20#issuecomment-842441190

对比 kuoruan/luci-app-v2ray 的 iptables 规则,主要区别在于,本项目将所有路由规则写在 mangles 链下,相比之下,v2ray 、OpenClash (印象里 shadowsocks 项目也是)等大部分类似的项目都将 TCP 的转发规则放到了 nat 链下面,我认为这个可能是问题所在。 但是原理我还是不懂

参考:

This table (NAT) is slightly different from the `filter' table, in that only the first packet of a new connection will traverse the table: the result of this traversal is then applied to all future packets in the same connection.

image


update: 不光是链不同,原理也不一样。其他项目用的是 REDIRECT ,本项目用的是 TPROXY。这东西文档和用例太少了……

ttimasdf commented 3 years ago

51 修复了一部分,但是通过 DNAT 实现的端口映射还是没有正确处理。具体表现为, SYN 包可以正常转发到达目标设备,但 SYN ACK 被 mangle 链中的规则拦截转发给 xray,然后估计被当成无效包丢弃了。

image

lialosiu commented 2 years ago

刚刚测试最新版的master分支编译,依然存在这个问题

我openwrt上运行了个vpn服务器,一启动xray,从wan入站的vpn连接就断了

但是我发现在bypass上添加wan端的ip后,那个ip过来的包就可以正常入站了,感觉是因为入站流量被重定向了?

不太熟iptables,特别是tproxy,完全不知道怎么整... 看了半天防火墙规则,没看懂,加了bypass之后好像是在ipset里面加了个对应的ip,然后iptables匹配上之后直接return了。难道是wan进来的流量也被重定向到xray去处理了?


卧槽我才发现这个pr没有合并进来🤣 晚点我把这个pr拿下来再编译一个试试(

yichya commented 2 years ago

刚刚测试最新版的master分支编译,依然存在这个问题

确实,还没修

我openwrt上运行了个vpn服务器,一启动xray,从wan入站的vpn连接就断了

但是我发现在bypass上添加wan端的ip后,那个ip过来的包就可以正常入站了,感觉是因为入站流量被重定向了?

这么做确实能绕过这个问题,但其实比较建议写一个匹配设备和端口的规则 return,或者 cherry-pick 一下 #51

不太熟iptables,特别是tproxy,完全不知道怎么整... 看了半天防火墙规则,没看懂,加了bypass之后好像是在ipset里面加了个对应的ip,然后iptables匹配上之后直接return了。难道是wan进来的流量也被重定向到xray去处理了?

tproxy 用的是 mangle 表,mangle 确实是这样的,原理其实我也不是完全理解(

lialosiu commented 2 years ago

周末研究下看看,资料好少啊😂

ttimasdf commented 2 years ago

看了一遍 tproxy 和 connmark 的原理,把规则完全重写了一遍。测试了一下,非常稳定,端口转发也不丢包了。

参见:#194

ttimasdf commented 2 years ago

一些有用的参考资料:

iptables - What is the purpose of TPROXY, how should you use it and what happens internally? - Server Fault

TProxy 探秘 – (o・∇・o)

透明代理 UDP 为什么要用 TProxy? - 简书

Transparent proxy - shadowsocks-libev/README.md at master · shadowsocks/shadowsocks-libev

透明代理(TPROXY) | 新 V2Ray 白话文指南

ctrysbita commented 9 months ago

@yichya hi, has this issue been resolved?

wingerted commented 9 months ago

@yichya how to fix this? is there any workaround ?

ttimasdf commented 8 months ago

For anyone still affected by this issue, you can checkout my fork (https://github.com/ttimasdf/luci-app-xray/releases) which completely rewrites the firewall generation code for clarity and also addresses this bug.