target:SNAT,DNAT,MASQUERADE
互联网是由众多局域网组织连接起来的,但是私网地址不能直接访问互联网,如果每台主机都配置公网地址就不够用了,因此需要用到地址转换功能,有两种情况:
- 作为服务器端,要接受客户端的请求,而客户端访问的是公网地址,而服务器端是私网地址,于是需要将公网地址转换为对应的私网地址,这就是所谓的DNAT
- 作为客户端,比如公司内部的局域网内的主机需要访问互联网,就需要通过网关路由出去,除了添加路由,我们可以将这些主机配置的私网地址转换为网关的地址,这就是SNAT
HOST1:
eno16777736 (桥接):172.16.52.10/16 172.16.0.1
eno33554984(vmnet2) :192.168.1.2/24
HOST2:
eno16777736(桥接) :172.16.52.59/16 172.16.0.1
HOST3:
eno16777736 (vmnet2) :192.168.1.4/24 192.168.1.2
将host1的第二章网卡地址作为自己的网关
eg:
host3:
#ping 192.168.1.2 通
#ping 172.16.52.10 通
由于host1是linux主机,只要是收到ping包,每个网卡都会予以响应,地址是内核的,与网卡无关
#ping 172.16.52.59 不通
由于没有开启转发功能,192.168.1.4上没有到172网段的路由,因此不通
解决办法:
host1:
#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.52.10
///此处做了SNAT源地址转换,主要发生在本地局域网的主机想要通过唯一的路由器主机访问公网,应用在nat表的POSTROUTING链上 ,参数为 --to-source,一般做了SNAT后,回来不用做DNAT,因为它会自动做的,其实是在请求时就生成一个ID号,回来的时候根据这个ID号判断出主机地址,自动做DNAT。
测试:在host3上面 ping 172.16.52.59 本来是不通的,但是前提是host3上面需要host上第二张网卡的网关,就可以ping通了,还记的上面吗,即使加了网关也是ping不通的,因为没有做nat,但是在host2上面ping 192.168.1.4不通,需要做DNAT,接着往下。。。
host1:
#iptables -t nat -F
///为了防止其他规则的干扰,将防火墙清空
#iptables -t nat -A PREROUTING -d 172.16.52.10 -p tcp --dport 22 -j DNAT --to-destination 192.168.1.4[:port]
///这里做了DNAT,后面的的端口如果省略不写,就表示和前面一样,DNAT表示开放本地的服务给其他网段的主机访问,默认也是自动生成SNAT表
测试:在 host2上面 ssh 172.16.52.10 ,成功登陆,会发现ifconfig执行结果为 192.168.1.4,说明DNAT成功,不能用ping,因为ping是要经过路由表,这里是NAT只和内核有关,与网关无关,并且还可以通过抓包工具 tcpdump -i enoxxxxx -nn host ip 来分析来往的ip地址
MASQUERADE:
#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
MASQUERADE命令的功能和SNAT一样,不过是解决动态的源地址IP的SNAT问题,测试方法和SNAT一样,并且也可以通过tcpdump来装包分析。虽然比较方便,但是相对于SNAT来说有额外的开销,因此静态地址的转换建议少使用。