通过iptables转发后保留原有IP

通过iptables转发后保留原有IP

编辑:我在 Medium 上发表了一篇关于我如何做这些事情的文章:关联

我一直在尝试使用 wireguard VPN 将流量从具有公共 IP 的 VPS 转发到我的家庭服务器(位于 CGNAT 后面)。我想转发 ssh、minecraft 服务器 (25565) 和 minecraft bedrock 服务器 (19132) 的流量。它似乎可以正确使用以下设置:

Wireguard 配置(VPS):

[Interface]
PrivateKey = (redacted)

PostUp = iptables -t nat -A PREROUTING -p tcp --dport 555 -j DNAT --to-destination 192.168.4.2:22
PostUp = iptables -t nat -A PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 192.168.4.2:25565
PostUp = iptables -t nat -A PREROUTING -p udp --dport 19132 -j DNAT --to-destination 192.168.4.2:19132
PostUp = iptables -t nat -A POSTROUTING -j MASQUERADE


PostDown = iptables -t nat -D PREROUTING -p tcp --dport 555 -j DNAT --to-destination 192.168.4.2:22
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 192.168.4.2:25565
PostDown = iptables -t nat -D PREROUTING -p udp --dport 19132 -j DNAT --to-destination 192.168.4.2:19132
PostDown = iptables -t nat -D POSTROUTING -j MASQUERADE

ListenPort = 51820
Address = 192.168.4.1

[Peer]
PublicKey = (redacted)
AllowedIPs = 192.168.4.2

Wireguard 配置(主服务器):

[Interface]
PrivateKey = (redacted)
Address = 192.168.4.2


[Peer]
PublicKey = (redacted)
AllowedIPs = 192.168.4.1
Endpoint = (redacted):51820
PersistentKeepalive = 25

当我连接到我的服务器或登录 ssh 时,它说我正在从 VPN(192.168.4.1)连接,这很合理,但是有没有办法保留原始 IP?这很有用,因为我可以在 Minecraft 服务器上禁止玩家使用 IP,并在几次尝试失败后阻止 ssh 上的 IP。

编辑更新和更新的配置

VPS 配置:

[Interface]
PrivateKey = (redacted)

PostUp = iptables -t nat -A PREROUTING -p tcp --dport 555 -j DNAT --to-destination 10.20.4.2:22
PostUp = iptables -t nat -A PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 10.20.4.2:25565
PostUp = iptables -t nat -A PREROUTING -p udp --dport 19132 -j DNAT --to-destination 10.20.4.2:19132
PostUp = iptables -t nat -A POSTROUTING -s 10.20.4.2 -j MASQUERADE

PostDown = iptables -t nat -D PREROUTING -p tcp --dport 555 -j DNAT --to-destination 10.20.4.2:22
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 10.20.4.2:25565
PostDown = iptables -t nat -D PREROUTING -p udp --dport 19132 -j DNAT --to-destination 10.20.4.2:19132
PostDown = iptables -t nat -D POSTROUTING -s 10.20.4.2 -j MASQUERADE

ListenPort = 51820
Address = 10.20.4.1

[Peer]
PublicKey = (redacted)
AllowedIPs = 0.0.0.0/0

这是家庭服务器的配置:

[Interface]
PrivateKey = (redacted)
Address = 10.20.4.2
Table = 1

PostUp = ip -4 rule add pref 500 from 10.20.4.2 lookup 1
PostDown = ip -4 rule del pref 500

[Peer]
PublicKey = (redacted)
AllowedIPs = 0.0.0.0
Endpoint = (redacted):51820
PersistentKeepalive = 25

IP地址:

10.20.4.1 - VPS

10.20.4.2 - 主服务器

答案1

源地址根据规则改变MASQUERADE。这是 MASQUERADE 的重点,但它不应该被如此广泛地应用。

您需要限制规则,使其仅适用于从家庭服务器发出到互联网的数据包,而不适用于相反的情况。(您可以通过使用接口-i wg0和/或-o eth0和/或通过源地址来限制这一点-s 192.168.4.0/24。)

现在家庭服务器的 WireGuard 配置也必须接受通过将其 [Peer] AllowedIPs 更改为 ,可以拦截来自 VPN 服务器的具有任何源 IP 地址的数据包0.0.0.0/0

当使用 wg-quick 设置 WireGuard 时,它会自动根据 AllowedIPs 生成路由,因此之前的更改也会导致全部您的家庭服务器的网络流量必须通过隧道。为了避免这种情况,您还可以off在客户端上将 [接口] 表设置为。

然而,主服务器仍然需要发送一些通过 VPN 传输流量——如果 wg-quick 被告知不要添加任何路由,那么主服务器将通过 VPN 接收数据包,但仍会直接通过 Internet 连接响应它们。这可以使用策略路由来解决,首先将 WireGuard 隧道的 [Interface] 表设置为实际表号(1没问题),然后运行命令

PostUp = ip -4 rule add pref 500 from 192.168.4.2 lookup 1
PostDown = ip -4 rule del pref 500

这样只有来自 192.168.4.2 的回复数据包才会使用表 1 中 wg-quick 设置的路由,而其他不相关的数据包则不会。

相关内容