1. 引言
linux 3.5 版本内核开始集成一个 IP 信息包过滤系统 — iptables。 利用 iptables,我们可以很有效的控制 IP 信息包的过滤条件和防火墙配置。 他可以配置有状态的防火墙规则,通过发送或接收信息包所建立的连接的状态来对网络信息包进行过滤。 本文我们就从原理出发,详细介绍一下 iptables。
2. iptables 组件
iptables 包含 netfilter 与 iptables 两个组件,因此通常称为“netfilter/iptables”。
2.1. netfilter
netfilter 是 linux 操作系统内核的一个数据包处理模块,它作为一个通用的、抽象的框架。 提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。
如上图所示,netfilter 对网络传输的五个关键节点进行了过滤,每个 hook 函数都可以返回以下五种处理结果之一:
- NF_ACCEPT — 继续正常传输数据报。这个返回值告诉 Netfilter:到目前为止,该数据包还是被接受的并且该数据包应当被递交到网络协议栈的下一个阶段
- NF_DROP — 丢弃该数据报,不再传输
- NF_STOLEN — 模块接管该数据报,告诉Netfilter“忘掉”该数据报。该回调函数将从此开始对数据包的处理,并且Netfilter应当放弃对该数据包做任何的处理。但是,这并不意味着该数据包的资源已经被释放。这个数据包以及它独自的sk_buff数据结构仍然有效,只是回调函数从Netfilter 获取了该数据包的所有权
- NF_QUEUE — 对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)
- NF_REPEAT — 再次调用该回调函数,应当谨慎使用这个值,以免造成死循环
2.2. iptables
iptables 内核模块用来管理和操作所有的 netfilter hook 来实现网络信息包的过滤规则管理。
iptables 通过链的模式管理 netfilter 的所有 hook,所有经过某个关卡的报文,都将经过这条链上的所有规则,执行相应匹配的动作。 iptables 将所有的规则抽象为 4 个表来管理:
- filter表 — 负责过滤功能,防火墙
- nat表 — network address translation,网络地址转换功能
- mangle表 — 拆解报文,做出修改,并重新封装的功能
- raw表 — 关闭nat表上启用的连接追踪机制
iptables 表规则可应用的 netfilter hook 节点
- | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
---|---|---|---|---|---|
raw 表 | √ | X | X | √ | X |
mangle 表 | √ | √ | √ | √ | √ |
nat 表 | √ | √ | X | √ | √ |
filter 表 | X | √ | √ | √ | X |
3. iptables 规则
iptables 让我们可以配置一系列规则,iptables 内核模块通过指定的规则条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理。
3.1. 匹配条件
iptables 的规则匹配条件包含:
- 源地址 IP
- 目标地址 IP
- 来源端口
- 目标端口
- 协议类型
3.2. 处理动作
- ACCEPT — 允许数据包通过
- DROP — 直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应
- REJECT — 拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息
- SNAT — 源地址转换,解决内网用户用同一个公网地址上网的问题
- MASQUERADE — 是SNAT的一种特殊形式,适用于动态的、临时会变的ip上
- DNAT — 目标地址转换
- REDIRECT — 在本机做端口映射
- LOG — 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配
4. 参考资料
https://wangchujiang.com/linux-command/c/iptables.html。 https://wiki.archlinux.org/index.php/Iptables_(简体中文) http://man.linuxde.net/iptables。 https://www.jianshu.com/p/41d5cdbd6219?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation。 http://blog.chinaunix.net/uid-23069658-id-3160506.html。 http://www.zsythink.net/archives/1199。