iptables
防火墙
防火墙是一种网络安全系统,它位于内部网络与外部网络(如互联网)之间,通过实施预定义的安全策略来控制网络间的通信。防火墙的主要目标是保护内部网络资源免受未经授权的访问、攻击或潜在威胁,同时允许合法的通信流量顺畅流动。以下是防火墙概念的关键要点:
-
网络边界保护:
防火墙作为内部网络与外部网络之间的逻辑或物理屏障,隔离两个不同信任级别的网络环境,限制未经授权的外部实体对内部网络资源(如服务器、工作站、应用程序等)的直接访问。 -
访问控制:
防火墙基于预先设定的安全规则(策略)对进出网络的数据包进行检查。这些规则通常基于多种属性,如源和目的IP地址、端口号、协议类型、数据包的内容(深度包检测,DPI)、连接状态(如新建、已建立、相关联的状态包)等。防火墙据此允许或拒绝数据包的传输,确保只有符合安全策略的流量才能通过。 -
安全策略实施:
防火墙有助于集中管理和实施企业的网络安全政策。管理员可以根据组织的安全需求定义详细的访问控制列表(ACL),这些列表规定了哪些服务、用户或设备可以进行网络交互,以及在何种条件下进行交互。防火墙通过强制执行这些策略来强化网络的整体安全态势。 -
攻击防范与入侵检测:
防火墙具备一定的抗攻击能力,能够识别并阻断常见的网络攻击,如端口扫描、DoS/DDoS攻击、恶意软件传播等。一些防火墙还集成了入侵检测系统(IDS)或入侵防御系统(IPS)功能,能够实时监测并响应潜在的攻击行为。 -
日志记录与审计:
防火墙记录通过其接口的所有网络活动,生成详细的日志信息。这些日志可用于安全审计、故障排查、合规性检查以及威胁分析。通过对日志数据的分析,管理员可以发现异常行为、识别潜在安全漏洞,并对安全策略进行调整。 -
网络地址转换(NAT)与虚拟专用网(VPN)支持:
许多防火墙还具备NAT功能,通过隐藏内部网络的实际IP地址、使用单一的公共IP地址对外通信,增强网络匿名性和安全性。此外,防火墙常常集成VPN服务,提供加密的远程访问通道,使远程用户或分支机构能够安全地接入内部网络。 -
多形态部署:
防火墙可以以多种形式存在,包括硬件防火墙(专用设备)、软件防火墙(运行在通用操作系统上的软件)、云防火墙(云服务商提供的服务)、以及分布式防火墙(如主机防火墙,保护单个主机)等。根据组织规模、网络架构和安全需求,可以选择合适的防火墙类型或组合使用。
总的来说,防火墙是现代网络安全体系中的核心组件之一,通过实施严格的访问控制、提供安全服务以及监控网络活动,确保网络资源的安全性和数据通信的保密性、完整性和可用性。
iptables简介
iptables是Linux内核提供的一种强大的防火墙工具,用于对进出系统的网络数据包进行过滤、转换和跟踪。它工作在网络层(IPv4/v6)和传输层(TCP/UDP),通过规则链(chains)和规则(rules)的组合来实现复杂的网络访问控制策略。
iptables架构
iptables由以下四部分组成:
-
四表(Tables):iptables包含多个表,每个表负责不同的功能。常用表包括:
filter
表:用于过滤数据包,决定是否接受、丢弃或转发。nat
表:用于网络地址转换(NAT),如源地址转换(SNAT)、目的地址转换(DNAT)。mangle
表:用于修改数据包的特定标志位或TTL值,通常用于QoS或路由标记。raw
表:用于处理数据包的“原始”状态,避免触发某些连接跟踪机制。
优先级:
当数据包抵达防火墙时,将依次应用raw、mangle、nat和filter表中对应链内的规则(如果有)如下图所示
-
五链(Chains):
- PREROUTING链:数据包到达防火墙(网络接口)后,在进行路由决策前处理。
- INPUT链:数据包目的地为防火墙本机,且已通过路由决策,准备交付给本地进程前处理。
- FORWARD链:数据包目的地不是防火墙本机,需要通过防火墙转发至其他网络时处理。
- OUTPUT链:数据包由防火墙本机进程产生,即将离开防火墙前往网络接口时处理。
- POSTROUTING链:数据包已经通过路由决策,即将离开防火墙网络接口前处理。
数据包匹配流程
- 数据包到达防火墙:数据包从外部网络到达防火墙的某个网络接口。
- PREROUTING链:
- raw表:首先检查raw表中的规则。如果匹配到规则,可能会影响数据包的连接跟踪状态(如使用
-j NOTRACK
标记)。 - mangle表(可选):如果mangle表中有针对PREROUTING链的规则,数据包会在这里接受元数据的修改。
- nat表:进行DNAT(目标地址转换)操作。如果数据包的目的地址是防火墙内某一服务的公网映射地址,此时会将其目标地址改为内部实际地址。
- raw表:首先检查raw表中的规则。如果匹配到规则,可能会影响数据包的连接跟踪状态(如使用
- 路由决策:完成PREROUTING链处理后,内核进行路由选择,确定数据包的下一跳或目标接口。
- 根据数据包目的地的不同,进入相应链:
- INPUT链:如果数据包的目标是防火墙本机,进入INPUT链。
- mangle表(可选):可能再次进行元数据修改。
- filter表:执行入站安全策略,根据规则决定是否允许数据包到达本地进程。
- FORWARD链:如果数据包需要通过防火墙转发至其他网络,进入FORWARD链。
- mangle表(可选):可能进行QoS标记、策略路由等操作。
- filter表:执行转发安全策略,决定是否允许数据包转发。
- nat表(可选):在某些情况下,可能会进行SNAT(源地址转换)或DNAT操作。
- OUTPUT链:如果数据包由防火墙本机进程产生,即将发送至外部网络,进入OUTPUT链。
- mangle表(可选):可能进行元数据修改。
- nat表:进行SNAT操作,如源地址伪装,将源地址从私有IP改为公网IP。
- filter表:执行出站安全策略,决定是否允许数据包离开本机。
- INPUT链:如果数据包的目标是防火墙本机,进入INPUT链。
- POSTROUTING链:
- mangle表(可选):最后一次机会进行元数据修改。
- nat表:进行最终的SNAT(如果在FORWARD链中未处理)或MASQUERADE(动态SNAT)操作。
- 数据包转发或丢弃:经过上述链的处理后,数据包根据规则匹配结果进行相应操作:
- 允许通过:数据包被转发至下一跳或目标网络接口。
- 拒绝:数据包被丢弃,防火墙可能发送ICMP错误消息(如端口不可达、禁止等)通知发送方。
- 其他操作:如重定向、LOG记录等。
iptables的使用
在CentOS 7系统中使用iptables,需要了解其基本命令结构、规则管理、服务管理以及如何配置持久化规则。以下是在CentOS 7中使用iptables的步骤和注意事项:
1. 确认系统防火墙状态
由于CentOS 7默认使用的是firewalld作为防火墙管理工具,若要使用iptables,首先需要确认firewalld的状态并决定是否停用它:
systemctl status firewalld
如果firewalld正在运行,可以停止并禁用它以避免与iptables冲突:
systemctl stop firewalld.service
systemctl disable firewalld.service
2. 安装iptables及其服务支持
确保iptables和iptables-services包已安装:
yum install iptables-services
3. 管理iptables服务
启动iptables服务:
systemctl start iptables.service
设置iptables服务开机启动:
systemctl enable iptables.service
4. 配置iptables规则
iptables规则通过命令行直接操作,也可以编辑配置文件 /etc/sysconfig/iptables
来定制。规则的基本结构如下:
iptables [-t <表名>] [-A|I|D|R] <链名> [-i <入口设备>] [-o <出口设备>] [-p <协议>] [-s <源地址>] [-d <目标地址>] [-m <模块>] [--<模块参数>] [-j <目标动作>]
-
-t
:指定要操作的表(filter、nat、mangle、raw)。 -
-A
、-I
、-D
、-R
:分别表示追加、插入、删除、替换规则。 -
<链名>
:如INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING等。 -
-i
、-o
:指定数据包进入或离开的网络接口。 -
-p
:指定协议(如tcp、udp、icmp)。 -
-s
、-d
:指定源IP地址和目标IP地址。 -
-m
:加载额外的匹配模块,并指定其参数。 -
--<模块参数>
:匹配模块的具体参数,如端口范围、标志位等。- –sport 指定源端口号
- –dport 指定目的端口号
-
-j
:指定规则匹配时采取的动作(如ACCEPT、DROP、REJECT、LOG、REDIRECT等)。 -
–line-numbers:查看规则时,显示规则的序号
ps:iptables命令可以配合多种匹配模块(通过
-m
选项指定)来实现更精细的规则制定。以下是一些常用的iptables模块及其参数:1. state模块
用于匹配基于连接状态的数据包。常用参数包括:
-
--state [NEW, ESTABLISHED, RELATED, INVALID]
: 匹配具有指定连接状态的数据包。NEW
: 初始连接请求(如TCP SYN包)。ESTABLISHED
: 已经建立的连接。RELATED
: 与现有连接相关的数据包(如FTP数据连接)。INVALID
: 不符合已知连接状态的数据包。
2. string模块
用于匹配数据包载荷中的特定字符串。常用参数:
--algo [bm|kmp]
: 指定匹配算法(Boyer-Moore或Knuth-Morris-Pratt)。--string "pattern"
: 要匹配的字符串。--hex-string "hex_pattern"
: 要匹配的十六进制字符串。--fromoffset [offset]
: 从载荷的指定偏移处开始匹配。--tooffset [offset]
: 在载荷的指定偏移处结束匹配。
3. conntrack模块
扩展了对连接跟踪信息的匹配。常用参数:
--ctstate [STATE_LIST]
: 匹配具有指定连接跟踪状态的数据包,类似于state模块。--ctproto [PROTO]
: 匹配指定协议的连接跟踪信息。--ctorigsrc [ADDRESS]
: 匹配原始源地址。--ctorigdst [ADDRESS]
: 匹配原始目标地址。--ctreplsrc [ADDRESS]
: 匹配回复源地址。--ctrepldst [ADDRESS]
: 匹配回复目标地址。--ctorigsrcport [PORT]
: 匹配原始源端口。--ctorigdstport [PORT]
: 匹配原始目标端口。--ctreplsrcport [PORT]
: 匹配回复源端口。--ctrepldstport [PORT]
: 匹配回复目标端口。
4. limit模块
用于限制匹配数据包的速率。常用参数:
--limit [rate/second]
: 指定每秒允许通过的最大匹配数据包数量。--limit-burst [number]
: 设置初始突发包数,超出此数量后才开始限速。--limit-mask [mask]
: 用于多IP地址限速时的掩码。
5. multiport模块
用于匹配多个端口。常用参数:
--sports [port[,port]...]
: 匹配源端口列表。--dports [port[,port]...]
: 匹配目标端口列表。
6. tcp模块
针对TCP协议的特定参数。常用参数:
--syn
: 匹配TCP SYN包。--ack
: 匹配TCP ACK包。--fin
: 匹配TCP FIN包。--rst
: 匹配TCP RST包。--tcp-flags [mask] [match]
: 匹配特定TCP标志位。
7. udp模块
针对UDP协议的特定参数。虽然UDP协议相对简单,但使用udp模块可以确保只针对UDP数据包进行操作。
8. icmp模块
针对ICMP协议的特定参数。常用参数:
--icmp-type [type/code]
: 匹配指定类型的ICMP消息。
9. mac模块
匹配数据包的源MAC地址。常用参数:
--mac-source [MAC_ADDRESS]
: 匹配具有指定源MAC地址的数据包。
10. connbytes模块
根据连接的总字节数进行匹配。常用参数:
--connbytes [mode:]value
: 按照指定模式和数值进行匹配。mode
: 可以是packets
、bytes
、avgpkt
。value
: 要匹配的数值。
注意事项:
不指定表名时,默认指filter表
不指定链名时,默认指表内的所有链
除非设置链的默认策略,否则必须指定匹配条件
控制类型使用大写字母,其余均为小写 -
增加(Add)规则
使用iptables -A
(或iptables -I
)命令在指定链的末尾(或指定位置)添加一条新的规则。以下是一个示例:
# 允许来自特定IP(192.168.1.100)的TCP流量访问本机的SSH服务(端口22)
iptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
# 或者在链的开头插入规则(使用-I指定位置,如第1位)
iptables -I INPUT 1 -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
删除(Delete)规则
使用iptables -D
命令根据规则描述删除已存在的规则。通常需要尽可能精确地复制待删除规则的全部参数:
# 删除允许特定IP访问SSH服务的规则
iptables -D INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
删除指定序号的iptables规则:
-
查看现有规则及其序号: 使用以下命令列出您希望操作的链(如
INPUT
、OUTPUT
或FORWARD
)上的所有规则,并显示它们对应的序号:1iptables -L [chain] --line-numbers
例如,要查看
INPUT
链的规则及其序号:Bash
1iptables -L INPUT --line-numbers
-
删除指定序号的规则: 根据上一步得到的规则列表,确定要删除的规则的序号(例如,假设是序号为
X
的规则)。使用以下命令删除该规则:Bash
iptables -D [chain] [rule-number]
以删除
INPUT
链上的第X
条规则为例:Bash
iptables -D INPUT X
这样,指定序号的规则就会从指定的链中被删除。
注意:
-
删除规则前务必确认您正在操作正确的序号,避免误删其他重要规则。
-
如果您在操作
nat
表或特定的自定义链,请记得加上-t [table]
参数。例如,删除nat
表中PREROUTING
链的第X
条规则:iptables -t nat -D PREROUTING X
修改(Change)规则
iptables本身并不直接支持修改已存在的规则。要更改一条规则,通常需要先删除旧规则,再添加新规则。例如,要将上面允许特定IP访问SSH服务的规则更改为允许另一个IP(192.168.1.101)访问:
# 删除旧规则
iptables -D INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
# 添加新规则
iptables -A INPUT -s 192.168.1.101 -p tcp --dport 22 -j
5. 保存和应用规则
直接在命令行设置的iptables规则不会在系统重启后保留。要使其持久化,需要将当前规则保存到配置文件中:
service iptables save
或者:
iptables-save > /etc/sysconfig/iptables
6. 查看和清理规则
查看当前规则:
iptables -L [-t <表名>] [-v] [-n]
-v
:显示详细信息。-n
:使用数字形式而非域名解析IP地址。
清除所有规则:
iptables -F [-t <表名>]
7. 配置iptables日志记录
要启用iptables的日志记录功能,通常需要配置syslog服务(如rsyslog)并修改iptables规则以使用LOG目标动作。具体步骤包括:
- 在
/etc/rsyslog.conf
或其他相关配置文件中添加规则,指定iptables日志的存储位置和格式。 - 在iptables规则中使用
-j LOG
指定记录日志,可能还需要配合使用-m limit
模块限制日志速率。
8. 关闭SELinux
如果遇到与SELinux相关的访问限制问题,可以考虑暂时关闭SELinux以排除干扰。编辑/etc/selinux/config
,将SELINUX=enforcing
改为SELINUX=disabled
,然后重启系统。但请注意,这会降低系统的整体安全级别,建议在熟悉SELinux后配置适当的布尔值或策略以与iptables协同工作。
9. 升级iptables
确保iptables及相关组件保持最新,可以通过yum update iptables*
命令进行更新。
总结
在CentOS 7中使用iptables,需要先确认firewalld状态并决定是否停用,接着安装iptables服务支持包,启动并设置其开机启动。然后,通过iptables命令配置所需的安全规则,保存规则以实现持久化,并能查看和清理规则。如有需要,可以配置日志记录功能和管理SELinux设置。记得定期更新iptables以获取安全修复和新特性。