前言
在linux内核中,通常集成了带有封包过滤和防火墙功能的内核模块, 不同内核版本的模块名称不同,
在2.4.x版本及其以后的内核中, 其名称为iptables
, 已取代了早期的ipchains
和远古时期的ipfwadm
.
在命令行中可以通过lsmod | grep -i iptable
来查看当前加载的相关模块信息.
iptables作为内核模块, 由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集.
与此同时, iptables也作为用户空间(userspace)的一个管理工具而存在,使得我们使插入,
修改和除去信息包过滤表中的规则变得非常容易,不需要每次修改规则后都重新编译内核.
本文主要讨论的也正是iptables在用户空间的功能.
基本概念
linux内核的转发机制主要通过查表(tables)
来完成, 而iptables则用来设置,管理和检查linux内核中ip包过滤规则表.
table后面加了s说明可以定义多张表, 而每张表中又包含了若干链路(chains)
, 链路表示一系列应用于匹配ip包的规则(rules)
.
下面就对这"三座大山"分别加以解释. 为了使概念明了, 我们自底向上说明:
规则(rules)
规则又称为rule-specification, 其主要作用是匹配特定的ip封包, 并作出相应的动作, 其格式为:
rule-specification = [matches...] [target]
其中,
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
matchname表示匹配的格式的名称, targetname表示所执行的动作的名称. iptables定义了一系列内置的格式和动作,
如target为accept表示接受, masquerade表示执行类似路由器的动作(用于nat)等, 具体可以通过man iptables-extensions
查看.
链路(chains)
所谓链路, 顾名思义就是表示ip数据包传输的路径, 一个封包的源和目的不同, 其走的路径即有可能不同,
就像路途中的朋友们, 在任何一个节点都有可能分道扬镳.这些节点有:
- pre_routing : 外部数据刚刚进入时.
- post_routing : 外部数据准备离开时.
- input : 数据包的目的地址为本地socket.
- output : 数据包由本地生成.
- forward : 数据包被本机转发.
事实上, 链路在内核中以钩子的形式存在, 在每个结点给用户预留了回调函数来处理封包(即用前面提到的规则).
ip封包从外部进入后,所经过的链路如下图所示: