由于需要外部备份,我已通过 OpenVPN 将我的家与我的工作场所连接起来。连接运行良好。在工作场所我有 5 个固定 IP 地址。现在我想分配其中一个 IP 地址转发到我的家用机器。我已经使用 tcpdump 确认数据包已到达我的家用机器。
问题是我家里的默认路由不是 tun0(自然如此),而是我自己的 ISP 的 eth0。因此我创建了一个单独的路由表来将我的 tun0 数据包路由回它们所属的位置,但不知道如何使用 iptables 标记通过 tun0 到达的传入数据包,以便我可以将它们驱回。
我不希望有任何端口限制,但只有来自 tun0 的内容才应通过 tun0 离开。
答案1
这不是用 iptables 标记数据包的问题,而是使用两个不同的路由表的问题。您需要这样做是因为您将有两个默认网关,而这只有在您有两个完全不同的路由表并且有适当的规则定义何时应用每个路由表时才有可能。
建立双路由表系统的正常步骤如下:
首先,创建两个表(将 NAME1 和 NAME2 替换为对您有意义的名称,例如 IP1、DEV1 等):
echo 200 <NAME1> >> /etc/iproute2/rt_tables
echo 201 <NAME2> >> /etc/iproute2/rt_tables
向每个路由表添加一个网关(如果需要):
ip route add <NET1> dev <DEV1> src <SRC1> table <NAME1>
ip route add <NET2> dev <DEV2> src <SRC2> table <NAME2>
然后是默认路由:
ip route add default via <IP1> table <NAME1>
ip route add default via <IP2> table <NAME2>
然后根据源地址选择路由表的规则:
ip rule add from <IP1> table <NAME1>
ip rule add from <IP2> table <NAME2>
就您而言,这甚至更简单,因为启动 VPN 会自动为您设置主路由表,您只需为其他路由表执行此操作即可。在上述规则中,IP1 应为 tun/tap 接口的 IP 地址,IP2 应为其他接口(可能是 eth0 或 wlan0,或其他)的 IP 地址。
对于从你的电脑启动连接的其他应用程序,你只需要绑定将它们连接到任一 NIC。
编辑:
现在我看到了您尝试实现的设置的图片,我发现我上面提出的解决方案不正确,因为您不希望所有流量都通过 VPN 路由,而只希望其他 LAN 的流量通过 VPN 路由。这是更容易。
忘记关于两个路由表和策略路由的一切。删除第二个路由表。启动 VPN,确保客户端和服务器均不包含包含以下字词的语句重定向网关 df1。然后,在您的家庭服务器上,以 sudo 身份发出以下命令:
ip route add 192.168.57.0/24 via 192.168.162.5
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
在工作路由器上,再次以 sudo 形式发出以下两个命令:
ip route add 192.168.112.0/24 via 192.168.162.9
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
大写字母(若有)是必需的。