如何强制某些流量通过 GRE 隧道?

如何强制某些流量通过 GRE 隧道?

这是我的做法。

服务器(公共互联网是222.xxx):

echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf  
sysctl -p  
iptunnel add gre1 mode gre local 222.x.x.x remote 115.x.x.x ttl 255  
ip add add 192.168.168.1/30 dev gre1  
ip link set gre1 up  
iptables -t nat -A POSTROUTING -s 192.168.168.0/30 -j SNAT --to-source 222.x.x.x  
iptables -t nat -A PREROUTING -d 222.x.x.x -j DNAT --to-destination 192.168.168.2  

客户端(公共互联网是115.xxx):

iptunnel add gre1 mode gre local 115.x.x.x remote 222.x.x.x ttl 255  
ip add add 192.168.168.2/30 dev gre1  
ip link set gre1 up  
echo '100 tunnel' >> /etc/iproute2/rt_tables  
ip rule add from 192.168.168.0/30 table tunnel  
ip route add default via 192.168.168.1 table tunnel  

到这里,一切似乎都正常。但第一个问题,如何使用 GRE 隧道作为默认路由?客户端计算机仍默认使用 115.xxx 接口。

第二个问题,如何强制仅 ICMP 流量通过隧道,而其他所有流量都通过默认接口?我尝试在客户端计算机上执行此操作:

ip rule add fwmark 200 table tunnel  
iptables -t mangle -A OUTPUT -p udp -j MARK --set-mark 200  

但这样做之后,我的 ping 程序会超时(如果我不执行上述 2 条命令,而是使用 ping -I gre1 ip,它就会起作用)。稍后我还想做其他事情,比如只通过隧道使用 UDP 端口 53 等。

第三个问题,在客户端计算机中,我强制一个 mysql 程序监听 gre1 接口 192.168.168.2。在客户端计算机中,还有一个公共接口(IP 114.xxx)...如何使用 iptables 和路由正确转发流量,以便 mysql 也响应来自此 114.xxx 公共接口的请求?

答案1

问题 1

查看使用 gre 隧道作为默认路由

问题2所有 icmp 通过隧道

iptables -t nat -A POSTROUTING -o gre1 -p icmp -j SNAT --to-source 192.168.168.2

问题 3

在客户端机器上,使用DNAT从外部端口到服务器端口进行端口转发。

方法 2 - 端口反射/端口镜像

iptables -t nat -A PREROUTING -p tcp -m tcp -m multiport -d 114.x.x.x --dports 3306 -j DNAT --to-destination 192.168.168.1
iptables -t nat -A POSTROUTING -o gre1 -p tcp -m tcp -m multiport -d 192.168.168.1 --dports 3306 -j SNAT --to-source 192.168.168.2

相关内容