一篇文章搞懂 iptables

1,343 阅读5分钟

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 <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重定向

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 (谨慎设置!!!)
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 < 文件名称

其他参考文章: