所以我在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,上面的规则意味着:
在进行出站连接时观察日志文件,您将看到没有任何东西通过此链。 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一个目的地。