我有一台服务器,它通过 wireguard 路由所有流量。当我启动 wireguard 时,监听此服务器公共 IP 的所有端口都不可用 - 甚至 ssh 也不起作用。
我想要的是允许来自任何 IP 的端口(例如 ssh)上的传入流量,但对任何传出连接使用 wireguard。
例子:
AllowedIPs = 0.0.0.0/0
MY_SERVER 到任何公共 IP -> 使用 wireguard 对等体进行路由(其他服务器应将 wireguard 对等体的 IP 视为源)。这通过在 wireguard conf 中实现。
任何公共 IP 到 MY_SERVER -> 启用 wireguard 后,此功能不起作用。如果我停止 wireguard,它就可以正常工作。
有什么想法我该如何允许我的公共 IP 上的传入连接并通过 wireguard 路由传出连接?
更新:
主要问题是,由于 wireguard 将所有数据包都通过它进行路由,导致我获得了不对称路由。因此,当给定端口的公共 IP 上的传入连接进入时,其回复将通过 wg0 而不是公共接口进行路由,并且永远不会返回到客户端。
我可以通过添加来修复它ip rule add sport PORT table main
,但不确定是否有更好的修复方法,这样我就不必逐个添加所有端口 - 我希望我开始监听的任何端口都能正确路由。此外,此修复适用于 TCP,但不适用于 UDP。如果我能让它适用于这两种协议,那就太好了。
答案1
您的路由表是无状态的,它们没有关于数据包是答案或您的端口被绑定的任何信息。因此,当与服务器接口(不是 wireguard 接口)建立连接时,您可以使用连接表添加标记,然后为该连接的每个数据包恢复此标记。
然后您可以在路由规则中使用此标记:
iptables -t mangle -A PREROUTING -d <server_address> -m conntrack --ctstate NEW -j CONNMARK --set-mark 51820
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
ip rule add fwmark 51820 table main
或者如果你使用 nftables:
nft add rule ip mangle prerouting ip daddr <server_address> meta mark set 51820
nft add rule ip mangle prerouting meta mark 51820 ct mark set mark
nft add rule filter output meta mark set ct mark
ip rule add fwmark 51820 table main
或者,您也可以通过在规则中列出端口来实现,这样可能更简洁。对于 UDP,您希望服务侦听单个 IP 地址(而不是 0.0.0.0),然后应该可以ip rule
正常工作。