前言
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定义了五条链,我们也可以自定义新的链,借用鸟哥的图:
简单理解,这五条链的规则:
- PREROUTING:数据包进入路由表之前;
- INPUT:通过路由表后目的地为本机,上送协议栈;
- FORWARD:通过路由表后,经由本机转发,不上送协议栈;
- OUTPUT:由本机产生,向外转发;
- POSTROUTIONG:发送到网卡接口之前。
梳理一下,如果数据包只是通过本机转发而不上送本机处理的,路径:PREROUTING—>FORWARD—>POSTROUTIONG
;如果是需要本机处理的,路径:PREROUTING—>INPUT—>OUTPUT—>POSTROUTIONG
。
iptables表与链的对应关系:
使用如下命令指定规则链,如[-A chain]:
-A, —append: 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。 |
使用Iptables
使用iptables的语法:
iptables [-t table] command [chain] [match] [-j target/jump]
其中,-t table
前文提到,是指定表规则,command
后面指定链规则;match
指定数据包的匹配规则,一般是指定五元组等;-j target/jump
指定匹配成功后的动作,主要包括ACCEPT
(通过),DROP
(丢弃),REJECT
(丢弃并重定向),DNAT
,SNAT
,MARK
,MASQUERADE
(伪装宿主机IP)。匹配规则的常用语句:
-p, —protocol:匹配通讯协议类型是否相符。 |
配置iptables后,可以使用如下命令查看规则及其对应的编号:
iptables -L -n —line-number
接下来举几个例子。
#包过滤
包过滤也就是实现简单的防火墙功能,阻止或者允许指定包的通过。例如:
允许访问本机的ICMP包,丢弃经过本机转发的http(80端口)包:
iptables -A INPUT -p icmp -j ACCEPT |
其中,-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 |
以上命令可以理解为:
- 将目的地址是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 |
上面的命令,我让两台虚机公用一个外网地址的不同端口号,简单的做了一个端口映射。外网主机可以通过172.168.0.110的80和81端口分别访问内网虚机1和2的http服务。
总结
目前的云平台如OpenStack,其网络管理项目Neutron对租户的安全组也是基于Iptables来做的。前两天某云的租户互通事件,引起很大的讨论,可见云网络中安全问题越来受到重视。所以,熟练使用Iptables,也许会帮助你管理好自己的云网络。写的有点零碎,但尽量争取不了解的人一看就会用,自己回头看能很快明白,后续可能还会在此基础上进行补充,就这些吧。
个人分析,欢迎指正,若转载请注明出处!