目前iptables已在2.4、2.6及3.0版本的Linux内核中集成,旧版的Linux内核则使用ipchains及ipwadm来达成类似的功能,而2014年1月19日起发行的新版Linux内核(3.13+)则使用nftables取代iptables。
iptables虽然强大但是不可能永远适用于当前的技术发展,任何技术都有其局限性。位于用户空间的iptables,也在被抛弃,RHEL7/CentOS7中已经不再直接使用iptables,而选择firewalld作为他的前端配置工具。
管理工具iptables是与内核网络协议栈中有包过滤功能的5个hook交互来完成工作的,这些内核hook构成netfilter框架。每个进出网络的包在经过协议栈时都会触发这些hook,数据包在内核中的处理路径如下图所示。
通过iptables下发的规则,最终都会与上图中标注的5个hook点位关联。iptables将这些规则,按照不同的作用划分到不同的表中,按照划分常用的有raw、mangle、filter、nat四张表,即为四表。而关联在5个hook点位的有优先级顺序的规则链,即为五链。这种配置管理逻辑,也就是使用iptables的人都最为熟知的“四表五链”。
下面是iptables常用的四种table类型及其具体作用:
表和链的组织逻辑是:不同的表可以作用在不同的链(hook点位)中,在具体链中多种表之间又有优先级顺序,具体如下图所示,红色箭头方向表示各表的优先级顺序依次从高到低排列。
我们通过iptables下发的规则就放置在特定table的特定chain里面,当chain被触发调用的时候,包会依次匹配chain里面的规则,每条规则都有一个匹配部分和一个动作部分。规则的匹配部分指定了一些条件,数据包必须满足这些条件才会和将要执行的动作进行关联。匹配系统非常灵活,还可以通过iptables extension扩展其功能。规则可以匹配协议类型、源目地址、源目端口、源目网段、接收或发送的网卡、协议头、连接状态等条件。这些综合起来,能够组合成非常复杂的规则来区分不同的网络流量。
netfilter包过滤框架和iptables是Linux服务器上大部分防火墙解决方案的基础。其中,netfilter的内核hook与Linux内核协议栈配合得足够紧密,提供了数据包在经过系统时的强大控制能力。而iptables正是基于这些能力提供了一个灵活的、可扩展的、将策略需求转化到内核的方法。理解了这些不同部分是如何联系到一起的,就可以使用iptables创建出可靠的防火墙策略。
通过上文可以清楚地了解到,iptables其实是存在于操作系统应用层,作为配置内核中安全框架netfilter的一个客户端。通过iptables可以实现常规防火墙的几乎所有的功能,包括但不限于:
除了作为常规的主机/网络防火墙外,iptables也作为重要的网络组成部分,存在于Docker、K8S、OpenStack的Neutron项目以及众多成熟且应用广泛的开源项目中。
首先,简单了解下iptables命令的语法格式,命令格式可分解为如下几部分。
iptables -t <table> <cmd> <pattern> <action> |
其中,-t <table>或–table <table>选项用来指定要查看或修改的表(raw、mangle、nat、filter),命令行在不使用-t参数时默认为filter表。<cmd>部分可选择对规则要进行的操作,即增删改查操作,<pattern>为规则的匹配部分,<action>为安全规则的动作部分,对匹配到的数据包做指定的动作。
BLOCK_THIS_IP=”x.x.x.x” iptables -A INPUT -i eth0 -p tcp -s “$BLOCK_THIS_IP” -j DROP |
此命令行,<cmd>部分使用-A INPUT参数将屏蔽规则插入到filter表(默认)的INPUT链尾。
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT |
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.5 –dport 2222 -j DNAT –to 192.168.1.5:22 |
iptables -A PREROUTING -i eth0 -p tcp –dport 80 -m state –state NEW -m statistic –mode nth –every 3 –packet 0 -j DNAT –to-destination 192.168.1.11:80 iptables -A PREROUTING -i eth0 -p tcp –dport 80 -m state –state NEW -m statistic –mode nth –every 2 –packet 0 -j DNAT –to-destination 192.168.1.12:80 iptables -A PREROUTING -i eth0 -p tcp –dport 80 -m state –state NEW -m statistic –mode nth –every 1 –packet 0 -j DNAT –to-destination 192.168.1.13:80 |
在上面的命令行中,采用statistic模块的nth模式来实现轮询的负载均衡效果,参数含义如下:
需要注意的是,每条规则有独立的计数器,因此-m statistic –mode nth –every 3 –packet 0表示每三个包触发一次动作,在第0次命中时执行动作,在第1次和第2次命中后不触发动作,而是将数据包交给下一条规则处理。同理,第二个包的匹配规则为-m statistic –mode nth –every 2 –packet 0,第三个包的匹配规则为-m statistic –mode nth –every 1 –packet 0。
iptables -A INPUT -p tcp –dport 80 -m limit –limit 5/minute –limit-burst 100 -j ACCEPT |
关于limit限速模块,各参数的含义如下: