# NAT网络地址转发例子

# 1. 网络情况

有三台主机A、B、C, 我们把A和B组成一个子网,B和C组成一个子网,这样B就是两个子网的交集。

主机 ip
主机A 192.168.1.100/24
主机B 192.168.1.1/24, 172.16.1.101/24
主机C 172.16.1.100/24

这样的网络场景,A和B可以通信,B和C可以通信,A和C不能通信。

# 2. NAT模式:如果我们想让主机A能访问主机C,怎么办呢?

# 2.1 思路

  1. 我们可以把B作为网关,在A上增加一个设置,告诉他,默认网关是B
  2. 在B上设置NAT转发

从A(192.168.1.100)发往C(172.16.1.100)的数据包,首先查看A本地的路由表,查到默认网关是192.168.1.1,将数据包发给了192.168.1.1。 B主机的192.168.1.1收到数据,将来源地址192.168.1.100修改成172.16.1.101再转发出去。

# 2.2 具体的步骤(linux环境)

下命令都是需要root来执行,ubuntu需要sudo su - 到root权限

第一步:在A服务器上执行下面命令:增加一个本地路由规则,访问172.16.1.0/24的请求,都发送到192.168.1.1(也就是网关)

ip route add 172.16.1.0/24 via 192.168.1.1
1

第二步:在B服务器上执行下面命令:开启IP转发,配置NAT转发规则

# 启用forward,否则不会转发ip数据包
sysctl -w net.ipv4.ip_forward=1

# 在防火墙iptables里增加一个nat规则,在POSTROUTING链上增加规则,将目的ip是172.16.1.0/24子网的数据包,将源ip都修改为 172.16.1.101,通过ens33网卡发送出去。
iptables -t nat -A POSTROUTING --dst 172.16.1.0/24 -o ens33 -j SNAT --to 172.16.1.101
1
2
3
4
5

这样,在A上ping 172.16.1.100就可以ping通了。

# 3. 路由跳转:

在主机a上执行 ip route add 172.16.1.0/24 via 192.168.1.1

在主机c上执行 ip route add 192.168.1.0/24 via 172.16.1.101

主机b上执行 sysctl -w net.ipv4.ip_forward=1

然后a就能ping通c了,c也能ping通a了。