一个头疼的问题,路由器端口转发,挂了 singbox 透明代理无法连接

2 天前
 vfx666
内网一台软路由( 192.168.1.222 )开启了 singbox 的 tun 模式做旁路由。内网 ps5 将网关手动设为了 singbox ,主路由( 192.168.1.1 )将端口转发设置到 ps5 的 ip ,在公网尝试连接 ps5 不成功。singbox 关闭后可以正常连通,问题可能出在 ps5 在返回流量时经过了旁路由的虚拟网卡出现问题。
但 singbox 即使开启了最详细级别的日志,也看不到来自 ps5 的流量记录。用 tcpdump 能看到流量确实经过了 tun 网卡。
请教大神,这种情况应该如何设置呢
798 次点击
所在节点    宽带症候群
22 条回复
povsister
2 天前
因为路由不对称,普通家用路由器的 tcp 是需要看到双向的数据报文才会被 conn-track 到。
在你的配置下

TCP inbound (发送 SYN ):WAN 访问 - 主路由(Port forwarding ,可以认为是 DNAT+SNAT)- PS5
TCP outbound (回复 SYN ACK ):PS5 -(这里就直接当 invalid 丢了)- 旁路由( SNAT )- 主路由

旁路由连 TCP SYN 都看不到,你回复一个 SYN ACK 被旁路由的 SNAT netfilter 看到,只会当你设备抽风直接丢包。
sb 看不到是因为报文在协议栈就直接丢了,压根没进入 sb 的处理。
vfx666
2 天前
@povsister 专业啊大佬。所以这种情况下有什么解决方案吗,我主路由是 linksys ,没啥可改动的,能不能在旁路由上设置点啥
whetherTsmile
2 天前
@vfx666 #2 旁路由防火墙里有一个丢弃无效数据包给关了试试
povsister
2 天前
@vfx666
我细想了想,port forwarding 应该是可以用的,不对称路由影响的应该是 DNAT ,你先试试用端口转发吧。
另外建议别折腾一个子网里两个网关这种模式了,老老实实用单臂路由不好吗
basncy
2 天前
ingress 要看主路由, 少部分企业路由器会做 SNAT.
whetherTsmile #3 可能是正解. sb 感觉它很强大, 但都集成了个半吊子.
旁路由建议手搓 REDIRECT/TPROXY, 门槛可能高, 但灵活, 还能代理部分 BT 流量.
vfx666
2 天前
@povsister 现在这样子,端口转发确实联不通啊
搞旁路由就是为了给 ps5 做加速,不然的话怎么解决 ps5 爬墙问题
vfx666
2 天前
是 iptable 里的吗
vfx666
2 天前
@povsister 我这个路由器貌似没法配置单臂吧。。。
povsister
2 天前
@basncy
我同意#5 的话,sb 看起来很强大但实际上体验上是个半吊子。真要考虑网关方案不如自己手搓 TPROXY+路由表转发。
唉,但不懂点网络知识的根本不适合玩旁路由。而且,一堆乱七八糟的教程确实坑了不少人。

@vfx666
给你推荐下我自用的方案吧,网关 TPROXY 方案,纯粹单臂路由不侵入拓扑,全真 IP 。主路由分流,黑白名单随喜好配置,可以在主路由上一键排除/强制某个内网 IP 直连/代理。
缺点就是,你的 linksys 可能只能当个 AP 用了,这个方案要的这些特性现阶段 linksys 应该无法满足。
https://github.com/povsister/v2ray-core
vfx666
2 天前
@povsister 我日……你这方案有点意思……想不到一个旁路由都能玩出花来
morpheuszero2023
1 天前
有些问题解决的学习成本和时间消耗过高了。如果你只是想让 PS5 流畅的联机游戏,可以买内置 UU 加速器的路由器,例如华硕的一些型号。华硕和软路由( OP )也可以通过插件实现魔法冲浪。这些方案都是只有一个网关的,部署起来非常简单。
life90
1 天前
@povsister 我看了你这个方案,我猜果然会有这个问题 ”体感首次访问某个被墙站点时,有 30-40%的概率会出现 ConnectionRST , 随后只需要刷新一下页面即可正常访问。“
我觉得解决这个问题的方法可以试一试把 conn-track 规则时间延长一点(对个人来说影响不大)。然后你这个好像没有支持 ipv6 。
你没有采用 mark-routing (标记路由) mark-connection/packet 等方式,真是明智。这个策略开起来多了,非常影响转发性能。路由器配置不高的话,一个迅雷开起来能把 cpu 干冒烟。
povsister
1 天前
@life90
ipv6 短期内没有支持的打算。
OSPFv2 和 v3 是需要独立运行两个实例的,而且属于不同的 RFC 。要支持的话得我再手写 v3 的库才可以,目前是手搓简单版本 v2 的,等有空开源成单独的 go-ospfd 再考虑 v3 支持。

