一篇文章搞懂 iptables
1. 什么是 iptables
netfilter/iptables
一般指 Linux 自带的包过滤防火墙,有两个组件:
- netfilter
: 属于 内核空间 的防火墙管理体系,是内核的一部分,一般不以 程序 或 文件 的形式存在,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
- iptables
: 属于 用户空间 的防火墙管理体系,位于 /sbin/iptables
目录下,用来管理 Linux 防火墙的命令程序。
2. 四表五链
总体说来,iptables是由 四表五链 组成。
四表 分别是
- raw : 主要用来决定是否对数据包进行状态跟踪,包括的规则链有:output
、prerouting
。
- mangle : 主要用来修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形、策略路由等,包括的规则链有:input
,output
、 forward
,prerouting
,postrouting
。
- nat : 用于网络地址转换(IP、端口),包括的规则链有:prerouting
,postrouting
和 output
。
- filter : 用于过滤数据包,包括的规则链有:input
,output
和forward
。
优先级:raw→mangle→nat→filter
五链 分别是
input
:当收到访问防火墙本机地址的数据包时,将应用此链中的规则。output
:当防火墙本机向外发送数据包时,将应用此链中的规则。forward
:当收到需要通过防火中转发给其他地址的数据包时,将应用此链中的规则。prerouting
:在对数据包做路由选择之前,将应用此链中的规则。postrouting
:在对数据包做路由选择之后,将应用此链中的规则。
3. 数据包过滤的匹配流程
入站数据流向
: 从外界到达防火墙的数据包,要先被prerouting
链处理 (是否修改数据包地址等)。之后,会进行路由选择,确认数据包的目标地址是否是防火墙本机。如果是,将传给INPUT
链进行处理 (决定是否允许通过等),通过以后再交给应用服务程序(比如 nginx)进行响应。转发数据流向
: 从外界到达防火墙的数据包,要先被prerouting
链处理。之后,会进行路由选择,数据包的目标地址是其他非本机的地址时,将传给forward
链进行处理 (是否转发或拦截),最后将交给postrouting
链行处理 (是否修改数据包的信息等)。出站数据流向
: 防火墙本机向外部地址发送的数据包,首先被output
链处理,然后在postrouting
链查进行处理(是否修改数据包的信息等)。
4. 规则链内部的匹配原则
- 按照第一条规则、第二条规则……的顺序进行匹配和处理。
- 按照
匹配到停止
的方式,如找到一条匹配的规则,将不再执行本链中后续的其他规则。 - 如果对比整个链也
找不到匹配的规则
时,将按照该规则链的默认策略进行处理。
5. 规则编写
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
-m iprange --dst-range
控制类型
| 触发动作 | 功 能 |
| ---------- | ------------------ |
| ACCEPT | 允许数据包通过 |
| DROP | 丢弃数据包,且不给任何回应信息 |
| REJECT | 拒绝数据包,必要时会给数据发送端一个响应信息 |
| LOG | 在/var/log/messages
文件中记录日志信息,然后将数据包传递给下一个地址 |
| DNAT | 目标地址转换 |
| SNAT | 源地址转换 |
| MASQUERADE | 地址欺骗 |
| REDIRECT | 重定向
6. 实际案例
- 查看规则列表(默认 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 (谨慎设置!!!)
sh iptables -P INPUT DROP iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 放行已建立的链接
- 设置 ipset DNAT
sh 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 < 文件名称