网络通信

聊聊Iptables 的五表五链
作者 洋芋编程 2023年04月06日 10:03

  概述

  iptables 是一个配置 Linux 内核防火墙的命令行工具,它基于内核的包过滤框架(packet filtering framework) netfilter, 主要用于管理数据包过滤和 NAT 规则。

  图片来源: https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg

  iptables 与协议栈内有包过滤功能的 hook 交 互来完成工作。这些内核 hook 构成了 netfilter 框架。每个进入网络系统的包(接收或发送)在经过协议栈时都会触发这些 hook, 程序可以通过注册 hook 函数的方式在一些关键路径上处理网络流量。iptables 相关的内核模块在这些 hook 点注册了处理函数,因此可以通过配置 iptables 规则来使得网络流量符合防火墙规则。

  理解 iptables 是学习 Docker, Kubernetes 等开源项目中网络功能实现的基础。

  规则

  规则 就是网络管理员预定义的条件,一般的定义为 如果数据包头符合当前条件,处理这个数据包,反之执行下一个判断条件, 规则 存储在内核空间的过滤表中,这些规则分别指定了 源地址、目的地址、传输协议(如TCP、UDP、ICMP)和 服务类型(如 HTTP、FTP 和 SMTP)等, 当数据包与 规则 匹配时,内核会执行具体的 行为。

  配置防火墙的主要工作就是添加、修改和删除规则。

  行为

  5链

  链 是数据包传播的路径,每一个 链 中可以有 N 个 规则 (N >= 0)。当数据包到达一个 链 时,iptables 就会从链中第一个规则开始检测, 如果数据包满足规则所定义的条件,系统会执行具体的 行为,否则 iptables 继续检查下一个规则。 如果数据包不符合链中任一个规则,iptables 就会根据该链预先定义的默认策略来处理数据包。

  5 表

  表有 N 个链,链有 N 个规则。

  大部分场景仅需使用 Filter 表 和 NAT 表。

  Raw 表

  Raw 表用于在 连接跟踪、NAT 和路由表处理之前 对数据包进行处理,包含 2 种内置链:

  • PREROUTING

  • OUTPUT

  因为优先级最高,所以如果使用了 Raw 表,那么在 Raw 表处理完后, 将跳过 NAT 表和 ip_conntrack 处理, 也就是避免了 连接跟踪、NAT 和路由表前置 处理。

  Filter 表

  Filter 是 iptables 的默认表,用于过滤数据包,如果没有定义表的情况下将使用 Filter 表,包含 3 种内置链:

  • INPUT

  • OUTPUT

  • FORWARD

  在 Filter 表中只允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改。

  NAT 表

  NAT 用于实现网络地址转换,包含 3 种内置链:

  • PREROUTING

  • POSTROUTING

  • OUTPUT

  Mangle 表

  Mangle 用于对指定数据包报头进行修改、标记或重定向,包含 5 种内置链:

  • INPUT

  • OUTPUT

  • FORWARD

  • PREROUTING

  • POSTROUTING

  Security 表

  Security 用于给包打上 SELinux 标记,以此影响 SELinux 或其他可以解读 SELinux 安全上下文的系统处理包的行为。这些标记可以基于单个包,也可以基于连接。

  表和链关系图

  表的检测优先级

  Raw -> Mangle -> Nat -> Filter

  图片来源: https://www.frozentux.net/iptables-tutorial/images/tables_traverse.jpg

  任何一个数据包必然经过 5 个链中的其中一个。

  • 一个数据包进入网卡时,首先进入 PREROUTING 链,内核根据数据包目的 IP 判断是否需要转发

  • 如果数据包是进入本机的,它就会沿着图向下移动,到达 INPUT 链,数据包到了INPUT链后,任何进程都会收到它,本机上程序可以发送数据包,这些数据包会经过 OUTPUT 链,然后到达 POSTROUTING 链输出

  • 如果数据包是转发出去的,且内核允许转发,数据包会经过 FORWARD 链,然后到达 POSTROUTING 链输出

  常用命令

  查看类

  操作类

  命令选项输入顺序

  示例

  以下命令在生产环境中谨慎使用。

  查看已添加的iptables规则

  清空当前的所有规则和计数

  设置默认规则

  开放指定端口

  白名单

  黑名单

  防止 SYN 洪水攻击

  小结

  撰写本文过程中,笔者发现中文内容几乎说的都是 四表五链,不知是作者刻意跳过 Security 表,还是抄袭导致的同质化太严重。 虽然 Security 表不是常用功能,但是我们不能忽略其存在。

  Reference

  • Traversing of tables and chains[1]

  • iptables(8) - Linux man page[2]

  • iptables[3]

  • iptables详解[4]

  • iptables command[5]

  • 深入理解 iptables 和 netfilter 架构[6]

  • iptables 基础知识与命令速查

  引用链接

  [1] Traversing of tables and chains: https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#TRAVERSINGOFTABLES[2] iptables(8) - Linux man page: https://linux.die.net/man/8/iptables

  [3] iptables: https://wiki.archlinuxcn.org/wiki/Iptables

  [4] iptables详解: https://lixiangyun.gitbook.io/iptables_doc_zh_cn/

  [5] iptables command: https://wangchujiang.com/linux-command/c/iptables.html

  [6] 深入理解 iptables 和 netfilter 架构: https://arthurchiao.art/blog/deep-dive-into-iptables-and-netfilter-arch-zh/

打开APP阅读全文
{{data.thematic.text}}

相关文章

加载中...

分享到

请使用浏览器的分享功能
分享到微信等