Iptables笔记

前言

Linux网络相关的技术有很多,常见的如Iptables,TC(Traffic Control),Linux Bridge等会经常被应用到生产环境中,特别在组网时,部分技术会成为至关重要的解决方案。之前在读书期间,有做过利用Iptables做防火墙,过滤相关IP数据包,以及利用Iptables结合TC进行数据流的Qos保障和流量控制。都快忘了怎么玩,最近在CI环境中,跑Robot测试用例时,需要外网主机访问云平台的虚机,我采取的方法就是利用Iptables做DNAT转换。所以,学习并熟练运用相关Linux网络技术有助于解决一些网络相关的疑难问题。熟悉这些技术的小伙伴也许会觉得很简单,不过好记性不如烂笔头,本文将记录一下本人学习Iptables的笔记。

四表五链

首先,介绍一下iptables技术中的表和链。iptables有四种表(table)和五条链(chain),其中表是按照对数据包的动作区分的,链是按照不同的Hook点来区分的。其原理是将处理不同IP包(五元组任意组合)的规则写入不同的链当中,数据包进来后,会与这些规则进行匹配,一旦匹配成功,即执行规则中的动作。

#四表

iptables四种表分别是Filter,NAT,Mangle和Raw。表的处理优先级:raw>mangle>nat>filter。功能介绍如下:

  • Filter表:进行一般的包过滤操作;
  • NAT表:进行网络地址转换(IP/端口映射);
  • Mangle表:进行数据包的修改,比如tos,ttl这些字段以及打标记(Mark);
  • Raw表:此表优先级最高,功能是不再让iptables做数据包的链接跟踪处理,提高性能。相关资料

前面三个表就能满足处理常见问题的需要,使用[-t table]指定规则表,关于表的内容就不深入的阐述了。参考网站

#五链

iptables的链规则定义了数据包被处理的位置,linux定义了五条链,我们也可以自定义新的链,借用鸟哥的图:

iptables-chains

简单理解,这五条链的规则:

  • PREROUTING:数据包进入路由表之前;
  • INPUT:通过路由表后目的地为本机,上送协议栈;
  • FORWARD:通过路由表后,经由本机转发,不上送协议栈;
  • OUTPUT:由本机产生,向外转发;
  • POSTROUTIONG:发送到网卡接口之前。

梳理一下,如果数据包只是通过本机转发而不上送本机处理的,路径:PREROUTING—>FORWARD—>POSTROUTIONG;如果是需要本机处理的,路径:PREROUTING—>INPUT—>OUTPUT—>POSTROUTIONG

iptables表与链的对应关系:

tables-chains

使用如下命令指定规则链,如[-A chain]:

-A, —append: 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。
-D, —delete: 从某个规则链中删除一条规则,可以输入完整规则,或指定规则编号。
-R, —replace: 取代现行规则,规则被取代后并不会改变顺序。
-I, —insert: 插入一条规则,原本该位置上的规则将会往后移动一个顺位。
-L, —list: 列出某规则链中的所有规则。
-F, —flush: 删除某规则链中的所有规则。
-Z, —zero: 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。
-N, —new-chain: 定义新的规则链。
-X, —delete-chain: 删除某个规则链。
-P, —policy: 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。
-E, —rename-chain: 修改某自定义规则链的名称。

使用Iptables

使用iptables的语法:

iptables [-t table] command [chain] [match] [-j target/jump]

其中,-t table前文提到,是指定表规则,command后面指定链规则;match指定数据包的匹配规则,一般是指定五元组等;-j target/jump指定匹配成功后的动作,主要包括ACCEPT(通过),DROP(丢弃),REJECT(丢弃并重定向),DNATSNATMARKMASQUERADE(伪装宿主机IP)。匹配规则的常用语句:

-p, —protocol:匹配通讯协议类型是否相符。
-s, —src, —source: 匹配封包的来源 IP,可以匹配单机或网络。
-d, —dst, —destination:匹配封包的目的地 IP。
-i, —in-interface: 匹配封包是从哪块网卡进入,可以使用通配字符 + 来做大范围匹配。
-o, —out-interface:匹配封包要从哪 块网卡送出。
—sport, —source-port:匹配封包的源端口,可以匹配单一端口,或是一个范围。
—dport, —destination-port:匹配封包的目的地端口号。
—tcp-flags:TCP 封包的状态标志。
-m limitlimit:匹配某段时间内封包的平均流量。
—limit-burst:匹配瞬间大量封包的数量,超过此上限的封包将被直接丢弃。
-m mac —mac-source :匹配封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 POSTROUTING 规则链上。
—mark:匹配封包是否被表示某个号码。

配置iptables后,可以使用如下命令查看规则及其对应的编号:

iptables -L -n —line-number

接下来举几个例子。

#包过滤

包过滤也就是实现简单的防火墙功能,阻止或者允许指定包的通过。例如:
允许访问本机的ICMP包,丢弃经过本机转发的http(80端口)包:

iptables -A INPUT -p icmp -j ACCEPT     
iptables -A FORWARD -p tcp --dport 80 -j DROP

其中,-p指定了协议,如-p icmp指定了ICMP协议,-p tcp –dport 80指定了TCP协议,以及目的端口为80即http协议常用的tcp端口。

#内外网访问

内外网访问,就需要为内网的虚机分配一个外网地址。这里两个概念需要简单介绍一下,那就是DNAT(目的IP网络地址转换)和SNAT(源IP网络地址转换)。两者的应用场景是,当外网访问内网服务器时,要对目的IP进行DNAT转换;而当内网主机要访问外网时,需进行SNAT转换。例如:

场景一:

  • eth0:10 172.168.0.110(外网IP)
  • eth1:10.0.2.1(内网IP)
  • 内网虚机1:10.0.2.5 。外网主机能够访问该虚机,做一对一的DNAT转换:
ifconfig etho:10 172.168.0.110/24 up
iptables -t nat -A PREROUTING -d 172.168.0.110 -j DNAT -to--destination 10.0.2.5
iptables -t nat -A POSTROUTING -d 10.0.2.5 -j SNAT -to--source 10.0.2.1

以上命令可以理解为:

  • 将目的地址是172.168.0.110的数据包的目的地址修改为10.0.2.5
  • 将目的地址为10.0.2.5的数据包的源地址修改为10.0.2.1

所以外网主机访问内网虚机1,不是虚机的IP地址,而是虚机进行DNAT的外网地址,当数据包到达linux服务器,首先会将数据包的目的地址改为虚机地址并进行转发;这时iptables还会将目的地址是虚机地址的数据包进行SNAT转换,以保证内网其它主机通过外网地址访问虚机时,能够处理虚机回复的数据包。

场景二:

  • eth0:10 172.168.0.110(外网IP)
  • eth1:10.0.2.1(内网IP)
  • 内网虚机1:10.0.2.5
  • 内网虚机2:10.0.2.6。外网主机能够访问两台虚机的http服务(80端口):
ifconfig etho:10 172.168.0.110/24 up
iptables -t nat -A PREROUTING -d 172.168.0.110 -p tcp --dport 80 -j DNAT -to--destination 10.0.2.5:80
iptables -t nat -A POSTROUTING -d 10.0.2.5 -j SNAT -to--source 10.0.2.1
iptables -t nat -A PREROUTING -d 172.168.0.110 -p tcp --dport 81 -j DNAT -to--destination 10.0.2.6:80
iptables -t nat -A POSTROUTING -d 10.0.2.6 -j SNAT -to--source 10.0.2.1

上面的命令,我让两台虚机公用一个外网地址的不同端口号,简单的做了一个端口映射。外网主机可以通过172.168.0.110的80和81端口分别访问内网虚机1和2的http服务。

总结

目前的云平台如OpenStack,其网络管理项目Neutron对租户的安全组也是基于Iptables来做的。前两天某云的租户互通事件,引起很大的讨论,可见云网络中安全问题越来受到重视。所以,熟练使用Iptables,也许会帮助你管理好自己的云网络。写的有点零碎,但尽量争取不了解的人一看就会用,自己回头看能很快明白,后续可能还会在此基础上进行补充,就这些吧。

个人分析,欢迎指正,若转载请注明出处!