0x01 iptables概念
iptables是Linux系统中强大的网络流量控制工具,它通过四种主要的表(raw、mangle、nat、filter)和五条链(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)来实现对数据包的过滤、修改和地址转换。
iptables、firewalld 和 ufw 都是用于管理 Linux 系统防火墙的工具,但它们的设计目标、使用方式和复杂性有所不同。它们都依赖于底层的 netfilter 框架来实现实际的网络包过滤和转发功能。真正实现防火墙功能的是内核中的 Netfilter 模块。Netfilter 在网络层的五个关键位置(即防火墙的“五链”)注册了钩子函数,用于抓取数据包,并根据 iptables 配置的规则进行匹配和处理(如 ACCEPT、DROP 等)。简而言之,iptables 负责配置规则,Netfilter 负责执行这些规则。

0x02 四表五链概念
1. 四种表
-
filter:负责数据包过滤(默认表)。
-
nat:用于网络地址转换(如源地址或目标地址修改)。
-
mangle:修改数据包内容(如 TTL、QoS、服务类型等)。
-
raw:决定数据包是否被状态跟踪机制处理。
2. 五种链
-
INPUT:处理进入防火墙的数据包。
-
OUTPUT:处理从防火墙外出的数据包。
-
FORWARD:处理需要转发的数据包。
-
PREROUTING:处理进入防火墙前的数据包(在路由决策之前)。
-
POSTROUTING:处理离开防火墙前的数据包(在路由决策之后)。
表与链的对应关系
-
filter 表:包含 INPUT、OUTPUT、FORWARD 链。
-
nat 表:包含 PREROUTING、POSTROUTING、OUTPUT 链。
-
mangle 表:包含所有五种链。
-
raw 表:包含 PREROUTING、OUTPUT 链。
0x03 数据包过滤的匹配流程
入站数据流向:从外界到达防火墙的数据包,要先被
prerouting 链处理 (是否修改数据包地址等)。之后,会进行路由选择,确认数据包的目标地址是否是防火墙本机。如果是,将传给
INPUT 链进行处理 (决定是否允许通过等),通过以后再交给应用服务程序(比如 nginx)进行响应。
转发数据流向:从外界到达防火墙的数据包,要先被
prerouting 链处理。之后,会进行路由选择,数据包的目标地址是其他非本机的地址时,将传给
forward 链进行处理 (是否转发或拦截),最后将交给
postrouting 链行处理 (是否修改数据包的信息等)。
出站数据流向: 防火墙本机向外部地址发送的数据包,首先被
output 链处理,然后在
postrouting 链查进行处理(是否修改数据包的信息等)。
0x05 规则链内部的匹配原则
按照第一条规则、第二条规则……的顺序进行匹配和处理。
按照 匹配到停止的方式,如找到一条匹配的规则,将不再执行本链中后续的其他规则。
如果对比整个链也找不到匹配的规则时,将按照该规则链的默认策略进行处理。
0x06 规则编写
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
表名 : 指定命令所操作的表,未指定表名时将默认使用filter表
管理选项 : 表示规则的操作方式,比如:插入、增加、删除、查看等
链名 : 指定命令所操作的链
匹配条件:指定要处理的数据包的特征,不符合指定条件的数据包不在处理;
控制类型:指数据包的处理方式,比如:允许、拒绝、丢弃等;
管理选项:
-
-A 添加防火墙规则
-
-D 删除防火墙规则
-
-I 插入防火墙规则
-
-N 新建(new-chain)一条用户自己定义的规则链
-
-F 清空防火墙规则
-
-L 列出添加防火墙规则
-
-R 替换防火墙规则
-
-E 重命名用户定义的链,不改变链本身
-
-Z 清空防火墙数据表统计信息
-
-X 删除指定表中用户自定义的规则链(delete-chain)
-
-P 设置链默认规则
-
-c 查看规则表详细信息(verbose)的信息
-
-n 使用数字形式(numeric)显示输出结果
-
--line-numbers 显示规则在链中的顺序号
匹配条件:
其他匹配方式:
-
多端口匹配 -m multiport --dports <端口列表>
-
-m multiport --sports <端口列表>
-
IP 范围匹配 -m iprange --src-range <IP范围>
-
-m iprange --dst-range <IP范围>
-
MAC 地址匹配 -m mac --mac-source <MAC地址>
-
状态匹配 -m conntrack --ctstate <连接状态>
-
ipset 匹配 -p tcp -m set --match-set <ipset_list> dst -j REDIRECT --to-port <port_num>
控制类型:
-
ACCEPT 允许数据包通过
-
DROP 丢弃数据包,且不给任何回应信息
-
REJECT 拒绝数据包,必要时会给数据发送端一个响应信息
-
LOG 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一个地址
-
DNAT 目标地址转换
-
SNAT 源地址转换
-
MASQUERADE 地址欺骗
-
REDIRECT 重定向
0x07 实际案例
# 查看规则列表(默认 filter 表)
iptables -L --line-numbers
# 清空所有规则(默认 filter 表)
iptables -F
# 内网(192.168.0.0/16) 开放 22/tcp
iptables -t filter -A INPUT -p tcp -s 192.168.0.0/16 --dport 22 -j ACCEPT
# 替换规则
iptables -t filter -R INPUT 1 -s 192.168.0.0/16 -j ACCEPT
# 设置默认策略 DROP (谨慎设置!!!)
iptables -P INPUT DROP
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 放行已建立的链接
# 设置 ipset DNAT
iptables -t nat -I PREROUTING -p tcp -m set --match-set vpn dst -j REDIRECT --to-port 1080
iptables -t nat -I PREROUTING -p udp -m set --match-set vpn dst -j REDIRECT --to-port 1080
## 其他
# 启动服务
systemctl start iptables
# 配置文件位置
/etc/sysconfig/iptables
# 批量导出 Linux 防火墙规则
iptables-save > 文件名称
# 批量导入 Linux 防火墙规则
iptables-restore < 文件名称
参考文章:
一篇文章搞懂 iptables
https://article.juejin.cn/post/7097589910374350861
iptables的四表五链为你开启“八卦阵”
https://zhuanlan.zhihu.com/p/355973143
Linux的三种防火墙对比(IPtables、Firewall、UFW)
https://zhuanlan.zhihu.com/p/685391929
发表评论