目录
前言
在实际生产应用中,防火墙的功能纷繁复杂,就像我们之前介绍的四表五链,以及数据包的流向,在实际应用中都是有着关键性的作用的。今天要介绍的SNAT和DNAT就是构建防火墙规则中几个个重要应用。
一、SNAT原理与应用
1、SNAT应用环境
局域网主机共享单个公网IP地址接入Internet(私有IP不能在Internet中正常路由)。
2、SNAT原理
修改数据包的源地址(源地址转换)。
3、SNAT转换前提条件
局域网各主机已正确设置IP地址、子网掩码、默认网关地址;
Linux网关开启IP路由转发 ;
4、NAT配置设置
临时打开:
echo 1 > /proc/sys/net/ipv4/ip_forward
或sysctl -w net.ipv4.ip_forward=1
永久打开:
vim /etc/sysctl.conf #进入配置文件路径
net.ipv4.ip_forward = 1 #将此行写入配置文件
sysctl -p #读取修改后的配置
5、SNAT转换
5.1 固定的公网IP地址
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j SNAT --to 12.0.0.1
或 可换成单独IP 出站外网网卡 外网IP
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j SNAT --to-source 12.0.0.1-12.0.0.10 内网IP 出站 外网网卡 外网IP或地址池
5.2 非固定的公网IP地址(共享动态IP地址)
iptables -t nat -A POSTROUTING -S 192.168.80.0/24-0 ens33 -j MASQUERADE
小知识扩展:一个IP地址做SNAT转换,一般可以让内网100到200台主机实现上网。
二、DNAT原理与应用
1、DNAT应用环境
在 Internet中发布位于局域网内的服务器
2、DNAT原理
修改数据包的目的地址。
3、DNAT转换前提条件
局域网的服务器能够访问 Internet
网关的外网地址有正确的Ds解析记录
Linux网关开启路由转发
vim /etc/sysctl. conf
net. ipv4. ip forward
sysctl -p #读取修改后的配置
4、DNAT转换
4.1 发布内网的Web服务
#把从ens33进来的要访问web服务的数据包目的地址转换为192.168.108.25
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.108.25
或
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.108.25
入站 外网网卡 外网IP 内网服务器IP
iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to 192.168.108.20-192.168.108.100
4.2 发布时修改目标端口
#发布局域网内部的OpenSSH服务器,外网主机需使用250端口进行连接
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.108.25:22
#在外网环境中使用ssH测试
ssh -p 250 root@12.0.0.1
yum -y install net-tools
#若没有ifconfig命令可提前使用yum进行安装
ifconfig ens33
注意:使用DNAT时,同时还有配合SNAT使用,才能实现响应数据包的正确返回
小知识扩展:
主机型防火墙 主要使用 INPUT、OUTPUT 链,设置规则时一般要详细的指定到端口
网络型防火墙 主要使用 FORWARD 链,设置规则时很少去指定到端口,一般指定到IP地址或者到网段即可
三、实验

