Linux Iptables SNAT DNAT

任何一个IP数据包中,都有Source IP Address与Destination IP Address这两个字段, 路由器根据这两个字段来判定数据包是由什么地方发过来的,将要发到什么地方去。 而iptables的DNAT与SNAT就是根据这个原理,对Source IP Address与Destination IP Address进行修改。 通过SNAT和DNAT可以使内网和外网进行相互通讯。

SNAT

SNAT(Source Network Address Translation,源地址转换)源映射。 SNAT是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机。

示例将内网请求转发到可上网机器访问公网

1
> iptables -t nat -I POSTROUTING 1 -j SNAT -s 192.168.10.0/24 --to-destination 192.168.1.18

将内网192.168.10.0/24这个IP段的请求转发到192.168.1.18这台可上网机器.

示例公网ip主机(master)上配置:

  1. 确保master可以访问网络: ping www.baidu.com 测试
  2. 执行如下命令,查看Linux操作系统的IP转发功能是否已开启。
1
cat /proc/sys/net/ipv4/ip_forward

结果:1为开启,0为关闭,默认为0。

  1. 修改/etc/sysctl.conf文件net.ipv4.ip_forward = 1。
1
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p /etc/sysctl.conf
  1. 执行如下命令,使修改生效。
1
sysctl -p /etc/sysctl.conf
  1. 配置SNAT。 执行如下命令,允许网段(例如:172.18.73.0/20)内所有云服务器内访外配置。
1
iptables -t nat -A POSTROUTING -o eth0 -s 172.18.73.0/20 -j SNAT --to 172.18.73.36

172.18.73.36 为当前主机(master)内网ip, 6. 查看nat配置

1
2
3
4
5
6
7
8
[root@masterServer ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  172.18.64.0/20       anywhere            to:172.18.73.36
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

DNAT

DNAT(Destination Network Address Translation,目的地址转换) 目的映射。 DNAT就是指数据包从网卡发送出去的时候,修改数据包中的目的IP。

示例将请求转发到内网机器上

1
> iptables -t nat -A PREROUTING -i eth0 -p tcp --dst 39.156.69.79 --dport 80 -j DNAT --to-destination 192.168.1.13:80

把所有通过eth0这个网卡发往地址39.156.69.79的包都转发到局域网中192.168.1.13这台机器上

1
> iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -m string --string "baidu.com" --algo bm -j DNAT --to-destination 192.168.1.10:80

使用–string参数将匹配到baidu.com地址的请求转到局域网192.168.1.10这台机器上.

参考