iptables详解
一、iptables
iptables是Linux内核中的一个功能强大的防火墙工具,用于设置、维护和检查内核的IPv4网络流量过滤规则。它基于Netfilter框架,允许系统管理员控制进出系统的网络流量,从而实现网络安全策略。iptables通过定义规则链(chains)和规则(rules)来匹配和处理网络数据包。
二、iptables基本概念
-
表(Tables):
- iptables中有多个表,每个表包含一组规则链。
- 常用的表有:
- filter表:用于一般的包过滤,包含INPUT、FORWARD、OUTPUT链。
- nat表:用于网络地址转换(NAT),包含PREROUTING、POSTROUTING、OUTPUT链。
- mangle表:用于修改数据包的服务类型、TTL等,包含PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING链。
- raw表:用于处理数据包之前,允许对数据包进行标记,包含PREROUTING、OUTPUT链。
- security表:用于强制访问控制(MAC)网络规则,例如SELinux。
-
链(Chains):
- 链是规则的有序集合,根据数据包的处理阶段进行分类。
- 常用的链有:
- INPUT链:处理进入本机的数据包。
- OUTPUT链:处理从本机发出的数据包。
- FORWARD链:处理经过本机转发的数据包。
- PREROUTING链:在进行路由选择前处理数据包(主要用于NAT)。
- POSTROUTING链:在进行路由选择后处理数据包(主要用于NAT)。
-
规则(Rules):
- 规则定义了匹配数据包的条件和处理动作。
- 匹配条件可以包括源IP地址、目的IP地址、协议类型、端口号等。
- 处理动作可以是ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)、LOG(记录)等。
-
目标(Targets):
- 当规则匹配时,iptables会执行指定的目标动作。
- 除了内置的目标(如ACCEPT、DROP),还可以自定义链作为目标,实现更复杂的处理逻辑。
三、iptables工作原理
-
数据包处理流程:
- 当数据包进入或离开系统时,iptables会根据数据包的类型和当前所处的处理阶段,将其引导至相应的链中。
- 链中的规则会按顺序逐一匹配数据包,一旦找到匹配的规则,iptables就会执行该规则指定的目标动作。
- 如果数据包未匹配到任何规则,iptables会根据链的默认策略(policy)来决定如何处理数据包。
-
规则匹配顺序:
- 规则在链中是按顺序匹配的,因此规则的顺序非常重要。
- 一旦找到匹配的规则,iptables就会停止继续匹配后续规则。
-
默认策略:
- 每个链都有一个默认策略,用于处理未匹配到任何规则的数据包。
- 常见的默认策略有ACCEPT(接受)和DROP(丢弃)。
四、iptables命令使用
-
基本命令结构:
iptables [-t 表名] 命令 [链名] [规则] [-j 目标]
-t
:指定要操作的表(默认为filter表)。命令
:用于管理规则,如-A
(追加规则)、-D
(删除规则)、-I
(插入规则)、-L
(列出规则)等。链名
:指定要操作的链(如INPUT、OUTPUT等)。规则
:定义匹配条件,如-s
(源IP地址)、-d
(目的IP地址)、-p
(协议类型)等。-j
:指定目标动作(如ACCEPT、DROP等)。
-
常用命令示例:
-
追加规则:
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT
允许来自192.168.1.0/24网段的TCP 80端口访问。
-
删除规则:
iptables -D INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT
删除上述追加的规则。
-
插入规则:
iptables -I INPUT 1 -s 192.168.1.1 -j DROP
在INPUT链的条位置插入一条规则,丢弃来自192.168.1.1的数据包。
-
列出规则:
iptables -L -v -n
列出所有规则,并显示详细信息和数字格式的地址/端口。
-
保存规则:
service iptables save
或
iptables-save > /etc/iptables/rules.v4
保存当前规则到配置文件中,以便系统重启后自动加载。
-
五、iptables规则示例
-
允许SSH访问:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-
允许HTTP和HTTPS访问:
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
-
丢弃来自特定IP的访问:
iptables -A INPUT -s 192.168.1.100 -j DROP
-
限制每秒SSH连接数:
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
-
启用IP转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
并在nat表中添加SNAT规则:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
六、iptables高级功能
-
状态跟踪:
- 使用
-m state
模块匹配连接状态(NEW、ESTABLISHED、RELATED、INVALID)。 - 示例:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- 使用
-
字符串匹配:
- 使用
-m string
模块匹配数据包内容中的特定字符串。 - 示例:
iptables -A INPUT -p tcp --dport 80 -m string --string "evil_hack" --algo bm -j DROP
- 使用
-
时间匹配:
- 使用
-m time
模块根据时间条件匹配数据包。 - 示例:
iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 17:00:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
- 使用
-
自定义链:
- 创建自定义链以处理复杂的规则逻辑。
- 示例:
iptables -N MY_CHAIN iptables -A INPUT -p tcp --dport 80 -j MY_CHAIN iptables -A MY_CHAIN -s 192.168.1.0/24 -j ACCEPT iptables -A MY_CHAIN -j DROP
七、iptables注意事项
-
规则顺序:
- 规则的顺序非常重要,错误的顺序可能导致意外的结果。
-
性能影响:
- 复杂的规则集可能会影响系统性能,应合理优化规则。
-
备份规则:
- 在修改规则前,应备份当前规则,以便在出现问题时恢复。
-
防火墙日志:
- 启用防火墙日志记录,以便在出现问题时进行排查。
-
与firewalld的关系:
- 在CentOS 7及以后版本中,firewalld提供了更高级的防火墙管理功能,但iptables仍然是一个强大且灵活的工具。
八、iptables与firewalld的比较
-
iptables:
- 直接操作内核的Netfilter框架。
- 规则配置灵活,但需要手动管理。
- 适用于需要精细控制网络流量的场景。
-
firewalld:
- 提供了动态管理防火墙的功能。
- 支持区域(zones)和服务(services)的概念,简化了配置。
- 适用于需要快速部署和管理防火墙的场景。