![如何强制某些流量通过 GRE 隧道?](https://linux22.com/image/797690/%E5%A6%82%E4%BD%95%E5%BC%BA%E5%88%B6%E6%9F%90%E4%BA%9B%E6%B5%81%E9%87%8F%E9%80%9A%E8%BF%87%20GRE%20%E9%9A%A7%E9%81%93%EF%BC%9F.png)
这是我的做法。
服务器(公共互联网是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
问题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