实验环境 :
准备三台 centos 7
shuai01作为内网客户机IP:192.168.138.10
shuai02作为中间防火墙双网卡IP:192.168.138.1
IP:12.0.0.1
shuai03作为外网服务器IP:12.0.0.12
1、环境准备
1.1 给防火墙添加一块网卡,两块网卡改为VMnet 1
1.2 查看网卡
[root@shuai02 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 20.0.0.88 netmask 255.255.255.0 broadcast 20.0.0.255
inet6 fe80::20c:29ff:febd:4f59 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:bd:4f:59 txqueuelen 1000 (Ethernet)
RX packets 14389 bytes 7580304 (7.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3040 bytes 286617 (279.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:bd:4f:63 txqueuelen 1000 (Ethernet)
RX packets 39 bytes 2436 (2.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 59 bytes 9746 (9.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
1.3 配置IP地址
//复制一份网卡改为ens36 -p:保持原有属性
[root@shuai02 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
//编辑ens36网卡
[root@shuai02 network-scripts]# vim ifcfg-ens36
//重启网卡
[root@shuai02 network-scripts]# service network restart
Restarting network (via systemctl): [ 确定 ]
[root@shuai02 network-scripts]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.138.1 netmask 255.255.255.0 broadcast 192.168.138.255
inet6 fe80::8920:f7fe:5a7b:1356 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:bd:4f:59 txqueuelen 1000 (Ethernet)
RX packets 14451 bytes 7597582 (7.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3099 bytes 292919 (286.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 12.0.0.1 netmask 255.255.255.0 broadcast 12.0.0.255
inet6 fe80::8076:14d2:adce:b054 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:bd:4f:63 txqueuelen 1000 (Ethernet)
RX packets 90 bytes 7924 (7.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 202 bytes 33519 (32.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
//已经修改好了 36网卡作外网段 33作为内网段
[root@shuai02 network-scripts]# vim /etc/sysctl.conf
//允许对方能够访问就要开启数据转发
1.4 设置防火墙规则
[root@shuai02 network-scripts]# sysctl -p //加载参数
net.ipv4.ip_forward = 1
[root@shuai02 network-scripts]# iptables -F //清空防火墙
[root@shuai02 network-scripts]# iptables -t nat -F //自行添加规则
[root@shuai02 network-scripts]# iptables -L //查看条目是否清空
1.5 内网客户机设置

1.6 设置网卡
[root@shuai01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
//重启网卡
[root@shuai01 ~]# service network restart
Restarting network (via systemctl): [ 确定 ]
[root@shuai01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.138.10 netmask 255.255.255.0 broadcast 192.168.138.255
inet6 fe80::fce1:77f:7a9:b103 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:84:c1:e3 txqueuelen 1000 (Ethernet)
RX packets 8981 bytes 934213 (912.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4428 bytes 448953 (438.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
//ping一下网关查看连接性
[root@shuai01 ~]# ping 192.168.138.1
PING 192.168.138.1 (192.168.138.1) 56(84) bytes of data.
64 bytes from 192.168.138.1: icmp_seq=1 ttl=128 time=0.212 ms
64 bytes from 192.168.138.1: icmp_seq=2 ttl=128 time=0.298 ms
64 bytes from 192.168.138.1: icmp_seq=3 ttl=128 time=0.264 ms
....省略
//ping外网网关
[root@shuai01 ~]# ping 12.0.0.1
PING 12.0.0.1 (12.0.0.1) 56(84) bytes of data.
64 bytes from 12.0.0.1: icmp_seq=1 ttl=64 time=0.918 ms
64 bytes from 12.0.0.1: icmp_seq=2 ttl=64 time=0.505 ms
64 bytes from 12.0.0.1: icmp_seq=3 ttl=64 time=1.41 ms
....省略
1.7 配置外部服务器
[root@shuai03 ~]# yum -y install httpd //安装httpd服务
[root@shuai03 ~]# systemctl start httpd //重启服务
[root@shuai03 ~]# iptables -F //清空防火墙
[root@shuai03 ~]# iptables -t nat -F
[root@shuai03 ~]# systemctl start network //重启网卡局域网主机已经可以访问外部服务器的web界面

1.8 查看访问日志
[root@shuai03 ~]# cd /var/log/httpd
[root@shuai03 httpd]# ls
access_log error_log
[root@shuai03 httpd]# cat access_log 可以清楚的看到是内部主机IP访问了外网
2、防火墙shuai02配置SNAT
NAT转换 把内部IP192.168.138.10变为外部接口地址为12.0.0.1去访问外部服务
[root@shuai02 ~]# iptables -t nat -I POSTROUTING -s 192.168.138.10 -o ens36 -j SNAT --to-source 12.0.0.1
切换shuai01客户机刷新访问界面
转到shuai03外部服务器查看访日志 已经变为外部接口地址12.0.0.1了
3、配置DNAT
内部shuai01要做一个网站,由于是VM1,我们需要自己本地 源,创建一个yum仓库
[root@shuai01 ~]# cd /etc/yum.repos.d/
[root@shuai01 yum.repos.d]# ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo
[root@shuai01 yum.repos.d]# mkdir bak
[root@shuai01 yum.repos.d]# mv *.repo bak
[root@shuai01 yum.repos.d]# ls
bak
[root@shuai01 yum.repos.d]# vim shuai.repo
[shuai]
name=test //仓库名称
baseurl=file:///mnt //仓库软件源头
enabled=1 //开启yum仓库
gpgcheck=0 //关闭密钥检查
[root@shuai01 yum.repos.d]# mount /dev/sr0 /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@shuai01 yum.repos.d]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
...省略
/dev/sr0 iso9660 4.3G 4.3G 0 100% /mnt
[root@shuai01 yum.repos.d]# yum list //加载仓库
[root@shuai01 yum.repos.d]# yum -y install httpd //下载服务
[root@shuai01 yum.repos.d]# vim /var/www/html/index.html
<h1>I am a handsome boy</h1>
[root@shuai01 yum.repos.d]# systemctl start httpd //启动服务
设置好检查自己是否能否访问
4、设置防火墙DNAT
[root@shuai02 ~]# iptables -t nat -I PREROUTING -d 12.0.0.1 -i ens36 -p tcp --dport 80 -j DNAT --to-destination 192.168.138.10
//shuai01清空防火墙
[root@shuai02 ~]# iptables -F
[root@shuai02 ~]# iptables -t nat -F
//这边内网的防火墙一定别忘记清空
5、iptables规则保存
[root@shuai02 ~]# iptables-save > /opt/1.txt
[root@shuai02 ~]# cd /opt
[root@shuai02 opt]# ls
1.txt rh
[root@shuai02 opt]# vim 1.txt //查看规则
//我们把规则清空
[root@shuai02 opt]# iptables -F
[root@shuai02 opt]# iptables -t nat -F
在用shuai03访问一下shuai01

//直接找回就行
[root@shuai02 opt]# iptables-restore < /opt/1.txt
//查看规则已经回来了
[root@shuai02 opt]# iptables -t nat -L 
总结
通过本文总结,了解什么是SNAT和DNAT,以及如何配置SNAT和DNAT来实现外网访问内网。