使用 IPTables 将传入 eth1(本地)的端口转发到传出 ppp0(vpn)到特定的 ip 地址

使用 IPTables 将传入 eth1(本地)的端口转发到传出 ppp0(vpn)到特定的 ip 地址

因此我在 ppp0 上有一个 VPN,并且我进行了设置,因此我可以使用 ppp0 或 eth1 来连接,默认路由是 eth1。

两者都回复“ping google.com”(使用 eth1)和“ping -I ppp0 google.com”(使用 VPN)

目标:如果我连接到端口 12345 上的 eth1,它将把 pp​​p0 转发到特定的 ip 地址(123.123.123.123)。

eth1:本地网络
点对点0:VPN 服务
本地网络:10.10.1.0/24
转发 IP:123.123.123.123
港口:12345

端口可以​​不同,但​​相同则无所谓,只要它能工作就行:)

iptables -t nat -A PREROUTING -p tcp -i eth1 -d 10.10.1.0/24 --dport 12345 -j DNAT --to-destination 123.123.123.123:12345
iptables -A FORWARD -p tcp -o ppp0 -d 123.123.123.123 --dport 12345 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

搜索后,大多数人都这么说。使用 PREROUTE 设置新目的地。然后转发 ppp0。但它不起作用,我不知道如何真正看到它在做什么。

答案1

iptables -t nat -A PREROUTING -p tcp -i eth1 -d 10.10.1.0/24 \
  --dport 12345 -j DNAT --to-destination 123.123.123.123:12345

本地生成的流量永远不会通过 PREROUTING 链。您可以通过添加如下规则来验证这一点:

iptables -t nat -A PREROUTING -j log -m limit --limit 1/s

如果你不熟悉 iptables,上述规则的意思是:

  • 记录(最大速率为 1 条消息/秒)穿过 PREROUTING 链的任何数据包。

在进行出站连接时查看日志文件,您会发现没有任何内容通过此链。PREROUTING 链仅对从外部来源进入系统的流量起作用。

您可能认为可以在 OUTPUT 链中执行此操作:

iptables -t nat -A OUTPUT ... -j DNAT ...

但是当数据包到达链时,OUTPUT路由决策已经做出。您可以通过使用链REDIRECT中的规则OUTPUT,然后在本地端口上运行 TCP 代理来重定向到您的目的地,从而实现您想要的效果。也就是说,您可以添加如下规则:

iptables -t nat -A OUTPUT -p tcp -d 10.10.1.0/24 --dport 12345 \
  -j REDIRECT --to-ports 12345

然后在端口 12345 上本地运行 tcp 代理。

答案2

您可以尝试使用 MARK 用 iptables 标记您的数据包,例如在您的 dnat 之后或之前:

iptables -t mangle -A PREROUTING -p tcp -d 123.123.123.123 --dport 12345 -j MARK --set-mark 111

之后您可以为此设置特定的路线:

ip rule add fwmark 111 lookup 100

ip route add local 0.0.0.0/0 dev ppp0 table 100

答案3

这可能是因为 NAT 规则只是为其提供了一个新的目标 IP 地址,然后通过 eth1 进行路由。然后过滤规则不适用。

您需要为这个特定目的地创建一条通过 ppp0 的路由(如果所有绑定到这个目的地的流量都可以通过 vpn),或者使用 mangle 表为这个流量手动挑选一个目的地。

相关内容