Linux 防火墙(二)(SNAT 与 DNAT 的原理及应用)(规则的导出与导入)
作者:互联网
文章目录
Linux 防火墙在很多时候承担着连接企业内、外网的重任,除了提供数据包过滤功能以外,还提供一些基本的网关应用
一、SNAT 的原理及应用
- SNAT(Source Network Address Translation,源地址转换)是 Linux 防火墙的一种地址转换操作,也是 iptables 命令中的一种数据包控制类型
- 其作用是根据指定条件修改数据包的源 IP 地址
1.概述
- 随着 Internet 网络在全世界范围内的快速发展,IPv4 协议支持的可用IP地址资源
逐渐变少,资源匮乏使得许多企业难以申请更多的公网 IP 地址,或者只能承受一个或者少数几个公网 IP 地址的费用 - 而与此同时,大部分企业面临着将局域网内的主机接入 Internet 的需求
- 通过在网关中应用 SNAT 策略,可以解决局域网共享上网的问题
- 下面假设一个小型的企业网络为例:Linux 网关服务器通过两块网卡 ens33、ens33:0 分别连接 Internet 和局域网
1.1 只开启路由转发,未设置地址转换的情况
- 正常情况下,作为网关的 Linux 服务器必须打开路由转发,才能沟通多个网络
- 未使用地址转换策略时,从局域网 PC 访问 Internet 的数据包经过网关转发后其源 IP 地址保持不变,当 Internet 中的主机收到这样的请求数据包后,响应数据包将无法正确返回(私有地址不能在 Internet 中正常路由),从而导致访问失败
1.2 开启路由转发,并设置 SNAT 转发的情况
- 如果在网关服务器中正确应用 SNAT 策略,数据包转发情况就不一样了
- 当局域网 PC 访问 Internet 的数据包到达网关服务器时,会先进行路由选择,若发现该数据包
需要从外网接口向外转发,则将其源 IP 地址修改为网关的外网接口地址,然后才发送给目标主机 - 相当于从网关服务器的公网 IP 地址提交数据访问请求,目标主机也可以正确返回响应数据包
- 最终实现局域网 PC 共享同一个公网 IP 地址接入 Internet
- 在上述 SNAT 转换地址的过程中,网关服务器会根据之前建立的 SNAT 映射,将响应数据包正确返回局域网中的源主机(怎么样,想到三层交换机了吗)
- 因此,只要连接的第一个包被 SNAT 处理了,那么这个连接及对应数据流的其他包也会自动地被进行 SNAT 处理
- 另一方面,Internet 中的服务器并不知道局域网 PC 的实际 IP 地址,中间的转换完全由网关主机完成,一定程度上也起到了保护内部网络的作用
2.应用
- SNAT 的典型应用是为局域网共享上网提供接入策略,处理数据包的切入时机是在路由选择之后(POSTROUTING)进行
- 关键操作是将局域网外发数据包的源 IP 地址(私有地址)修改为网关服务器的外网接口 IP 地址(公有地址)
- SNAT 策略只能用在 nat 表的 POSTROUTING 链,使用 iptables 命令编写 SNAT
策略时,需要结合“–to-source IP地址”选项来指定修改后的源 IP 地址
2.1 共享固定 IP 地址上网
2.1.1 打开网关的路由转发
- 对于 Linux 服务器,IP 转发是实现路由功能的关键所在,对应为/proc 文件系统
中的 ip_forward 设置,当值为 1 时表示开启,为 0 时表示关闭 - 若要使用 Linux 主机作为网关设备,必然需要开启路由转发
- 例如,可以修改 sysctl.conf 配置文件,永久打开路由转发功能
vim /etc/sysctl.conf
...
net.ipv4.ip_forward =1
#将此行写入配置文件,0改为1
sysctl -p #读取修改后的配置
#临时开启路由转发
echo 1> /proc/sys/net/ipv4/ip_forward
或
sysctl -w net.ipv4.ip_forward=1
2.1.2 正确设置 SNAT 策略
- 通过分析得知,需要针对局域网 PC 访问 Internet 的数据包采取 SNAT 策略,将源地址更改为网关的公网IP地址,参考以下操作在网关中设置防火墙规则
- 若要保持
SNAT 策略长期有效,应将相关命令写入到 rc.local 配置文件,以便开机后自动设置
iptables -t nat -A POSTROUTING -s 192.168.126.0/24 -o ens33 -j SNAT --to 12.0.0.1
或
iptables -t nat -A POSTROUTING -s 192.168.126.0/24 -o ens33 -j SNAT --to-source 12.0.0.1-12.0.0.10
#内网IP 出站 外网网卡 外网IP或地址池
2.1.3 测试 SNAT 共享接入结果
- 上述操作完成以后,使用局域网中的 PC 就可以正常访问 Internet 中的网站了
- 对
于被访问的网站服务器来说,将会认为是网关主机在访问(可观察 Web
日志获知),而并不知道实际上是企业内网的 PC 在访问
2.2 共享动态 IP 地址上网
- 在某些情况下,网关的外网 IP 地址可能并不是固定的,如使用 ADSL 宽带接入时
- 那么在这种网络环境下,应该如何设置 SNAT 策略呢?
- 针对这种需求,iptables 命
令提供了一个名为 MASQUERADE(伪装)的数据包控制类型 - MASQUERADE 相当
于 SNAT 的一个特例,同样用来修改(伪装)数据包源 IP 地址,只不过它能够自动获
取外网接口的 IP 地址,而无须使用“--to-source”指定固定的 IP 地址 - 参照上一个 SNAT 案例,若要使用 MASQUERADE 伪装策略,只需去掉 SNAT 策
略中的“-to-source IP地址”,然后改用“-j MASQUERADE”指定数据包控制类型
iptables-t nat -A POSTROUTING -s 192.168.126.0/24 -o ens33 -j MASQUERADE
- 当然,如果网关使用固定的公网 IP 地址,最好选择 SNAT 策略而不是 MASQUERADE 策略,以减少不必要的系统开销
二、DNAT 的原理及应用
- DNAT (Destination Network Address Translation, 目标地址转换)是 Linux 防火墙的另一种地址转换操作,同样也是 iptables 命令中的一种数据包控制类型
- 其作用是根据指定条件修改数据包的目标IP地址和目标端口
1.概述
- DNAT 策略与 SNAT 非常相似,只不过应用方向相反
- SNAT 用来修改源 IP 地址,而 DNAT 用来修改目标 IP 地址和目标端口
- SNAT 只能用在 nat 表的 POSTROUTING 链中,而 DNAT 只能用在 nat 表的 PREROUTING 链和 OUTPUT链(或被其调用的链)中
- 下面以一个小型企业网络为例,考虑到应用的安全和稳定性,公司将对外
的网站服务器架设在一个内部网络中,公司对外只有一个公网 IP 地址,
又需要使 Internet 中的客户机能够访问公司的网站 - 在 Internet 环境中,企业所注册的网站域名必须对应合法的公网 IP 地址,在这种情况下,Internet 中的客户机将无法访问公司内
网的服务器,除非在网关服务器中正确设置 DNAT 策略 - 使用 DNAT 策略的效果如下:当 Internet 中的客户机提交的 HTTP 请求到达企业的网关服务器时,网关首先判断数据包的目标地址和目标端口,若发现该数据包需要访问本机的 80 端口,则将其目标 IP 地址修改为内网中真正的网站服务器的 IP 地址,然后才发送给内部的网站服务
- 在上述 DNAT 转换地址的过程,网关服务器会根据之前建立的 DNAT 映射,修改返回的 HTTP 应答数据包的源 IP 地址,最后再返回给 Internet 中的客户机
- Internet 中的客户机并不知道企业网站服务器的真实局域网地址,中间的转换完全由网关主机完成
- 通过设置恰当的 DNAT 策略,企业内部的服务器就可以面向 Internet 提供服务了
2.应用
- 从上一小节的介绍中,我们大致可以了解 DNAT 的典型应用是在 Internet 中发布企业内部的服务器,处理数据包的切入时机是在路由选择之前(PREROUTING)进行
- 关键操作是将访问网关外网接口 IP 地址(公有地址)的数据包的目标地址修改为实际提供服务的内部服务器的 IP 地址(私有地址)
- 使用 iptables 命令设置 DNAT 策略时,需要结合“–to-destination IP地址”选项来指定内部服务器的 IP 地址(如 -j DNAT --to-destination IP地址)
2.1 发布企业内部的 Web 服务器
需求描述如下:
- 公司注册的网站域名为 www.xcf.com,IP 地址为 12.0.0.1(网关 ens33:0)
- 公司的网站服务器位于局域网内,IP 地址为 192.168.126.11
- 要求能够从 Internet 中通过访问 www.xcf.com 来查看公司的网站内容
- 根据上述环境,推荐的操作步骤如下:
2.1.1 打开网关的路由转发
vim /etc/sysctl.conf
...
net.ipv4.ip_forward =1
#将此行写入配置文件,0改为1
sysctl -p #读取修改后的配置
2.1.2 正确设置 DNAT 策略
- 通过分析得知,需要针对 Internet 中的任意主机访问网关80端口的数据包,将目标地址修改为位于内网的网站服务器的 IP 地址,网关的防火墙参考规则如下所示
iptables -t nat -A PREROUTING -i ens33:0 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.126.11
入站 外网网卡 外网IP 内网服务器IP
2.1.3 测试 DNAT 发布结果
- 在网站服务器 192.168.126.11 中正确配置、启动 Web 服务,并提供测试网页,如在首页文件 index.html 中加入识别标记
- 然后通过 Internet
中的客户机访问网站 http://www.xcf.com(如果没有做 DNS 解析,也可以直接访问
12.0.0.1) - 在浏览器中看到的将会是实际由网站服务器 192.168.126.11 提供的页面内容
2.3 发布时修改目标端口
#发布局域网内部的OpenssH服务器,外网主机需使用250端口进行连接
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.126.11:22
#在外网环境中使用SSH测试
ssh -p 250 root@12.0.0.1
#在外网环境中使用SSH测试
ssh -p 250 root@12.0.0.1
yum -y install net-tools #若没有ifconfig命令可提前使用yum进行安装
ifconfig ens33
#注意:使用DNAT时,同时还有配合SNAT使用,才能实现响应数据包的正确返回
#小知识扩展:
#主机型防火墙主要使用INPUT,OUTPUT链,设置规则时一般要详细的指定到端口
#网络型防火墙主要使用FORWARD链,设置规则时很少去指定到端口,一般指定到IP地址或者到网段即可
三、规则的导出与导入(即备份与恢复)
在 Linux 系统中, iptables 为我们提供了批量备份与恢复规则的命令,也提供了标准的系统服务以便开启、关闭防火墙功能
1.规则的备份及还原
- 防火墙规则的批量备份、还原用到两个命令,即 iptables-save 和 iptables-restore
- 分别用来保存(Save)和恢复(Restore)
1.1 iptables-save 命令
- iptables-save 命令用来批量导出 Linux 防火墙规则
- 直接执行 iptables-save save 命令时,将显示出当前启用的所有规则
iptables-save
- 在 iptables-save 命令的输出信息中,以“#”号开头的内容表示注释,“*表名”表示所在的表,”:链名 默认策略”表示相应的链及默认策略,具体的规则部分省略了命令名“iptables”,后面的“COMMIT”表示提交前面的规则设置
- 由于 iptables-save 命令只是把规则内容输出到屏幕上,因此当需要保存为固定的文件时,还应该结合重定向输出的操作以完成备份
- 例如,若要将当前已设置的所有防火墙规则备份为opt/ipt.txt 文件,可以执行以下操作
iptables-save > /opt/ipt.txt
#备份所有表的规则
1.2 iptables-restore 命令
- iptables-restore 命令用来批量导入 Linux 防火墙规则,如果已经使用 iptables-save 命令导出备份文件,则恢复规则的过程在一瞬间就能完成
- 与 iptables–save 命令相对的 iptables-restore 命令也应结合重定向输入来指定备份文件的位置
iptables-restore < /opt/ipt.txt
#从备份文件恢复规则
2.使用 iptables 服务
- 通过名为 iptables 的系统服务,可以快速启用、清空防火墙规则
- iptables 服务使用的规则文件位于 /etc/sysconfig/iptables 文件中,配置格式与 iptables-save 命令输出的一致
2.1 自动启用防火墙规则
- 在服务器中调试好各种 iptables 规则以后,使用 iptables-save 备份为默认的规则配置文件 etc/sysconfig/iptables,然后就可以通过 iptables 服务来调用
- 例如,执行以下操作将保存当前的防火墙规则,并设置在每次开机后根据已保存的规则内容自动进行重建
iptables-save > /etc/sysconfig/iptables
2.2 清空所有防火墙规则
- 在调试各种防火墙规则的过程中,为了排除其他规则的干扰,有时候需要清空某些表的规则
- 当需要一次清空所有表的规则时,停用 iptables 服务是最快捷的方法,也是最彻底的方法
systemctl stop iptables
#停止iptables服务会清空掉所有表的规则
systemctl start iptables
#启动iptables服务会自动还原/etc/sysconfig/iptables中的规则
标签:iptables,网关,DNAT,IP,地址,Linux,SNAT,数据包 来源: https://blog.csdn.net/weixin_51486343/article/details/113620934