利用隧道和conntrack实现NAT网关
场景:实现一个NAT网关来转发其它node的出外网流量
如:图中的2节点充当NAT网关来转发1的出外网流量
利用隧道和conntrack实现NAT网关
节点ip:
node1是172.17.158.48,node2是172.17.158.46
1、配置1节点的隧道:
ip tun add tun0 mode gre remote 172.17.158.46 local 172.17.158.48 ttl 64
ip link set tun0 up
ip addr add 100.64.0.1 peer 100.64.0.2 dev tun0
2、在1节点添加路由项,使得本地去往第三方站点的流量,都走这条路由,也就是通过隧道到达虚拟机 2,然后 2 来转发报文:
ip route add 110.242.68.0/24 via 100.64.0.2 dev tun0
3、虚拟机 2 上面也需要做对等的隧道配置:
ip tun add tun0 mode gre remote 172.17.158.48 local 172.17.158.46 ttl 64
ip link set tun0 up
ip addr add 100.64.0.2 peer 100.64.0.1 dev tun0
4、虚拟机 1 把报文发到虚拟机 2,但是如果后者不做配置,默认是会丢弃这些报文的,所以
还需要在 2 上开启 ip_forward:
sysctl net.ipv4.ip_forward=1
5、在 2 上启用 SNAT
iptables -t nat -A POSTROUTING -d 110.242.68.0/24 -j MASQUERADE
要不然出去的报文源 IP 是 100.64.0.1,回包也会回这
个地址,显然回不到 2 了
6、验证:在1上发起百度的请求,能够正常被转发
原理:
-
通过隧道和默认路由,在1节点上将其访问百度的包送到了2节点
-
2节点收到隧道包后进行拆解,然后根据目的地址百度发起请求,且通过conntrack进行snat,将出去的src ip由原来的1节点隧道设备的ip改为自己出外网网卡的ip,收到回复后再进行conntrack reverse,将dst ip由自己出外网网卡的ip改为1节点隧道设备的ip,此时再通过隧道回到1节点
-
1节点通过隧道收到了百度的回包
在这个过程中,我们使用了MASQUERADE进行snat,MASQUERADE会自动会回包进行reverse,不需要你再下发dnat规则来恢复了