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

所以我在ppp0上有一个VPN,而且我安装了,所以我可以使用ppp0或者eth1连接出缺省路由eth1。

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

目标 :如果我在端口12345上连接到eth1,它将把ppp0转发到一个特定的IP地址(123.123.123.123)。

eth1 :本地networking
ppp0 :vpn服务
本地networking :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 

经过search这是大多数人说的。 使用PREROUTE设置新的目的地。 然后转发出ppp0。 但它不工作,我不知道如何真正看到它在做什么。

 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 

本地生成的stream量永远不会通过PREROUTING链。 你可以通过添加这样的规则来validation这一点:

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

如果你不熟悉iptables,上面的规则意味着:

  • logging(以1个消息/秒的最大速率)穿过PREROUTING链的任何数据包。

在进行出站连接时观察日志文件,您将看到没有任何东西通过此链。 PREROUTING链只适用于从外部来源进入系统的stream量。

你可能会认为你可以在OUTPUT链中做到这一点:

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

但是当数据包到达OUTPUT链时,路由决策已经完成。 您可能可以通过在OUTPUT链中使用REDIRECT规则,然后在本地端口上运行tcp代理来redirect到目标的连接。 也就是说,你可以添加一个这样的规则:

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

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

您可以尝试使用MARK标记您的数据包,在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

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

你需要为这个特定的目的地创build一个路由,通过ppp0(如果绑定到这个目的地的所有stream量都可以通过vpn),或者使用mangle表为这个stream量手工select一个目的地。