局域網有一台主機A,沒有公網的IP, 也就是沒有辦法直接連到互聯網上下載東西,同時內網有另外一台主機B,有公網接入。這個時候為了讓A連接到互聯網,我把B設置成NAT主機,A的網關指向B。
准確的來說,現在的相當於SNAT模式。分析一下數據包流向:
IP信息如下:
A: eth0: 10.122.70.74
B: eth1:10.122.70.65 / eth0:220.220.220.65
發送數據包:
A發送數據包時,B也就是NAT主機,分析數據包表頭,將此數據包轉到可以連接公網的Public IP上去。由於私有IP與公有IP不能互通,B會通過iptables的NAT table內的Postrounting鏈將數據包表頭偽裝成B的公網IP,並且將這兩個不同來源的數據包對應關系寫入暫存內存中,然后將數據包傳送出去。此時傳到互聯網的這個數據包,已經表現為來自公網IP,而非來自局域網。
接收響應包:
當從互聯網把數據響應給A時,會首先進入NAT主機B,B分析數據包的序號,對比剛剛記錄到內存中的數據,由於發現該數據包為后端主機之前傳送出去的,因此在NAT Prerouting鏈中,會將目標IP修改成為后端主機,即A的IP,然后發現目標已經不是本機公網IP,開始通過路由分析,將數據包傳送到B的局域網接口,再傳送到最終目標10.122.70.74上去。
B的設置如下:
#允許接受局域網網卡的數據包,
iptables -I INPUT -i eth1 -j ACCEPT
#開啟路由功能
echo 1 > /proc/sys/net/ipv4/ip_forward
#偽裝數據包
iptables -t nat -A POSTROUTING -s 10.122.70.74 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.122.70.74 -j MASQUERADE
或者用SNAT直接修改IP數據包的表頭來源IP
iptables -t nat -A POSTROUTING -o eth1 -j SNAT –to 10.122.70.74
如果支持多個IP
iptables -t nat -A POSTROUTING -o eth1 -j SNAT –to 10.122.70.74-10.122.70.100
A設置:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
# Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=10.122.70.74
NETMASK=255.255.0.0
GATEWAY=10.122.70.65
===============================================
查看nat表鏈規則
iptables -t nat -L -n
刪除POSTROUTING第一條規則
iptables -t nat -D POSTROUTING 1
實例配置:
B主機(172.20.18.102):
cat /etc/sysconfig/iptables -A POSTROUTING -s 172.20.18.103/32 -j MASQUERADE
A主機(172.20.18.103):
cat ifcfg-eno1 TYPE=Ethernet BOOTPROTO=static NAME=eno1 UUID=0f506d06-e9f0-41ed-ae79-a30b8236da4c DEVICE=eno1 IPADDR=172.20.18.103 NETMASK=255.255.0.0 GATEWAY=172.20.18.102 ONBOOT=yes
測試網絡連接情況:
ping www.baidu.com PING www.a.shifen.com (115.239.211.112) 56(84) bytes of data. 64 bytes from 115.239.211.112 (115.239.211.112): icmp_seq=1 ttl=54 time=3.19 ms 64 bytes from 115.239.211.112 (115.239.211.112): icmp_seq=2 ttl=54 time=3.17 ms
參考:http://www.cellmean.com/linux%E4%B8%8B%E9%85%8D%E7%BD%AEsnat%E4%B8%8A%E7%BD%91