Iptables实现NAT

2018-04-30|Categories: External cmd, Linux, Network|Tags: |

NAT全称Network Address Translation,中文就是「网络地址转换」,也叫做IP伪装(IP Masquerading),是一种在IP数据包通过路由器或防火墙时重写来源IP地址或目标IP地址的技术。这种技术被普遍使用在有多台主机但只通过一个公网IP地址连接互联网的私有网络中。

重写来源IP地址叫做源地址转换(SNAT),重写目标IP地址叫做目标地址转换(DNAT)。

SNAT

如下图所示,局域网内有两台电脑需要访问互联网上的Web服务器,但这两台电脑没有公网IP地址,必须在防火墙设置SNAT,把请求数据包源地址转换为公网IP才可以连接互联网。

配置客户端

配置第一台客户端:

# 指定IP地址
ip address add 172.16.125.72/24 dev eth1

# 添加路由
ip route add 10.0.0.0/24 via 172.16.125.71

配置第二台客户端:

# 指定IP地址
ip address add 172.16.125.73/24 dev eth1

# 添加路由
ip route add 10.0.0.0/24 via 172.16.125.71

配置Web服务器

# 指定IP地址
ip address add 10.0.0.61/24 dev eth0

# 安装Web服务器
yum install httpd -y

# 编写测试网页
echo 'Web server at 10.0.0.61' > /var/www/html/index.html

# 启动Web服务器
systemctl start httpd

配置防火墙

# 指定IP地址
ip address add 172.16.125.71/24 dev eth1
ip address add 10.0.0.71/24 dev eth0

# 开启 ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward

# 添加iptables规则
iptables -t nat -A POSTROUTING -s 172.16.125.0/24 ! -d 172.16.125.0/24 \
            -j SNAT --to-source 10.0.0.71

如果公网IP地址不固定,也可以把上面的规则替换成使用地址伪装技术:

iptables -t nat -I POSTROUTING -s 172.16.125.0/24 ! -d 172.16.125.0/24 -j MASQUERADE

在两台客户端分别测试

$ curl 10.0.0.61
Web server at 10.0.0.61

在Web服务器查看访问日志

$ tail -f /var/log/httpd/access_log
10.0.0.71 - - [30/Apr/2018:20:54:12 +0800] "GET / HTTP/1.1" 200 24 "" "curl/7.29.0"
10.0.0.71 - - [30/Apr/2018:20:56:18 +0800] "GET / HTTP/1.1" 200 24 "" "curl/7.29.0"

测试通过,SNAT已经实现。

DNAT

如下图所示,局域网内有一台Web服务器,但没有公网IP,要想让互联网的用户可以访问,必须在防火墙设置DNAT,把用户访问防火墙公网IP的请求包的目标地址转换为Web服务器的私网IP。

基于上一小节的网络配置,还需要以下的修改:

把第二台客户端改为Web服务器

# 安装Web服务器
yum install httpd -y

# 编写测试网页
echo 'Web server at 172.16.125.73' > /var/www/html/index.html

# 启动Web服务器
systemctl start httpd

配置防火墙

# 添加iptables规则
iptables -t nat -A PREROUTING -p tcp --dport 80 ! -s 172.16.125.0/24 \
            -j DNAT --to-destination 172.16.125.73

在客户端测试

$ curl 10.0.0.71
Web server at 172.16.125.73

在Web服务器查看访问日志

$ tail -f /var/log/httpd/access_log
- - - [30/Apr/2018:21:41:45 +0800] "GET / HTTP/1.1" 200 28 "" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

测试通过,DNAT已经实现。

Leave A Comment