Iptables – NAT实验

Host3中添加默认路由:

# 如果配置IP时已经配置了网关,这个步骤忽略
route add defalut gw 172.16.109.129

在Host3中ping Router1的172.16.195.131是不通,那是因为响应数据没有返回路由。

Router1中添加默认网关(响应数据)

route add default gw 172.16.195.132

在Host3中ping Router1的172.16.195.131是可以正常通信。

在Router2中添加:(把来源是172.16.109.0/24的数据包来源改为172.16.195.132)

iptables -t nat -A POSTROUTING -o eht0 -s 172.16.109.0/24 -j SNAT --to 172.16.195.132

如果在Router1中拦截目标为172.16.195.132的数据包,那么Host3中ping Router1的172.16.195.131将无法得到响应。因为这个时候发送的响应包目标就是172.16.195.132。

iptables -A OUTPUT -d 172.16.195.132 -j REJECT

在Host3中ping 172.16.195.131,数据无法响应,说明响应地址为172.16.195.132,数据被拦截(也说明了源地址被修改)。

由于被修改了源地址,那么响应数据包目标都是172.16.195.132,对于172.16.195.131来说,是内网通信,不需要在Router1上设置网关(原来需要设置网关把数据送回来)。

iptables -D OUTPUT -d 172.16.195.132 -j REJECT
route del default

Host3上ping 172.16.195.131,数据正常响应。说明响应数据目标是172.16.195.132。

由于修改了源地址,响应时到达Router2,这时Router2必须把目标地址对应回去,Ping得到响应就已经说明自动进行了DNAT。

在实际的环境中,Router2可能有多个出口网卡(多WAN),或一个WAN上分配了多个IP(虚拟WAN),这个时候出去的IP就有多个,这时需要做修改:

iptables -t nat -A POSTROUTING -o eth0 -s 172.16.109.0/24 -j SNAT --to-source 172.16.195.132-172.16.195.142

WAN上的IP可能不是静态分配的,比如是通过拨号产生的,所以分配的IP地址会发送变化,所以以上的做法无法满足这个情况,需要使用MASQUERADE:

iptables -t nat -A POSTROUTING -o eth0 -s 172.16.109.0/24 -j MASQUERADE

这里的MASQUERADE是指伪装,具体来说就是把源IP改为eth0网卡一样的地址(出口接口),这样就实现了动态绑定。

DNAT

DNAT是修改目标地址,修改地址时还可以修改端口号。所以一般的应用场景是内网IP或端口映射到外网IP或端口。
在Router1上添加映射关系:

iptables -t nat -A PREROUTING -d 172.16.108.129 -p tcp -m tcp --dport 80 -j DNAT --to-destination 162.16.195.130:80 

当访问172.16.108.129的80端口时,修改目标为162.16.195.130的80端口,这样数据就进入到162.16.195.130这个机器。

如果不指定端口号,那么就是针对地址,目标地址可以指定一个段:

iptables -t nat -A PREROUTING -d 172.16.108.129 -j DNAT --to-destination 162.16.195.130-162.16.195.140 

访问到达172.16.108.129的数据包,表修改为162.16.195.130-162.16.195.140段中的其中一个IP,这个场景用法,加上转发时使用规则(主要设置权重),那就可以做一个简单的负载均衡集群。

REDIRECT
REDIRECT也是NAT的内容,不过REDIRECT修改的是目标端口号(也涉及到修改数据包地址),由于只是修改目标端口号,所以它是本机端口转发。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j redirect --to-ports 8080

主要注意的是这里的端口转发,端口自然是要开放的,否则数据无法进来,端口转发不过是把某个端口的数据改为另一个端口而已。

SNAT是数据出去时修改源地址,所以应该是NAT表的POSTROUTING链中进行。DNAT和REDIRECT都是在进入进入时对目标地址或端口进行修改,所以需要在NAT表的PREROUTING链中进行。