NAT(Net Addres Trancelate,网络地址转换)
是将局域网里的内部地址
(如 192.168.0.x)转换成公网(Internet)上的 IP 地址(如 1.1.1.2),以使内部地址能像有公网地址的主机一样上网和访问。NAT 包括:DNAT、SNAT、MASQUERADE。
介绍
修改ip报文
的头部的source ip
或者destination ip
,NAT
通常都是router
的行为。在 linux 中,iptables 可以作为 NAT 执行的角色。
实现方式
- Static NAT(静态地址转换,内网 IP:公网 IP=1:1)
- Pooled NAT(动态地址转换,内网 IP:公网 IP=M:N)
- NAPT(内网 IP:公网 IP=M:1)
DNAT
DNAT(Destination Network Address Translation)
修改网络包目的ip地址
。当内部需要提供对外服务时(如对外发布 web 网站),外部地址
发起主动连接,由路由器或者防火墙
上的网关接收这个连接,然后将连接
转换到内部
,此过程是由带有公网 IP 的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT
,主要用于内部服务对外发布,比如:将 NAT 网关上的公网 IP 映射给云实例使用,使云实例能够提供互联网服务。
# 让外网用户访问局域网内不同的服务器,网关上配置
iptables –t nat –A PREROUTING –i eth1 –p tcp –d 222.222.222.222 –dport 80 –j DNAT --to-destination 192.168.10.10:80
iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.168.10.10
SNAT
SNAT(Source Network Address Translation)
修改网络包源ip
地址。内部地址
要访问公网上的服务时(如 web 访问),内部地址会主动发起连接,由路由器或者防火墙
上的网关对内部地址
做个地址转换
,将内部的私有IP
转换为公网的公有IP
,网关
的这个地址转换
称为SNAT
,主要用于内部共享 IP 访问外部,比如:为 VPC 中无公网 IP 的 ECS 实例提供访问互联网的代理服务。SNAT 是为了解决 ip 地址不够用的情况。
RFC 1918 保留了 3 个网段作为private addresses
:
- 10.0.0.0/8 (即 10.0.0.0 - 10.255.255.255)
- 172.16.0.0/12 (即 172.16.0.0 - 172.31.255.255)
- 192.168.0.0/16 (即 192.168.0.0 - 192.168.255.255)
# 解决多个内网用户通过一个外网地(222.222.222.222)上网
iptables –t nat –A POSTROUTING –s 192.168.10.10 –o eth1 –j SNAT --to-source 222.222.222.222
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j SNAT –to-source 222.222.222.222
# 若外网IP不稳定,使用MASQUERADE(动态伪装)
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE