我有一台通过wireguard 路由所有流量的服务器。当我启动wireguard时,侦听该服务器公共IP的所有端口都不可用 - 甚至ssh也不起作用。
我想要的是允许来自任何IP的端口(例如ssh)上的传入流量,但对任何传出连接使用wireguard。
例子:
MY_SERVER 到任何公共 IP -> 使用wireguard 对等点进行路由(其他服务器应将wireguard 对等点的IP 视为源)。这是通过AllowedIPs = 0.0.0.0/0
在wireguardconf中进行工作的。
MY_SERVER 的任何公共 IP -> 当启用wireguard 时,此功能不起作用。如果我停止wireguard它就会起作用。
有什么想法如何允许我的公共IP上的传入连接并通过wireguard路由传出连接吗?
更新:
主要问题是,由于wireguard 通过它路由所有数据包,我得到了非对称路由。因此,当给定端口的公共 IP 上的传入连接进入时,它的回复将通过 wg0 而不是公共接口进行路由,并且永远不会返回到客户端。
我能够通过添加来修复它ip rule add sport PORT table main
,但不确定是否有更好的修复,所以我不必一一添加所有端口 - 我希望我开始侦听的任何端口都能正确路由。此外,此修复适用于 TCP,但不适用于 UDP。如果我可以让它同时适用于两种协议,那就太好了。
您的路由表是无状态的,它们没有有关数据包作为答案或您的端口被绑定的任何信息。因此,您可以使用连接表在与服务器接口(而不是wireguard接口)建立连接时添加标记,然后为该连接的每个数据包恢复该标记。
然后您可以在路由规则中使用此标记:
或者如果你使用 nftables:
或者您可以通过在规则中列出端口来做到这一点,它可能会更干净。对于 UDP,您希望服务侦听单个 IP 地址(而不是 0.0.0.0),然后就
ip rule
应该可以工作。