本文说明iptables的MASQUERADE的含义。
iptables的SNAT是source networkaddress translation的缩写,即源地址转换,一个内网请求经过网关访问外部互联网上的资源时,网关路由器会将内网源地址转换为外网IP再发出。故而目标服务器上收到的源IP是公网IP。
iptables的DNAT是destination networkaddress translation的缩写,即目标地址转换。一个来自外部互联网上的请求,需要穿透内网访问内网的某个服务,网关路由器上就需要将外部IP转成内部IP,这样请求就能在内网环境中正常路由。
通常使用比较多的是 SNAT,举例如下:
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth0 -j SNAT --to-source xx.xx.xx.xx
注意:192.168.0.0/255.255.255.0可以简写成192.168.0.0/24
注意:--to-source可以简写为--to
注意:假如有多个公网IP可选,--to-source可以写多个IP用逗号分隔,如果是IP段,起始IP用杠相连。
SNAT基本解决了服务器是固定IP的场景,但有种场景是服务器或者网关的IP为动态IP,此时就无法提前写死了,此时MASQUERADE的用武之地就到了,它实现自动从网卡获取动态IP,自动做SNAT:
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth0 -j MASQUERADE
特别注意:通常我们需要通过-o来指定哪个网卡,有时候我们也可以设置除lo之外的任意网卡,写法为:! -o lo,之所以要排除掉lo,是因为域名解析时需要走lo,对lo进行SNAT会导致DNS缓存出问题。