目前我自己已经把动态规则的时间延长到了 48h ,常态生效条目 1500 条左右。不过这个是可配置条目,你可以根据自己的旁路由配置和主路由配置自行调整。过多的代价基本就是内存占用会高,ros 本身路由查询开销基本可以忽略。

ROS 官方硬件只有在开启 fasttrack 的情况下性能还算不错,但是 ft 和 mangle mark-routing/packet 是冲突的。
家用环境 99.9%情况下不需要 mark-routing ,唯一有点价值的就是 QoS:标记 wan 流量走 QueueTree 。
我玩了一阵子,家用旗舰 RB5009 ,千兆跑 mark packet ,经常 pt 下载时候干满 cpu 。后来索性开摆,下行不做 QoS ,上行只在 wan interface 上挂了个 CAKE 流控,然后一下就好起来了,打游戏满速下载也不跳 ping ,非常省事。
life90
1 天前
@povsister 对,开启 fasttrack ,许多规则条目会失效,但是官方默认还是开启了。也不知为何?可能觉得家用不会搞这些。上行做流控,确实是最优解。但运营商的上行经常是变化的,起码要设置 20% 的余量。不然上行被拉满也是会卡的。你是 cake 配合 Queue Tree 做的流控,还是只做了 Simple Queue 。
好像有点问多了,脱离主题了。不过能遇到你,也算是幸运。mikrotik ros 现在玩的少了。看起来可定制性强,但操作起来要了解很多知识。如果只知其一,很容易搞崩了。我就这么一路崩过来的。后来发现既然同是 Linux ,我为什么不直接玩 Linux 。而且我觉得维护起来比它方便,可能是 mikrotik 教会了很多我 Linux 下的 iptable 操作。
povsister
1 天前
@life90
你需要了解 ft 的本质,它本质上是对已经进入 stateful tracking 的连接 bypass 一些处理流程,并不是“ft 开启后很多规则会失效”。实际上,只要你不过多依赖 mangle 表,ft 其实是非常优秀的 offload 手段。默认开启的话我觉得是没问题的。

我这边电信上行给的很足,按实际签约的 120%容量做的上行流控,做法是使用 interface queueTree ,FT 开启的情况下会 bypass simple queue 和 global queue ,但不会和 interface queue 冲突,所以你只需要在 wan 口开启 interface queue ,类型选 queueTree ,算法 CAKE 然后配置一下 nat=on ,rtt 50ms ,diffsrev4 ,类型 dual srchost ,然后再开一下 ACK filter 就可以了,非常简单好用。
yinmin
1 天前
解决方法很简单:192.168.1.1 将端口转发到 192.168.1.222 ,然后 192.168.1.222 转发到 ps5 。192.168.1.222 的 iptable 转发端口的写法可以问 gpt 。
yyysuo
1 天前
@life90 这种体验怎么忍受的…..
yyysuo
1 天前
@yinmin 他应该有现成的配合 tun 的 ipt 或者 nft 吧,也应该有现成的 bypass 内网段的规则,也应该开了 ipv4 转发,是不是直接改成转发到 sb 机就可以了
yinmin
1 天前
@vfx666 ,试试:

假设 ps5 的 ip:192.168.1.230 ,要映射的 TCP 端口是 1000 。主路由先将 tcp 1000 端口转发到 192.168.1.222:1000 ,然后在 192.168.1.222 上配置以下 2 句 iptables ,将 tcp 1000 转发到 ps5 192.168.1.230:1000

iptables -t nat -A PREROUTING -p tcp -d 192.168.1.222 --dport 1000 -j DNAT --to-destination 192.168.1.230:1000
iptables -t nat -A POSTROUTING -p tcp --dport 1000 -d 192.168.1.230 -j MASQUERADE
vfx666
14 小时 11 分钟前
@yinmin 这个方法确实可以走的通,不过我是用的 socat ,你这个我没试,而且 socat 在旁路由上不行,找了另一个内网设备才可以的。
我最终的解决方案是用 homeproxy ,在代理端口中把 ps5 的排除掉就可以了。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1073467

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX