iptables
是Linux下著名的防火墙工具。虽然这么说,但是事实上iptables
是项目netfilter的一部分。netfilter
是位于操作系统内核空间的框架,而iptables
则为用户提供了操作这个框架的工具。
iptables
的主要功能包括数据包的过滤、数据包内容的修改以及网络地址转换(NAT)。为了正常发挥这些功能,就要对iptables
进行规则(rules)的配置。
iptables
有几个核心的概念:钩子(hooks),表(tables)和链(chains)。我们首先来看hooks的概念。hooks位于内核协议栈,经过机器的数据包会经过若干hook。具体来说,关系如下
Is target localhost?
+-----------------+ +----------------+ Y +--------------+
--------> |NF_IP_PRE_ROUTING| ----->|routing decision|----->|NF_IP_LOCAL_IN|
Incoming +-----------------+ +----------------+ +--------------+
| |
N | |
↓ ↓
+----------------+ +---------------+
| NF_IP_FORWARD | |local processes|
+----------------+ +---------------+
| |
| |
↓ ↓
+----------------+ +---------------+
|routing decision|<-----|NF_IP_LOCAL_OUT|
+----------------+ +---------------+
|
|
↓
+-------------------+
<---------------------| NF_IP_POST_ROUTING|
Outcoming +-------------------+
可以看到,图中共有5个netfilter hook
。对应节点和状态如下
需要特别说明的是,
hook
函数全部位于IP层,而IPV4和IPV6的IP层是不同的。因此上述hooks只针对IPV4,IPV6的配置需要使用ip6tables
。
显然,为了实现iptables
的功能,仅仅经过hook
是不够的。在经过每一个hook
时,还需要配置相应的规则(rule)。而这些规则,就由tables
分类管理。目前iptables
支持以下表:
connection tracking
(见下文)追踪。将上面提到的rule
注册到hook
上,就有了chain
的概念。因为有5个hook
,因此与之对应的,也有5个chain
。
tables
和chains
是多对多的关系,也即每个表中可以有多个链,每个链中也可以含多个表。并不是每个链都能包含所有的表。某些表对于某个链来说是多余或无意义的。在表/链中,都存在优先级的问题。
事实上,除了上述五个chain,iptables还允许用户自定义chain。但由于自定义chain没有与hook绑定,因此只能从内置的5个chain中跳转到自定义chain。
首先看每个链中可以包含哪些表。自上而下代表优先级自高到低。
PREROUTING
FORWARD
INPUT
OUTPUT
POST_ROUTING
connect tracking发生在PREROUTING和OUTPUT这两个环节。它将追踪每个数据包,维护连接状态,然后供其它的rule应用。
实际使用中,往往是以tables
为入口,对rules
进行操作。因此有必要考虑每个table
对应的chain
。
raw
mangle
nat
DNAT
SNAT
filter
讲过了hook
, chain
和tables
以及它们之间的关系,就可以解释具体的rule
了。每条rule
包括两部分信息:Matching和Targets。matching即匹配条件,它指出了如何匹配一个数据包。匹配条件包括协议类型、源/目的IP、源/目的端口、I/O接口、包头数据和连接状态等等。targets即匹配后的动作。一般可以进行的操作包括
本文作者:lovecatc
本文链接:https://lovecatc.com/index.php/archives/22/
最后修改时间:2020-09-20 07:53:26
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!