一篇文章搞懂 iptables

语言: CN / TW / HK

1. 什么是 iptables

netfilter/iptables 一般指 Linux 自带的包过滤防火墙,有两个组件: - netfilter : 属于 内核空间 的防火墙管理体系,是内核的一部分,一般不以 程序文件 的形式存在,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。 - iptables : 属于 用户空间 的防火墙管理体系,位于 /sbin/iptables 目录下,用来管理 Linux 防火墙的命令程序。

2. 四表五链

总体说来,iptables是由 四表五链 组成。

table.png

四表 分别是 - raw : 主要用来决定是否对数据包进行状态跟踪,包括的规则链有:outputprerouting。 - mangle : 主要用来修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形、策略路由等,包括的规则链有:inputoutputforwardpreroutingpostrouting。 - nat : 用于网络地址转换(IP、端口),包括的规则链有:preroutingpostroutingoutput。 - filter : 用于过滤数据包,包括的规则链有:inputoutputforward

优先级:raw→mangle→nat→filter

五链 分别是

  • input:当收到访问防火墙本机地址的数据包时,将应用此链中的规则。
  • output:当防火墙本机向外发送数据包时,将应用此链中的规则。
  • forward:当收到需要通过防火中转发给其他地址的数据包时,将应用此链中的规则。
  • prerouting:在对数据包做路由选择之前,将应用此链中的规则。
  • postrouting:在对数据包做路由选择之后,将应用此链中的规则。

3. 数据包过滤的匹配流程

  • 入站数据流向 : 从外界到达防火墙的数据包,要先被 prerouting 链处理 (是否修改数据包地址等)。之后,会进行路由选择,确认数据包的目标地址是否是防火墙本机。如果是,将传给 INPUT 链进行处理 (决定是否允许通过等),通过以后再交给应用服务程序(比如 nginx)进行响应。
  • 转发数据流向 : 从外界到达防火墙的数据包,要先被 prerouting 链处理。之后,会进行路由选择,数据包的目标地址是其他非本机的地址时,将传给 forward 链进行处理 (是否转发或拦截),最后将交给postrouting 链行处理 (是否修改数据包的信息等)。
  • 出站数据流向 : 防火墙本机向外部地址发送的数据包,首先被output 链处理,然后在 postrouting 链查进行处理(是否修改数据包的信息等)。

1652346145(1).png

4. 规则链内部的匹配原则

  • 按照第一条规则、第二条规则……的顺序进行匹配和处理。
  • 按照 匹配到停止的方式,如找到一条匹配的规则,将不再执行本链中后续的其他规则。
  • 如果对比整个链也找不到匹配的规则时,将按照该规则链的默认策略进行处理。

5. 规则编写

image.png

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 | 显示规则在链中的顺序号 |

匹配条件

image.png

其他匹配方式

| 匹 配 方 式 | 选 项 示 例 | | ---------- | ------------------ | | 多端口匹配 | -m multiport --dports <端口列表>
-m multiport --sports <端口列表> | | IP 范围匹配 | -m iprange --src-range
-m iprange --dst-range | | MAC 地址匹配 | -m mac --mac-source | | 状态匹配 | -m conntrack --ctstate <连接状态> | | ipset 匹配 | -p tcp -m set --match-set dst -j REDIRECT --to-port |

控制类型

| 触发动作 | 功 能 | | ---------- | ------------------ | | 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 < 文件名称

其他参考文章: