IPtables是基于包过滤的防火墙软件,可以在低配置的服务器上面运行良好,所有的Linux发行版都包含它。

在网络设备上的安全规则,通常是顺序匹配,例如Cisco设备的ACL。而IPTables的核心是Table Chain和Rules,数据包除了顺序匹配之外,还可以通过设定目标Chain来自由跳转。下图描述了数据包经过Table和Chain时的顺序。

安全网关之三:IPTables_第1张图片


  • Table的优先级是:RAW>MANGLE>NAT>FILTER。

  • 数据包的Chain流向是:PREROUTING->INPUT->FORWARD->OUT->POSTROUTING。

  • 每个Chain包含若干规则。这些规则将会被从上到下顺序匹配。

  • 规则一旦被匹配,数据包将会流向下一个Table和Chain。

用户访问线上环境的基本流程如下:

  • 用户登录Open×××系统,系统验证通过后,用户获取一个私有IP地址,同时系统记录其账号名。

  • 连接建立后,Open×××系统调用Connect脚本。

  • IPtables将用户所属IP加入到对应的规则组Chain中。

  • 用户获取到相应的访问权限。

  • 用户完成访问,断开连接,IPTables将用户占用IP地址从规则组Chain中去除。

由于安全网关主要是要在公司内网和线上环境的内网之间进行网络的转发和限制,本文主要使用了Table FILTER和Chain FORWARD。Filter是默认的Table。

通常的一条规则如下:

iptables -A FORWARD -s 1.1.1.1 -d 2.2.2.2 -p tcp --dport 80 -j DROP

在这个解决方案最初的时候,我尝试一条一条写规则,但是当我开始导入规则时,我碰到了×××烦。

当我导入了100个用户,目标网段有50个,每个网段需要访问10个端口。我发现我一下得到了100*50*10条,即50000条规则, FORWARD链的长度变得非常长。极端情况,用户的数据包会经过50000条规则才被匹配到。

为了解决上面这个问题,我在系统中引入了组的概念,同时使用了自定义Chain进行规则的跳转:

  • 所有对象都被配置成组,例如:用户组,网络地址组,端口组。IPTables本身是没有区分数据包的用户或者用户组机制的。想要实现用户和用户组的判定,需要额外的脚本程序和配置数据库配合,这个解决方案建立了一个额外的配置数据库,利用Open×××用户帐号和用户IP地址的映射关系,来实现用户的权限设置。

  • FORWARD Chain中的规则为:iptables -A FORWARD -s 1.1.1.1 -j USERGROUP_1,假设每个用户都同时属于20个组,FORWARD规则数为:2000条规则。

  • USERGROUP_1 Chain中的规则为: iptables -A USERGROUP_1 -j RULE_1, 假设每个组同时有20个规则,USERGROUP_1中的规则数为:20条

  • RULE_1 Chain中的规则为:iptables -A RULE_1 -d 1.0.0.0/8 -j PORT_1,假设每个网段开放了10种不同组合的端口,SG_1规则数为:50*10=500条规则。

  • PORT_1 Chain中的规则为:iptables -A PORT_1 -p tcp --dport 80 -j ACCEPT,PORT_1规则数为10条。

这样,源地址为1.1.1.1的用户访问线上系统,最多会经过2000+20+500+10=2530条规则,这个长度已经比之前有了很大的改善。