![使用 IPTables 将传入 eth1(本地)的端口转发到传出 ppp0(vpn)到特定的 ip 地址](https://linux22.com/image/536321/%E4%BD%BF%E7%94%A8%20IPTables%20%E5%B0%86%E4%BC%A0%E5%85%A5%20eth1%EF%BC%88%E6%9C%AC%E5%9C%B0%EF%BC%89%E7%9A%84%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E5%88%B0%E4%BC%A0%E5%87%BA%20ppp0%EF%BC%88vpn%EF%BC%89%E5%88%B0%E7%89%B9%E5%AE%9A%E7%9A%84%20ip%20%E5%9C%B0%E5%9D%80.png)
因此我在 ppp0 上有一个 VPN,并且我进行了设置,因此我可以使用 ppp0 或 eth1 来连接,默认路由是 eth1。
两者都回复“ping google.com”(使用 eth1)和“ping -I ppp0 google.com”(使用 VPN)
目标:如果我连接到端口 12345 上的 eth1,它将把 ppp0 转发到特定的 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 表为这个流量手动挑选一个目的地。