NAT 原理

NAT技术可以重写IP数据包的源IP或者目的IP,被普遍地用来解决公网IP地址短缺的问题。

主要原理: 网络中的多台主机,通过共享同一个公网 IP 地址,来访问外网 资源。同时,由于NAT屏蔽了内网网络,自然也就为局域网中的机器提供了安全隔离。

NAT的主要目的,是实现地址转换。 根据实现方式的不同,NAT 可以分为三类:

  1. 静态NAT,即内网 IP 与公网 IP 是一对一的永久映射关系;
  2. 动态NAT,即内网 IP 从公网 IP 池中,动态选择一个进行映射;
  3. 网络地址端口转换 NAPT(Network Address and Port Translation),即把内网IP映射到公网 IP 的不同端口上,让多个内网IP可以共享同一个公网IP地址。可以把NAPT分为三类:
    1. 第一类是源地址转换 SNAT,即目的地址不变,只替换源IP或源端口。
    2. 第二类是目的地址转换 DNAT,即源IP保持不变,只替换目的IP或者目的端口
    3. 第三类是双向地址转换,即同时使用 SNAT 和 DNAT。

nat表内置了三个链:

  1. PREROUTING,用于路由判断前所执行的规则
  2. POSTROUTING,用于路由判断后所执行的规则
  3. OUTPUT,类似于 PREROUTING,但只处理从本机发送出去的包。

SNAT

SNAT 需要在 nat 表的 POSTROUTING 链中配置。

第一种方法,是为一个子网统一配置SNAT,并由Linux选择默认的出口IP。

1
$ iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE

第二种方法,是为具体的 IP 地址配置 SNAT,并指定转换后的源地址

1
$ iptables -t nat -A POSTROUTING -s 192.168.0.2 -j SNAT --to-source 100.100.100.100

DNAT

DNAT 需要在 nat 表的 PREROUTING 或者 OUTPUT 链中配置, 其中, PREROUTING 链更常用一些(因为它还可以用于转发的包)

双向地址转换

双向地址转换,就是同时添加 SNAT 和 DNAT 规则,为公网 IP 和内网 IP 实现一对一的 映射关系,

1
2
$ iptables -t nat -A POSTROUTING -s 192.168.0.2 -j SNAT --to-source 100.100.100.100
$ iptables -t nat -A PREROUTING -d 100.100.100.100 -j DNAT --to-destination 192.168.0.2