解决WireGuard网关中SSH TCP SYN被错误转发至wg0接口导致连接超时的iptables规则配置求助
嘿,我来帮你搞定这个问题!你的核心痛点是来自ino1接口的SSH(TCP 22端口)流量被WireGuard的转发规则错误导向了wg0,导致无法收到SYN-ACK进而超时。我们可以通过给iptables添加优先级更高的规则,让SSH流量绕过WireGuard的转发逻辑,同时完全不影响WireGuard的UDP流量(毕竟WG本身就是基于UDP的)。
下面是具体的操作步骤,我会一步步解释清楚:
1. 优先放行ino1接口的SSH流量到本地
如果你是直接连接这个WireGuard网关的SSH服务(也就是目标IP是网关自身),我们需要在INPUT链最前面添加规则,让来自ino1的SSH流量直接被本地处理,不会走到后续的转发规则:
# 允许来自ino1接口的TCP 22端口流量进入本地INPUT链 iptables -I INPUT 1 -i ino1 -p tcp --dport 22 -j ACCEPT
这里用-I INPUT 1是把这条规则插入到INPUT链的第一个位置,确保它比WireGuard的转发规则先匹配。
2. 防止SSH流量被NAT转发到wg0(如果你的WG用了NAT)
如果你的WireGuard配置里做了NAT转发(比如POSTROUTING链的MASQUERADE),还需要在nat表的PREROUTING链里拦截SSH流量,避免它被转发到wg0:
# 拦截来自ino1的SSH流量,不让它被NAT转发到wg0 iptables -t nat -I PREROUTING 1 -i ino1 -p tcp --dport 22 -j ACCEPT
3. 确保WireGuard的UDP流量不受影响
为了避免误操作影响WG的正常运行,我们可以明确放行WG的UDP流量(默认端口是51820,如果你的端口不一样,记得替换):
# 允许WG端口的UDP流量进入本地 iptables -A INPUT -p udp --dport 51820 -j ACCEPT # 允许WG接口的转发流量双向通行 iptables -A FORWARD -i wg0 -j ACCEPT iptables -A FORWARD -o wg0 -j ACCEPT
4. (可选)添加策略路由确保响应流量从ino1返回
如果你的网关默认路由是走wg0的,可能会出现SSH的响应流量从wg0出去,导致连接还是异常。这时候需要添加策略路由,让来自ino1的流量响应原路返回:
# 添加自定义路由表100,指定来自ino1 IP的流量走ino1网关 ip rule add from <你的ino1接口IP> table 100 ip route add default via <ino1接口的网关IP> dev ino1 table 100
记得把<你的ino1接口IP>和<ino1接口的网关IP>替换成你实际的地址。
最后:保存iptables规则避免重启丢失
配置完成后,一定要保存规则,不然重启网关后就失效了:
- Debian/Ubuntu系:
iptables-save > /etc/iptables/rules.v4 - RHEL/CentOS系:
service iptables save
这样配置后,SSH流量会被优先处理,不会被WireGuard转发,同时WG的UDP流量依然正常工作,完美解决你的问题!
备注:内容来源于stack exchange,提问作者J.Valášek

