NAT简介
网络地址转换NAT(Network Address Translation)方法是在1994年提出的。这种方法需要在专用网连接到互联网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和互联网连接。
如下图所示给出了NAT路由器的工作原理。在图中,专用网192.168.0.0内所有主机的IP地址都是本地IP地址192.168.x.x。NAT路由器至少要有一个全球IP地址,才能和互联网相连。图中表示出NAT路由器有一个全球IP地址172.38.1.5(当然,NAT路由器可以有多个全球IP地址)。
SNAT与DNAT简介
路由器将专有网段中收到的192网段的报文替换成172网段的报文为SNAT(Source Network Address Translation);反之路由器将从公网收到的172网段的报文替换为内网192网段的报文为DNAT(Destination Network Address Translation)。
NAPT简介
使用端口号的NAT也叫做网络地址与端口号转换NAPT(Network Address and Port Translation),而不使用端口号的NAT就叫做传统的NAT(traditional NAT)。但在许多文献中并没有这样区分,而是不加区分地都使用NAT这个更加简洁的缩写词。下图说明了NAPT的地址转换机制。
配置Linux NAT网关
如图所示,通过配置Client与server实现Client访问互联网
配置client默认路由指向192.168.2.11
//添加默认路由
[root@node03 ~]# route add default gw 192.168.2.11
//查看新添加的路由
[root@node03 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.11 0.0.0.0 UG 0 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
配置NAT server 开启snat
//开启路由转发
[root@ct7_node01 ~]# sysctl net.ipv4.ip_forward=1
//情况防火墙规则
[root@ct7_node01 ~]# iptables -F
//清空nat规则
[root@ct7_node01 ~]# iptables -t nat -F
//配置新的nat规则
[root@ct7_node01 ~]# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to 192.168.122.22
//查看刚刚创建nat规则
[root@ct7_node01 ~]# iptables -t nat -vnL
...
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT all -- * * 192.168.2.0/24 0.0.0.0/0 to:192.168.122.22
...
客户端访问公网测试
[root@node03 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 74:52:01:01:03:01 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.13/24 brd 192.168.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::754a:b9ba:aae0:2412/64 scope link
valid_lft forever preferred_lft forever
inet6 fe80::54fc:ae6:27ee:f265/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 74:52:01:01:03:02 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 74:52:01:01:03:03 brd ff:ff:ff:ff:ff:ff
5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 74:52:01:01:03:04 brd ff:ff:ff:ff:ff:ff
[root@node03 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.11 0.0.0.0 UG 0 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@node03 ~]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=111 time=57.1 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=111 time=48.6 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 48.682/52.897/57.112/4.215 ms
[root@node03 ~]#
客户端成功访问互联网
配置Linux NAPT网关
上述步骤已完成了NAT的配置,客户端可以通过ip地址访问互联网,但是想要使用DNS,Http等服务还需要做进一步的配置。
配置规则
//将 UDP 192.168.2.13:53的报文替换为UDP的192.168.122.22:51889
[root@ct7_node01 ~]# iptables -t nat -A POSTROUTING -s 192.168.2.13 -p udp --dport 53 -j SNAT --to 192.168.122.22:51889
//查看NAT规则
[root@ct7_node01 ~]# iptables -t nat -nvL
...
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT all -- * * 192.168.2.0/24 0.0.0.0/0 to:192.168.122.22
0 0 SNAT udp -- * * 192.168.2.13 0.0.0.0/0 udp dpt:53 to:192.168.122.22:51889
...
验证
[root@node_03 ~]# ping baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=54 time=9.84 ms
^C
--- baidu.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 9.842/9.842/9.842/0.000 ms
[root@node_03 ~]# curl baidu.com
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
[root@node_02 ~]#
iptables的bug
如上图所示只进行了192.168.2.13 udp53端口的转换,但是客户端同样可以发送与接收HTTP的请求;192.168.122.22上iptables虽然带端口的nat只配置了一条,但实际上192.168.2.13上所有的tcp、udp端口都会进行转换,192.168.2.13这台主机可以访问互联网上所有的应用。
Tips
如果将NAT网关替换为海外的服务器,会出现什么情况呢: )