策划网站做推广的公司,官方新闻平台有哪些,宿迁做网站公司,和田网页设计防火墙——SNAT和DNAT策略的原理及应用、防火墙规则的备份、还原和抓包
#x1f49d;#x1f49d;#x1f49d;欢迎来到我的博客#xff0c;很高兴能够在这里和您见面#xff01;希望您在这里可以感受到一份轻松愉快的氛围#xff0c;不仅可以获得有趣的内容和知识…防火墙——SNAT和DNAT策略的原理及应用、防火墙规则的备份、还原和抓包
欢迎来到我的博客很高兴能够在这里和您见面希望您在这里可以感受到一份轻松愉快的氛围不仅可以获得有趣的内容和知识也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老 导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。 常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等 数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂 非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。 ✨✨ 欢迎订阅本专栏 ✨✨
目录
1、SNAT策略及应用
1.1、SNAT 策略概述
1.2、SNAT 策略的应用
2、DNAT 策略及应用
2.1、DNAT 策略概述
2.2、DNAT 策略的应用
3、规则的导出、导入
3.1、规则的备份及还原
3.2、使用 iptables 服务
4、使用防火墙脚本
4.1、防火墙脚本的构成
4.2防火墙脚本示例
1、SNAT策略及应用
Linux 防火墙在很多时候承担着连接企业内、外网的重任除了提供数据包过滤功能以外还提供一些基本的网关应用。本章将学习 Linux 防火墙的SNAT和DNAT 策略分别掌握两个典型的应用局域网共享一个公网 IP 地址接入 Internet向 Internet 发布位于内网的应用服务器。本章还将学习防火墙脚本的使用。首先介绍的是 SNAT 策略及应用 。
SNATSource Network Address Translation源地址转换是 Linux 防火墙的一种地址转换操作也是 iptables 命令中的一种数据包控制类型其作用是根据指定条件修改数据包的源 IP 地址。1.1、SNAT 策略概述
随着 Internet 网络在全世界范围内的快速发展IPv4 协议支持的可用 IP 地址资源逐渐变少资源匮乏使得许多企业难以申请更多的公网 IP 地址或者只能承受一个或者少数几个公网 IP 地址的费用。而与此同时大部分企业面临着将局域网内的主机接入 Internet 的 需求。
通过在网关中应用 SNAT 策略可以解决局域网共享上网的问题。下面以一个小型的企业网络为例。Linux 网关服务器通过两块网卡 ens33、ens37 分别连接 Internet 和局域网 如下图所示分析局域网主机访问 Internet 的情况。 局域网共享接入 Internet
1只开启路由转发未设置地址转换的情况
正常情况下作为网关的 Linux 服务器必须打开路由转发才能沟通多个网络。未使用地址转换策略时从局域网 PC如 192.168.1.234访问 Internet 的数据包经过网关转发后其源 IP 地址保持不变当 Internet 中的主机收到这样的请求数据包后响应数据包将无法正确返回私有地址不能在 Internet 中正常路由从而导致访问失败如下图所示 。 未设置 SNAT 转换时的访问情况
2开启路由转发并设置 SNAT 转换的情况
如果在网关服务器中正确应用 SNAT 策略数据包转发情况就不一样了。当局域网 PC 访问 Internet 的数据包到达网关服务器时会先进行路由选择若发现该数据包需要从外网接口如 ens33向外转发则将其源 IP 地址如 192.168.1.234修改为网关的外网接口地址如 218.29.30.31然后才发送给目标主机如 58.63.236.45。相当于从网关服务器的公网 IP 地址提交数据访问请求目标主机也可以正确返回响应数据包如下图所示。最终实现局域网PC 共享同一个公网 IP 地址接入 Internet。
在上述 SNAT 转换地址的过程中网关服务器会根据之前建立的 SNAT 映射将响应数据包正确返回局域网中的源主机。因此只要连接的第一个包被 SNAT 处理了那么这个连接及对应数据流的其他包也会自动地被进行 SNAT 处理。另一方面Internet 中的服务器并不知道局域网 PC 的实际 IP 地址中间的转换完全由网关主机完成一定程度上也起 到了保护内部网络的作用。 已设置 SNAT 转换时的访问情况 1.2、SNAT 策略的应用
从上一小节的介绍中我们大致可以了解SNAT 的典型应用是为局域网共享上网提供接入策略处理数据包的切入时机是在路由选择之后POSTROUTING进行。关键操作是将局域网外发数据包的源 IP 地址私有地址修改为网关服务器的外网接口 IP 地址公有地址。
SNAT 策略只能用在 nat 表的 POSTROUTING 链使用 iptables 命令编写 SNAT 策略 时需要结合“--to-source IP 地址”选项来指定修改后的源 IP 地址如-j SNAT --to-source 218.29.30.31。下面通过两个实例来说明 SNAT 策略的具体用法。
1共享固定 IP 地址上网
案例需求描述如下。 Linux 网关服务器通过两块网卡 ens224、ens160 分别连接 Internet 和局域网其中 ens224的 IP 地址为 192.168.119.1ens160的 IP 地址为 192.168.23.31。 所有局域网 PC 的默认网关设为 192.168.23.31且已经设置了正确的 DNS 服务器。 要求 192.168.23.0/24 网段的 PC 能够通过共享方式正常访问 Internet。 根据上述环境推荐的操作步骤如下。
1.1打开网关的路由转发。
对于 Linux 服务器IP 转发是实现路由功能的关键所在对应为/proc文件系统中的 ip_forward 设置当值为 1 时表示开启为 0 时表示关闭。若要使用 Linux 主机作为网关设 备必然需要开启路由转发。例如可以修改 sysctl.conf 配置文件永久打开路由转发功能。 [rootrhel01 ~]# vim /etc/sysctl.conf ...... //省略部分内容net.ipv4.ip_forward 1 //将此行写入配置文件[rootrhel01 ~]# sysctl -p //读取修改后的配置net.ipv4.ip_forward 1
在测试过程中若只希望临时开启路由转发也可以执行以下操作。
[rootrhel01 ~]# echo 1 /proc/sys/net/ipv4/ip_forward或者[rootrhel01 ~]# sysctl -w net.ipv4.ip_forward1net.ipv4.ip_forward 1
1.2正确设置 SNAT 策略。
通过分析得知需要针对局域网 PC 访问 Internet 的数据包采取 SNAT 策略将源地址更改为网关的公网 IP 地址参考以下操作在网关中设置防火墙规则。若要保持 SNAT 策略长期有效应将相关命令写入到 rc.local 配置文件以便开机后自动设置 。
[rootrhel01 ~]# iptables -t nat -A POSTROUTING -s 192.168.23.0/24 -o ens224 -j SNAT --to-source 192.168.119.1[rootrhel01 ~]# iptables -t nat -A POSTROUTING -s 192.168.23.0/24 -o ens224 -j SNAT --to-source 192.168.119.1
1.3测试 SNAT 共享接入结果。
上述操作完成以后使用局域网中的 PC 就可以正常访问 Internet 中的网站了。对于被访问的网站服务器来说将会认为是网关主机 192.168.119.1 在访问可观察 Web 日志获知 而并不知道实际上是企业内网的 PC 192.168.23.234 在访问 。
2共享动态 IP 地址上网
在某些情况下网关的外网 IP 地址可能并不是固定的如使用 ADSL 宽带接入时。那么在这种网络环境下应该如何设置 SNAT 策略呢针对这种需求iptables 命令提供了一 个名为 MASQUERADE伪装的数据包控制类型MASQUERADE 相当于 SNAT 的一个 特例同样用来修改伪装数据包源 IP 地址只不过它能够自动获取外网接口的 IP 地址 而无须使用“--to-source”指定固定的 IP 地址。
参照上一个 SNAT 案例若要使用 MASQUERADE 伪装策略只需去掉 SNAT 策略中的“--to-source IP 地址”然后改用“-j MASQUERADE”指定数据包控制类型。对于 ADSL 宽带连接连接名称通常为 ppp0、ppp1 等。
[rootrhel01 ~]# iptables -t nat -A POSTROUTING -s 192.168.23.0/24 -o ppp0 -j MASQUERADE
当然如果网关使用固定的公网 IP 地址最好选择 SNAT 策略而不是 MASQUERADE 策略以减少不必要的系统开销。 2、DNAT 策略及应用
DNATDestination Network Address Translation目标地址转换是 Linux 防火墙的另一种地址转换操作同样也是 iptables 命令中的一种数据包控制类型其作用是根据指定条件修改数据包的目标 IP 地址和目标端口。2.1、DNAT 策略概述
DNAT 策略与 SNAT 非常相似只不过应用方向相反。SNAT 用来修改源 IP 地址而 DNAT 用来修改目标 IP 地址和目标端口SNAT 只能用在nat 表的 POSTROUTING 链而 DNAT只能用在 nat 表的 PREROUTING 链和 OUTPUT 链或被其调用的链 中。
以下面这个小型企业网络为例考虑到应用的安全和稳定性公司将对外的网站服务器架设在一个内部网络中如下图所示公司对外只有一个公网 IP 地址又需要使 Internet 中的客户机能够访问公司的网站。 通过 DNAT 策略发布内网服务
在 Internet 环境中企业所注册的网站域名如 www.benet.com必须对应合法的公网 IP 地址如218.29.30.31。在这种情况下Internet 中的客户机将无法访问公司内网的服务器除非在网关服务器中正确设置 DNAT 策略。
使用 DNAT 策略的效果如下当 Internet 中的客户机提交的 HTTP 请求到达企业的网关服务器时网关首先判断数据包的目标地址和目标端口若发现该数据包需要访问本机的 80 端口则将其目标 IP 地址如 218.29.30.31修改为内网中真正的网站服务器的 IP 地址如 192.168.1.6然后才发送给内部的网站服务器如下图所示。
在上述 DNAT 转换地址的过程网关服务器会根据之前建立的 DNAT 映射修改返回的 HTTP 应答数据包的源 IP 地址最后再返回给 Internet 中的客户机。Internet 中的客户机并不知道企业网站服务器的真实局域网地址中间的转换完全由网关主机完成。通过设置恰当的 DNAT 策略企业内部的服务器就可以面向 Internet 提供服务了。
设置 DNAT 策略时的访问情况2.2、DNAT 策略的应用
从上一小节的介绍中我们大致可以了解 DNAT 的典型应用是在 Internet 中发布企业内部的服务器处理数据包的切入时机是在路由选择之前PREROUTING进行。关键操作是将访问网关外网接口 IP 地址公有地址的数据包的目标地址修改为实际提供服务的内 部服务器的 IP 地址私有地址。
使用 iptables 命令设置 DNAT 策略时需要结合“--to-destination IP 地址”选项来指定内 部服务器的 IP 地址如-j DNAT --to-destination 218.29.30.31。下面将通过两个实例来说明 DNAT 策略的用法。
1发布企业内部的 Web 服务器
案例需求描述如下 。 公司注册的网站域名为 www.benet.comIP 地址为 192.168.119.1网卡 ens224。 公司的网站服务器位于局域网内IP 地址为 192.168.23.10。 要求能够从 Internet 中通过访问www.benet.com 来查看公司的网站内容。 根据上述环境推荐的操作步骤如下。
1.1打开网关的路由转发。 [rootrhel01 ~]# vim /etc/sysctl.conf ...... //省略部分内容net.ipv4.ip_forward 1 //将此行写入配置文件[rootrhel01 ~]# sysctl -p //读取修改后的配置net.ipv4.ip_forward 1
1.2正确设置 DNAT 策略。
通过分析得知需要针对 Internet 中的任意主机访问网关 80 端口的数据包将目标地址修改为位于内网的网站服务器的 IP 地址网关的防火墙参考规则如下所示。
[rootrhel01 ~]# iptables -t nat -A PREROUTING -i ens224 -d 192.168.119.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.23.10
1.3测试 DNAT 发布结果。
在网站服务器 192.168.23.10中正确配置、启动 Web 服务并提供测试网页如在首页文件 index.html 中加入“Here is 192.168.23.10”的识别标记。然后通过 Internet 中的客户机访问网站 http://www.benet.com如果没有做 DNS 解析也可以直接访问 http://192.168.119.1 或者直接通过绑 host 方式实现在浏览器中看到的将会是实际由网站服务器 192.168.23.10 提供的页面内容。
2发布企业内部的 OpenSSH 服务
大多数情况下DNAT 策略只是用来修改数据包的目标 IP 地址但在需要时也可以修改目标端口号。例如在上面所示的案例结构中为了方便服务器的远程管理网关、网站服务器都配置了 OpenSSH 服务分别授权给不同的用户从 Internet 远程登录。
在这种情况下需要通过同一个公网 IP 地址 192.168.119.1 发布位于多台主机中的同一 种服务为了避免发生冲突就必须从端口上进行区分。案例需求描述如下。 网关的公网 IP 地址为 192.168.119.1在 2345 端口启用OpenSSH 服务。 网站服务器位于局域网内IP 地址为 192.168.23.10在 22 端口启用 OpenSSH 服务。 要求能够从 Internet 中远程管理网关服务器和网站服务器访问192.168.119.1的 2345 端口时对应网关服务器而访问 192.168.119.1的 2346 端口时对应网站服务器。
上述需求中通过公网 IP 地址192.168.119.1的 2345、2346 端口分别提供服务均未 使用默认的 22 端口安全性要更好一些。推荐的操作步骤如下。
2.1配置 OpenSSH 服务。
在网关、网站服务器中均开启 OpenSSH 服务分别使用 2345、22 端口。其中网关的 sshd 服务因直接面向 Internet因此不使用默认端口。
2.2打开网关的路由转发。 [rootrhel01 ~]# vim /etc/sysctl.conf ...... //省略部分内容net.ipv4.ip_forward 1 //将此行写入配置文件[rootrhel01 ~]# sysctl -p //读取修改后的配置net.ipv4.ip_forward 1
2.3正确设置 DNAT 策略。
通过分析得知网关本机的 sshd 服务直接面向 Internet因此不需要地址转换但网站服务器位于内网必须通过 DNAT 策略进行发布。在网关中设置防火墙规则修改访问 外网 IP 地址 2346 端口的数据包将目标地址改为 192.168.23.10将目标端口改为 22以便转发给网站服务器。
[rootrhel01 ~]# iptables -t nat -A PREROUTING -i ens224 -d 192.168.119.1 -p tcp --dport 2346 -j DNAT --to-destination 192.168.23.10:22
2.4测试 DNAT 发布结果。
前述步骤完成以后可以在 Internet 中进行 SSH 登录测试。例如可以使用 Linux 客 户机通过 ssh 命令分别访问 192.168.119.1 的 2345、2346 端口观察登录情况。3、规则的导出、导入
在 Linux 系统中iptables 为我们提供了批量备份与恢复规则的命令也提供了标准的 系统服务以便开启、关闭防火墙功能。3.1、规则的备份及还原
防火墙规则的批量备份、还原用到两个命令即 iptables-save 和 iptables-restore分别用来保存Save和恢复Restore 。
1iptables-save命令
iptables-save 命令用来批量导出 Linux 防火墙规则。直接执行 iptables-save 命令时 将显示出当前启用的所有规则。 [rootrhel01 ~]# iptables-save # Generated by iptables-save v1.8.4 on Fri Dec 29 10:37:53 2023*filter:INPUT ACCEPT [0:0]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [4383:267536]:LIBVIRT_INP - [0:0]:LIBVIRT_OUT - [0:0]:LIBVIRT_FWO - [0:0]:LIBVIRT_FWI - [0:0]:LIBVIRT_FWX - [0:0]-A INPUT -j LIBVIRT_INP-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT-A INPUT -p icmp -j ACCEPT-A INPUT -i lo -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT-A INPUT -j REJECT --reject-with icmp-host-prohibited-A FORWARD -j LIBVIRT_FWX-A FORWARD -j LIBVIRT_FWI-A FORWARD -j LIBVIRT_FWO-A FORWARD -j REJECT --reject-with icmp-host-prohibited-A OUTPUT -j LIBVIRT_OUT-A LIBVIRT_INP -i virbr0 -p udp -m udp --dport 53 -j ACCEPT-A LIBVIRT_INP -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT-A LIBVIRT_INP -i virbr0 -p udp -m udp --dport 67 -j ACCEPT-A LIBVIRT_INP -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT-A LIBVIRT_OUT -o virbr0 -p udp -m udp --dport 53 -j ACCEPT-A LIBVIRT_OUT -o virbr0 -p tcp -m tcp --dport 53 -j ACCEPT-A LIBVIRT_OUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT-A LIBVIRT_OUT -o virbr0 -p tcp -m tcp --dport 68 -j ACCEPT-A LIBVIRT_FWO -s 192.168.122.0/24 -i virbr0 -j ACCEPT-A LIBVIRT_FWO -i virbr0 -j REJECT --reject-with icmp-port-unreachable-A LIBVIRT_FWI -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT-A LIBVIRT_FWI -o virbr0 -j REJECT --reject-with icmp-port-unreachable-A LIBVIRT_FWX -i virbr0 -o virbr0 -j ACCEPTCOMMIT# Completed on Fri Dec 29 10:37:53 2023# Generated by iptables-save v1.8.4 on Fri Dec 29 10:37:53 2023*nat:PREROUTING ACCEPT [0:0]:INPUT ACCEPT [0:0]:POSTROUTING ACCEPT [0:0]:OUTPUT ACCEPT [0:0]:LIBVIRT_PRT - [0:0]-A PREROUTING -d 192.168.119.1/32 -i ens224 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.23.10-A PREROUTING -d 192.168.119.1/32 -i ens224 -p tcp -m tcp --dport 2346 -j DNAT --to-destination 192.168.23.10:22-A POSTROUTING -j LIBVIRT_PRT-A POSTROUTING -s 192.168.23.0/24 -o ens224 -j SNAT --to-source 192.168.119.1-A POSTROUTING -s 192.168.23.0/24 -o ppp0 -j MASQUERADE-A LIBVIRT_PRT -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN-A LIBVIRT_PRT -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535-A LIBVIRT_PRT -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADECOMMIT# Completed on Fri Dec 29 10:37:53 2023# Generated by iptables-save v1.8.4 on Fri Dec 29 10:37:53 2023*mangle:PREROUTING ACCEPT [0:0]:INPUT ACCEPT [0:0]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [0:0]:POSTROUTING ACCEPT [0:0]:LIBVIRT_PRT - [0:0]-A POSTROUTING -j LIBVIRT_PRT-A LIBVIRT_PRT -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fillCOMMIT# Completed on Fri Dec 29 10:37:53 2023[rootrhel01 ~]# 在 iptables-save 命令的输出信息中以“#”号开头的内容表示注释“*表名”表示所在的 表“:链名 默认策略”表示相应的链及默认策略具体的规则部分省略了命令名“iptables” 后面的“COMMIT”表示提交前面的规则设置。
由于 iptables-save 命令只是把规则内容输出到屏幕上因此当需要保存为固定的文件时还应该结合重定向输出的操作以完成备份。例如若要将当前已设置的所有防火墙规则备份为/opt/iprules_all.txt 文件可以执行以下操作。
[rootrhel01 ~]# iptables-save /opt/iprules_all.txt //备份所有表的规则
2iptables-restore 命令
iptables-retore 命令用来批量导入 Linux 防火墙规则如果已经使用 iptables-save 命令 导出的备份文件则恢复规则的过程在一瞬间就能完成。与 iptables-save 命令相对的 iptables-restore 命令应结合重定向输入来指定备份文件的位置。
[rootrhel01 ~]# iptables-restore /opt/iprules_all.txt //从备份文件恢复规则
3.2、使用 iptables 服务
通过名为 iptables 的系统服务可以快速启用、清空防火墙规则。iptables 服务使用的规则文件位于/etc/sysconfig/iptables 文件中配置格式与 iptables-save 命令输出的一致。
1自动启用防火墙规则
在服务器中调试好各种 iptables 规则以后使用 iptables-save 备份为默认的规则配置文件/etc/sysconfig/iptables然后就可以通过 iptables 服务来调用。例如执行以下操作将保存当前的防火墙规则并设置在每次开机后根据已保存的规则内容自动进行重建。 [rootrhel01 ~]# iptables-save /etc/sysconfig/iptables[rootrhel01 ~]# systemctl enable iptables[rootrhel01 ~]# systemctl list-unit-files | grep iptablesiptables.service enabled [rootrhel01 ~]#当需要启用/etc/sysconfig/iptables 文件中的规则设置时只需要启动 iptables 服务即可。[rootrhel01 ~]# systemctl start iptables //启动防火墙服务[rootrhel01 ~]# service iptables startRedirecting to /bin/systemctl start iptables.service[rootrhel01 ~]# 当需要启用/etc/sysconfig/iptables 文件中的规则设置时只需要启动 iptables 服务即可。 [rootrhel01 ~]# systemctl start iptables //启动防火墙服务[rootrhel01 ~]# service iptables startRedirecting to /bin/systemctl start iptables.service[rootrhel01 ~]# 也支持 service iptables start 方式启动实际上还是跳转到了 systemctl 方式
2清空所有防火墙规则
在调试各种防火墙规则的过程中为了排除其他规则的干扰有时候需要清空某些表的规则。当需要一次清空所有表的规则时停用 iptables 服务是最快捷的方法也是最彻底的方法。 [rootrhel01 ~]# systemctl stop iptables.service //停止防火墙服务[rootrhel01 ~]# systemctl status iptables.service //确认防火墙服务的状态● iptables.service - IPv4 firewall with iptablesLoaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)Active: inactive (dead) since Fri 2023-12-29 10:46:18 CST; 5s agoProcess: 3552 ExecStop/usr/libexec/iptables/iptables.init stop (codeexited, status0/SUCCESS)Main PID: 892 (codeexited, status0/SUCCESS)12月 29 09:41:12 rhel01 systemd[1]: Starting IPv4 firewall with iptables...12月 29 09:41:12 rhel01 iptables.init[892]: iptables: Applying firewall rules: [ 确定 ][rootrhel01 ~]#
4、使用防火墙脚本
本节将介绍防火墙脚本的应用防火墙脚本实际上是一个 Shell 脚本。4.1、防火墙脚本的构成
防火墙脚本的优势是便于使用 Shell 变量、程序控制逻辑另外其作为独立的文件在需要重用、移植使用时会非常方便这也是作为 Shell 脚本的强大之处。
常见的 Linux 防火墙脚本中通常包括变量定义、模块加载、/proc 调整、规则设置等多个部分过于简化的脚本可能仅包括规则设置部分下面分别进行介绍。
1定义基本变量
将防火墙的网卡、IP 地址、局域网段、iptables 命令的路径等定义为变量便于对脚本程序的维护和移植使用特别是当规则较多的时候。一旦网络环境发生变化如公网 IP 地址变更只需对变量值稍做修改就可以投入使用了。 [rootrhel01 ~]# vim /opt/myipfw.sh#!/bin/bash INET_IFens224 //外网接口INET_IP192.168.119.1 //外网接口地址LAN_IFens160 //内网接口LAN_IP192.168.23.31 //内网接口地址LAN_NET192.168.23.0/24 //内网接口网段LAN_WWW_IP192.168.23.10 //网站服务器的内部地址IPT/sbin/iptables // iptables命令的路径MOD/sbin/modprobe // modprobe命令的路径CTL/sbin/sysctl // sysctl命令的路径
设置好相关的变量以后在后续的脚本内容中就可以直接引用了。为了提高脚本代码的可读性除了添加必要的注释之外变量名称最好使用有一定含义的字符串。
2加载内核模块
在 CentOS 7.3 系统中iptables 命令的大部分模块都可以根据需要动态载入内核只有个别模块需要手动进行加载如与 FTP 发布相关的 ip_nat_ftp、ip_conntrack_ftp。但如 果需要启用的规则数量较多为了提高规则设置的效率保持防火墙的稳定性建议将用到的各种模块提前加载到内核中。 $MOD ip_tables //iptables 基本模块$MOD ip_conntrack //连接跟踪模块$MOD ipt_REJECT //拒绝操作模块$MOD ipt_LOG //日志记录模块$MOD ipt_iprange //支持 IP 范围匹配$MOD xt_tcpudp //支持 TCP、UDP 协议$MOD xt_state //支持状态匹配$MOD xt_multiport //支持多端口匹配$MOD xt_mac //支持 MAC 地址匹配$MOD ip_nat_ftp //支持 FTP 地址转换$MOD ip_conntrack_ftp //支持 FTP 连接跟踪 3调整/proc 参数
/proc 是 Linux 或 UNIX 系统中的一种伪文件系统机制提供了访问内核运行结构、改 变内核设置的实时数据。与 EXT3、FAT32 等本地文件系统不同/proc 中的数据存放在内存中而不是硬盘上。
在文件夹/proc/sys 下存放着与系统相关的一些可控参数可以直接用来改变内核的行为通常作为 Linux 内核调优的实时入口。其中包括是否打开 IP 转发、是否响应 ICMP 广 播、设置好 TCP 响应超时等使用 echo、sysctl 命令都可以修改相关参数当然也可以写 到/etc/sysctl.conf 文件执行 sysctl -p 后生效
下面仅列出常用的几个/proc 参数调整更多细节、调优操作此处不做过多介绍有兴趣的请参阅其他资料。 [rootrhel01 ~]# vim /etc/sysctl.conf $CTL -w net.ipv4.ip_forward 1 // 打开路由转发功能$CTL -w net.ipv4.ip_default_ttl128 //修改ICMP响应超时$CTL -w net.ipv4.icmp_echo_ignore_all1 //拒绝响应ICMP请求$CTL -w net.ipv4.icmp_echo_ignore_broadcasts //拒绝响应ICMP广播$CTL -w net.ipv4.tcp_syncookies1 //启用SYN Cookie机制$CTL -w net.ipv4.tcp_syn_retries3 //最大SYN请求重试次数$CTL -w net.ipv4.tcp_synack_retries3 //最大ACK确认重试次$CTL -w net.ipv4.tcp_fin_timeout60 //TCP 连接等待超时$CTL -w net.ipv4.tcp_max_syn_backlog3200 //SYN请求的队列长度
上述脚本内容中ICMP 相关的参数调整可使本机忽略其他主机的 ping 测试TCP 相 关的内核参数调整可适当提高本机抵抗 DoS 攻击的能力。
4设置具体的 iptables 规则
在脚本文件中建议按照不同的表、链来分块组织各种防火墙规则具体内容应根据用户的实际需求决定。
4.1清理已有的规则。
为了避免已有的防火墙规则造成干扰通常会预先安排一个“清理”操作删除所有表中用户自定义的链清空所有链内的规则。 $IPT -t filter –X //删除各表中自定义的链$IPT -t nat -X$IPT -t mangle -X$IPT -t raw -X$IPT -t filter –F //清空各表中已有的规则$IPT -t nat -F$IPT -t mangle -F$IPT -t
4.2设置规则链的默认策略
在实际生产环境中防火墙过滤规则建议采取“默认拒绝”的策略可以获得更好的安全性。这就要求我们充分熟悉相关应用服务、网络协议才能够识别合法数据包制定出既防 护严格又行之有效的防火墙方案。 $IPT -P INPUT DROP $IPT -P FORWARD DROP$IPT -P OUTPUT ACC
学习过程中建议采用“默认允许”的策略将默认策略中的 DROP 改为 ACCEPT以免在使用不完整的防火墙脚本时引起网络故障。
4.3设置 nat 表中的各种规则。
iptables 的 nat 表主要用在 Linux 网关服务器中一般的主机型防火墙方案很少会用到 nat 表。根据实际情况编写相应的 SNAT、DNAT 规则如局域网共享上网、发布内部 Web 服务器如果没有则跳过此部分。 $IPT -t nat -A POSTROUTING -s $LAN_NET -o $INET_IF -j SNAT --to-source $INET_IP $IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-dest ination $LAN_WWW_
4.4设置 filter 表的各种规则。
iptables 的 filter 表主要用来过滤数据包无论是 Linux 网关还是一般的 Linux 服务器都可能用到。主机型的防火墙主要使用 INPUT、OUTPUT 链而对于网络型的防火墙主要使用 FORWARD 链
以 Linux 网关为例在“默认拒绝”的前提下若要实现共享上网除了正常的 SNAT 策略以外还需要放行内网 PC 与 Internet 中 DNS、Web、FTP 等服务的通信。 $IPT -A FORWARD -s $LAN_NET -o $INET_IF -p udp --dport 53 -j ACCEPT$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp --dport 80 -j ACCEPT$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp --dport 20:21 -j ACCEPT$IPT -A FORWARD -d $LAN_NET -i $INET_IF -m state --state ESTABLISHED, RELATED -j ACCEPT…… //省略部分内
需要说明的是在实际应用过程中不要过于生硬地照搬他人脚本内容应根据实际情况进行有针对性的设计并做好整体测试避免因规则不当而导致网络通信故障。
脚本文件编写完成以后为其添加“x”可执行权限就可以用来批量设置防火墙规则了。 若要使脚本文件在每次开机后自动运行可以将脚本路径写入/etc/rc.local 文件中。 [rootrhel01 ~]# chmod x /opt/myipfw.sh 添加执行权限[rootrhel01 ~]# /opt/myipfw.sh //执行脚本文件[rootrhel01 ~]# iptables -nL FORWARD //查看部分防火墙规则Chain FORWARD (policy ACCEPT)target prot opt source destination ACCEPT udp -- 192.168.23.0/24 0.0.0.0/0 udp dpt:53ACCEPT tcp -- 192.168.23.0/24 0.0.0.0/0 tcp dpt:80ACCEPT tcp -- 192.168.23.0/24 0.0.0.0/0 tcp dpts:20:21ACCEPT all -- 0.0.0.0/0 192.168.1.0/24 state RELATED,ESTABLISHED[rootrhel01 ~]# vim /etc/rc.local //设置为开机自动执行...... //省略部分内容/opt/myipfw.sh 4.2防火墙脚本示例
熟悉了防火墙脚本的基本构成之后下面将展示一个简单的防火墙脚本文件——“主机 型”防火墙脚本主要针对具体的规则设置部分内容仅供参考。
对于大多数的应用服务器防火墙只需针对本机进行防护因此 filter 表中的 INPUT、 OUTPUT 链用得最多特别是前者。例如可将 OUTPUT 链的默认策略设为允许不添加 其他规则将 INPUT 链的默认策略设为拒绝只放行对个别服务如 Web的访问以及响应本机访问请求的数据包。 [rootrhel01 ~]# vim /opt/myipfw.hostonly# 1.定义基本变量IPT/sbin/iptablesCTL/sbin/sysctl# 2.调整/proc参数$CTL -w net.ipv4.tcp_syncookies1$CTL -w net.ipv4.tcp_syn_retries3$CTL -w net.ipv4.tcp_synack_retries3$CTL -w net.ipv4.tcp_fin_timeout60$CTL -w net.ipv4.tcp_max_syn_backlog3200# 3.设置具体的防火墙规则# 3.1 删除自定义链、清空已有规则$IPT -t filter -X$IPT -t nat -X$IPT -t mangle -X$IPT -t raw -X$IPT -t filter -F$IPT -t nat -F$IPT -t mangle -F$IPT -t raw -F# 3.2 定义默认策略$IPT -P INPUT DROP$IPT -P FORWARD DROP$IPT -P OUTPUT ACCEPT# 3.3 设置 filter 表中的各种规则$IPT -A INPUT -p tcp --dport 80 -j ACCEPT$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT[rootrhel01 ~]# chmod x /opt/myipfw.hostonly 以上防火墙脚本示例中仅列出其中最基础的一些规则。更多具体的规则设置取决于实际的应用需求还有待大家在实际工作中慢慢去体会逐渐融会贯通。 文章知识点与官方知识档案匹配可进一步学习相关知识