iptables 防火墙(二)

目录

前言

一、SNAT原理与应用

1、SNAT应用环境

2、SNAT原理

3、SNAT转换前提条件

4、NAT配置设置

5、SNAT转换

5.1  固定的公网IP地址

5.2  非固定的公网IP地址(共享动态IP地址)

二、DNAT原理与应用

1、DNAT应用环境

2、DNAT原理

3、DNAT转换前提条件

4、DNAT转换

4.1  发布内网的Web服务

4.2  发布时修改目标端口

三、实验

1、环境准备

1.1  给防火墙添加一块网卡,两块网卡改为VMnet 1

1.2  查看网卡

1.3  配置IP地址

1.4  设置防火墙规则

1.5  内网客户机设置

1.6  设置网卡

1.7  配置外部服务器

1.8  查看访问日志

2、防火墙shuai02配置SNAT

3、配置DNAT

4、设置防火墙DNAT

5、iptables规则保存

总结


前言

在实际生产应用中,防火墙的功能纷繁复杂,就像我们之前介绍的四表五链,以及数据包的流向,在实际应用中都是有着关键性的作用的。今天要介绍的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来实现外网访问内网。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


版权声明:本文为HB199753原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。