通过GRE隧道redirectSSHstream量

我试图使用iptables MARK将所有与目标匹配端口22的本地连接redirect到指定的隧道,但出现了问题。

1.1.1.1 my public address 2.2.2.2 tunnel public address 1.2.3.4 my local tunnel address 

这里的configuration:

 # ip rule show 1: from all fwmark 0x14 lookup 20 # ip route show table 20 default via 1.2.3.4 dev tun0 

我在iptables上创build了以下规则:

 iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 20 iptables -t mangle -A OUTPUT -s 1.2.3.4 -j MARK --set-mark 20 

而当我试图SSH服务器(在这种情况下,Dreamhost的),我得到:

 tcp 6 299 ESTABLISHED src=1.1.1.1 dst=69.163.202.189 sport=37152 dport=22 packets=4 bytes=221 src=69.163.202.189 dst=1.1.1.1 sport=22 dport=37152 packets=2 bytes=133 [ASSURED] mark=0 secmark=0 use=2 

数据包没有通过默认路由标记出去,即1.1.1.1

我不知道我在做什么错

任何人有任何想法?

mangle的 PREROUTING用于在路由之前改变传入数据包 ,并在路由之前更改本地生成的数据包 。 因此PREROUTING是不必要的(对于本地连接)。 但是, OUTPUT应该工作,但。 通常情况下,您不需要在防火墙规则中指定源地址,因为无论如何它都是“本地生成的数据包”。

还有一件事要记住, 没有人会改变源IP,只是因为你已经标记了数据包,而且会被路由到另一个路由表 – 你需要明确地使用NAT 。 就Linux的iptables而言,它必须是SNAT 。 和“这个目标只在nat表中,在POSTROUTING链中有效”,正如该名男子所说。 虽然我个人更喜欢它的MASQUERADE ,因为它更方便,因此您不必费心使用IP地址硬编码。