Linux下配置SNAT上网

2018/9/29 19:55:00

  Linux下配置SNAT上网
  局域网有一台主机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