通过 wireguard 接口将所有传入流量重新路由到我的家用电脑

通过 wireguard 接口将所有传入流量重新路由到我的家用电脑

我在 AWS 中设置了一个服务器,并在其上安装了 WireGuard 服务器。我配置了服务器和客户端,并且 VPN 连接已启动并正在运行。我可以从本地计算机 ping 到服务器地址 (192.168.45.1),也可以从服务器 ping 到我的家用计算机(从服务器 ping 到 192.168.45.2)。因此,基本连接反之亦然。我通过 Wireguard VPN 路由 0.0.0.0(本地网络除外)确认了 VPN 的运行,并且运行成功:IP 检查显示了 AWS 云的 IP。

其次,我需要能够在我的 AWS 实例上接收传入连接,并且需要将其路由到我的家用计算机。由于服务器和我的家用计算机之间有一个 Wireguard 隧道,因此只能将本地流量从 eth0(服务器主传入以太网卡(不用于其他任何用途))转发到 wireguard 接口 (wg0)。而且由于目标 IP 发生变化,我必须使用 (D)NAT。

因此我使用 sysctl 配置了 Linux 内核:

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

然后我开始在我的 AWS 实例上配置 iptables,其中 172.31.5.46 是我的 AWS 服务器的 eth0 IP,192.168.45.2 是我的家用计算机的 IP:

# iptables -F
# iptables -t nat -A PREROUTING -p tcp -d 172.31.5.46 --dport 3000 -jDNAT --to-destination 192.168.45.2:3000
# iptables -t nat -A PREROUTING -p tcp -d 172.31.5.46 --dport 22 -jDNAT --to-destination 192.168.45.2:22
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

在我家里的电脑上,我正在运行一个名为“简单 TCP 监听器”的工具,它可以显示何时通过特定端口连接到我的电脑。

当我从互联网上的某个端点连接到我的 AWS 实例的公共 IP 时,它会被重定向到我的计算机,并且我的 TCP 侦听器会显示传入连接。但出于某种原因,它总是通过端口 3000 进入我的家用计算机。因此,使用上述设置,AWS 上的端口 22 现在转发到端口 3000,而端口 3000 向外界发出“连接被拒绝”信息。这意味着我的配置或知识中缺少了一些小东西。那是什么小东西?

答案1

我今天了解到,规则只是被堆积起来,而不是被覆盖:

使用以下命令查看 NAT 条目时,我发现所有执行的 NAT 规则都没有覆盖之前的规则,而只是附加到 NAT 规则列表中,最终得到一个充满错误条目的列表。我通过刷新 iptables 发现了这一点,并注意到端口 22 仍在转发。

iptables -t nat -L

因此也用来清理 iptables 的 NAT 规则链:

iptables -F -t nat

然后我的上述设置就可以正常工作了。端口 22 的请求被转发到我家用电脑的端口 22,端口 3000 的请求被转发到端口 3000。

相关内容