iptables 防火墙(二)
iptables 防火墙(二)
- 一、SNAT 策略及应用
- SNAT 策略概述
- SNAT 策略的应用
- 二、DNAT 策略及应用
- DNAT 策略概述
- 三、规则的导出、导入
- 规则的备份及还原
- iptables-save 命令
- iptables-restore 命令
- 使用 iptables 服务
- 四、使用防火墙脚本
- 防火墙脚本的构成
- 防火墙脚本示例
- 五、总结
在上一篇文章中,我们初步了解了iptables防火墙的基本概念和基本使用方法。iptables是Linux系统下一款强大的网络数据包处理工具,它可以用来设置允许哪些数据包通过以及拒绝哪些数据包,并根据具体的规则来进行数据包过滤。本文将带大家进一步深入iptables的使用,包括更复杂的规则设置、链的管理以及高级应用技巧。
一、SNAT 策略及应用
SNAT 策略概述
SNAT策略的典型应用环境
- 局域网主机共享单个公网IP地址接入Internet
SNAT策略的原理
- 源地址转换,Source Network Address Translation
- 修改数据包的源地址
开启路由转发,未设置地址转换的情况
- 正常情况下,作为网关的 Linux 服务器必须打开路由转发,才能沟通多个网络。
- 未使用地址转换策略时,从局域网 PC(如 192.168.1.234)访问 Internet 的数据包经过网关转发后其源 IP 地址保持不变,
- 当 Internet 中的主机收到这样的请求数据包后,响应数据包将无法正确返回(私有地址不能在 Internet 中正常路由),从而导致访问失败
开启路由转发,并设置 SNAT 转换的情况
- 如果在网关服务器中正确应用 SNAT 策略,数据包转发情况就不一样了
SNAT 策略的应用
- SNAT 策略只能用在 nat 表的 POSTROUTING 链,
- 使用 iptables 命令编写 SNAT 策略时,需要结合“–to-source IP 地址”选项来指定修改后的源 IP 地址
- 如-j SNAT --to-source 218.29.30.31
共享固定 IP 地址上网
- Linux 网关服务器通过两块网卡 ens33、ens37 分别连接 Internet 和局域网,其中 ens33 的 IP 地址为 218.29.30.31,ens37 的 IP 地址为 192.168.1.1。
- 所有局域网 PC 的默认网关设为 192.168.1.1,且已经设置了正确的 DNS 服务器。
- 要求 192.168.1.0/24 网段的 PC 能够通过共享方式正常访问 Internet。
(1) 打开网关的路由转发。
- 对于 Linux 服务器,IP 转发是实现路由功能的关键所在,对应为/proc 文件系统中的ip_forward 设置,
- 当值为 1 时表示开启,为 0 时表示关闭。
- 若要使用 Linux 主机作为网关设备,必然需要开启路由转发。
# 永久打开路由转发功能
[root@localhost ~]# vi /etc/sysctl.conf
…… # 省略部分内容
net.ipv4.ip_forward = 1 # 将此行写入配置文件
[root@localhost ~]# sysctl -p # 读取修改后的配置
# 在测试过程中,若只希望临时开启路由转发,也可以执行以下操作。
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
# 或者
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
(2) 正确设置 SNAT 策略。
- 通过分析得知,需要针对局域网 PC 访问 Internet 的数据包采取 SNAT 策略,将源地址更改为网关的公网 IP 地址,
- 参考以下操作在网关中设置防火墙规则。
- 若要保持 SNAT 策略长期有效,应将相关命令写入到 rc.local 配置文件,以便开机后自动设置。
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j SN AT --to-source 218.29.30.31
(3) 测试 SNAT 共享接入结果。
- 上述操作完成以后,使用局域网中的 PC 就可以正常访问 Internet 中的网站了。
- 对于被访问的网站服务器来说,将会认为是网关主机218.29.30.31 在访问(可观察Web 日志获知),
- 而并不知道实际上是企业内网的 PC 192.168.1.234 在访问。
共享动态 IP 地址上网
二、DNAT 策略及应用
DNAT 策略概述
DNAT策略的典型应用环境
- 在Internet中发布位于企业局域网内的服务器
DNAT策略的原理
- 目标地址转换,Destination Network Address Translation
- 修改数据包的目标地址
进行DNAT转换后的情况
发布企业内部的 Web 服务器
(1) 打开网关的路由转发。
[root@gw ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@gw ~]# sysctl -p
net.ipv4.ip_forward = 1
(2) 正确设置 DNAT 策略。
[root@gw ~]# iptables -t nat -A PREROUTING -d 192.168.72.154 -p tcp --dport 2333 -j DNAT --to-destination 192.168.72.145:22
[root@gw ~]# iptables -t nat -A POSTROUTING -d 192.168.72.145 -p tcp --dport 22 -j SNAT --to 192.168.72.154
(3) 测试 DNAT 发布结果。
发布企业内部的 OpenSSH 服务器
(1) 配置 OpenSSH 服务。
(2) 打开网关的路由转发。
[root@gw ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@gw ~]# sysctl -p
net.ipv4.ip_forward = 1
(3) 正确设置 DNAT 策略。
[root@gw ~]# iptables -t nat -A PREROUTING -i ens33 -d 192.168.72.154 -p tcp --dport 3333 -j DNAT --to-destination 192.168.72.145:22
(4) 测试 DNAT 发布结果。
三、规则的导出、导入
规则的备份及还原
iptables-save 命令
- iptables-save 命令用来批量导出 Linux 防火墙规则。
- 直接执行 iptables-save 命令时, 将显示出当前启用的所有规则。
[root@gw ~]# iptables-save > iptables_kgc.txt # 备份所有表的规则
iptables-restore 命令
- iptables-retore 命令用来批量导入 Linux 防火墙规则
- 如果已经使用 iptables-save 命令导出的备份文件,则恢复规则的过程在一瞬间就能完成。
- 与 iptables-save 命令相对的iptables-restore 命令应结合重定向输入来指定备份文件的位置。
[root@gw ~]# iptables-restore < iptables_kgc.txt # 从备份文件恢复规则
使用 iptables 服务
自动启用防火墙规则
- 在服务器中调试好各种 iptables 规则以后,使用 iptables-save 备份为默认的规则配置文件/etc/sysconfig/iptables,然后就可以通过 iptables 服务来调用。
[root@gw ~]# yum -y install iptables-service # 下载 iptables-service
[root@gw ~]# cat iptables_kgc.txt > /etc/sysconfig/iptables # 备份导入到配置文件
[root@gw ~]# systemctl start iptables # 启动服务
[root@gw ~]# systemctl enable iptables # 设置开机自启动服务
清空所有防火墙规则
- 在调试各种防火墙规则的过程中,为了排除其他规则的干扰,有时候需要清空某些表的规则。
- 当需要一次清空所有表的规则时,停用 iptables 服务是最快捷的方法,也是最彻底的方法。
[root@gw ~]# systemctl stop iptables # 停止防火墙服务
[root@gw ~]# systemctl status iptables # 确认防火墙服务的状态
● iptables.service - IPv4 firewall with iptablesLoaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)Active: inactive (dead) since 一 2024-07-01 12:01:48 CST; 1s agoProcess: 9663 ExecStop=/usr/libexec/iptables/iptables.init stop (code=exited, status=0/SUCCESS)Process: 1692 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS)Main PID: 1692 (code=exited, status=0/SUCCESS)7月 01 10:48:48 gw systemd[1]: Starting IPv4 firewall with iptables...
7月 01 10:48:48 gw iptables.init[1692]: iptables: Applying firewall rules: [ 确定 ]
7月 01 10:48:48 gw systemd[1]: Started IPv4 firewall with iptables.
7月 01 12:01:48 gw systemd[1]: Stopping IPv4 firewall with iptables...
7月 01 12:01:48 gw iptables.init[9663]: iptables: Setting chains to policy ACCEPT: filter nat [ 确定 ]
7月 01 12:01:48 gw iptables.init[9663]: iptables: Flushing firewall rules: [ 确定 ]
7月 01 12:01:48 gw systemd[1]: Stopped IPv4 firewall with iptables.
四、使用防火墙脚本
防火墙脚本的构成
定义基本变量
- 将防火墙的网卡、IP 地址、局域网段、iptables 命令的路径等定义为变量,便于对脚本程序的维护和移植使用,特别是当规则较多的时候。
- 一旦网络环境发生变化(如公网 IP 地址变更),只需对变量值稍做修改就可以投入使用了。
[root@localhost ~]# vim /opt/myipfw.sh //创建脚本文件
#!/bin/bash
INET_IF= "ens33" //外网接口
INET_IP="218.29.30.31" //外网接口地址
LAN_IF="ens37" //内网接口
LAN_IP= "192.168.1.1" //内网接口地址
LAN_NET="192.168.1.0/24" //内网网段
LAN_WWW_IP="192.168.1.6" //网站服务器的内部地址
IPT="/sbin/iptables" //iptables 命令的路径
MOD="/sbin/modprobe" //modprobe 命令的路径
CTL="/sbin/sysctl" //sysctl 命令的路径
- 设置好相关的变量以后,在后续的脚本内容中就可以直接引用了。
- 为了提高脚本代码的 可读性,除了添加必要的注释之外,变量名称最好使用有一定含义的字符串。
加载内核模块
- 在 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 连接跟踪
调整/proc 参数
- /proc 是 Linux 或 UNIX 系统中的一种伪文件系统机制,提供了访问内核运行结构、改变内核设置的实时数据。
- 与 EXT3、FAT32 等本地文件系统不同,/proc 中的数据存放在内存中而不是硬盘上。
- 在文件夹/proc/sys 下存放着与系统相关的一些可控参数,可以直接用来改变内核的行为,通常作为 Linux 内核调优的实时入口。
- 其中包括是否打开 IP 转发、是否响应 ICMP 广播、设置好 TCP 响应超时等,使用 echo、sysctl 命令都可以修改相关参数,当然也可以写到/etc/sysctl.conf 文件(执行 sysctl -p 后生效)。
// 下面仅列出常用的几个/proc 参数调整,更多细节、调优操作此处不做过多介绍,有兴趣的同学请参阅其他资料。
$CTL -w net.ipv4.ip_forward=1 //打开路由转发功能
$CTL -w net.ipv4.ip_default_ttl=128 //修改ICMP 响应超时
$CTL -w net.ipv4.icmp_echo_ignore_all=1 //拒绝响应ICMP 请求
$CTL -w net.ipv4.icmp_echo_ignore_broadcasts //拒绝响应ICMP 广播
$CTL -w net.ipv4.tcp_syncookies=1 //启用SYN Cookie 机制
$CTL -w net.ipv4.tcp_syn_retries=3 //最大SYN 请求重试次数
$CTL -w net.ipv4.tcp_synack_retries=3 //最大ACK 确认重试次数
$CTL -w net.ipv4.tcp_fin_timeout=60 //TCP 连接等待超时
$CTL -w net.ipv4.tcp_max_syn_backlog=3200 //SYN 请求的队列长度
- 上述脚本内容中,ICMP 相关的参数调整可使本机忽略其他主机的 ping 测试,TCP 相关的内核参数调整可适当提高本机抵抗 DoS 攻击的能力。
设置具体的 iptables 规则
(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
(2) 设置规则链的默认策略。
- 在实际生产环境中,防火墙过滤规则建议采取“默认拒绝”的策略,可以获得更好的安全性。
- 这就要求我们充分熟悉相关应用服务、网络协议,才能够识别合法数据包,制定出既防 护严格又行之有效的防火墙方案。
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
(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_IP
(4) 设置 filter 表的各种规则。
- iptables 的 filter 表主要用来过滤数据包,无论是 Linux 网关还是一般的 Linux 服务器都可能用到。
- 主机型的防火墙主要使用 INPUT、OUTPUT 链,而对于网络型的防火墙主要使用 FORWARD 链。
$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 文件中。
[root@localhost ~]# chmod +x /opt/myipfw.sh //添加执行权限
[root@localhost ~]# /opt/myipfw.sh //执行脚本文件
[root@localhost ~]# iptables -nL FORWARD //查看部分防火墙规则
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 192.168.1.0/24 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpts:20:21
ACCEPT all -- 0.0.0.0/0 192.168.1.0/24 state RELATED,ESTABLISHED
[root@localhost ~]# vi /etc/rc.local //设置为开机自动执行
…… //省略部分内容
/opt/myipfw.sh
防火墙脚本示例
- 熟悉了防火墙脚本的基本构成之后,下面将展示一个简单的防火墙脚本文件——“主机型”防火墙脚本,主要针对具体的规则设置部分,内容仅供参考。
- 对于大多数的应用服务器,防火墙只需针对本机进行防护,因此 filter 表中的 INPUT、OUTPUT 链用得最多,特别是前者。例如,可将 OUTPUT 链的默认策略设为允许,不添加其他规则;将 INPUT 链的默认策略设为拒绝,只放行对个别服务(如 Web)的访问,以及响应本机访问请求的数据包。
[root@localhost ~]# vi /opt/myipfw.hostonly
#!/bin/bash
# 1. 定义基本变量IPT="/sbin/iptables" CTL="/sbin/sysctl" # 2. 调整/proc 参数
$CTL -w net.ipv4.tcp_syncookies=1
$CTL -w net.ipv4.tcp_syn_retries=3
$CTL -w net.ipv4.tcp_synack_retries=3
$CTL -w net.ipv4.tcp_fin_timeout=60
$CTL -w net.ipv4.tcp_max_syn_backlog=3200 # 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
[root@localhost ~]# chmod +x /opt/myipfw.hostonly
五、总结
iptables防火墙是Linux系统下一款强大的网络数据包处理工具,它可以根据数据包的源地址、目标地址、端口号、协议类型等信息来决定是否允许数据包通过。通过合理设置iptables的规则和链,我们可以实现复杂的网络访问控制需求。同时,iptables还支持日志记录、端口转发等高级功能,可以满足更复杂的网络应用需求。希望本文能够帮助大家更好地理解和使用iptables防火墙。