前段时间学习了docker容器网络中bridge模式,linux下端口转发(iptables)和网络命名空间ip netns中跨主机通信部分。这三个场景下都涉及到一个工具:iptables,这么强大的工具,竟然说不清楚。那么我们今天就搞个清楚搞个明白。
期望收获:iptables是什么?为什么要引入iptables?同类工具还有哪些?iptables的架构?iptables的编写说明及其注意事项
iptables是位于“用户空间”的防火墙管理工具,用户通过这个“工具”,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”就是位于“内核空间”的实现了防火墙功能的netfilter。
iptables调用netfilter的接口来对存放在内核内存中的XXtables(netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件。类似的应用程序还有 firewalld 。
netfilter是按规则(rules)来处理数据包的,规则就是人为预先定义的“条条框框”,存储在内核空间的“信息包过滤表”中,规则需指定源地址、目的地址、传输协议(如ICMP、TCP、UDP)和服务类型(如FTP、HTTP、SMTP)等。netfilter安全框架中制定了数据包的5个回调函数(hook),分别是PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。
网口数据包由底层的网卡接收,通过数据链路层的解包之后(去除数据链路帧头)到达网络层,此时netfilter会主动调用回调函数,根据规则所定义的方法,在数据包路由的时候改变它们的方向和内容,最后转发到待调用的系统。
netfilter涉及5种默认规则链的介绍
INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。
PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT。
POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则,如SNAT。
其中INPUT、OUTPUT链更多的应用在“主机防火墙”中,主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。
Linux数据包路由原理(netfilter处理)
1) 当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我们有机会修改数据包的DestIP(目的IP),然后内核的”路由模块”根据”数据包目的IP”以及”内核中的路由表”判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被我们修改过了)
2) 如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会-收到它
3) 本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了)
4) 如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口发送出去)
上图可以看到有4张表:filter、nat、mangle、raw。这4张是干嘛用的呢?
1) filter表主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(DROP 、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:INPUT链、FORWARD链、OUTPUT链。
2) nat表主要用于修改数据包的IP地址、端口号等信息(SNAT、DNAT、MASQUERADE 、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链:PREROUTING、OUTPUT和POSTROUTING。
3) mangle表主要用于修改数据包的TOS (Type Of Service,服务类型)、TTL(Time To Live,生存周期)以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。包含五个规则链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
4) raw表自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链:PREROUTING和OUTPUT。
跟踪raw表的4种不同状态:
NEW:该包想要开始一个连接(重新连接或将连接重定向)
RELATED:该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。—icmp-type 0 ( ping 应答) 是icmp-type 8 (ping 请求)所RELATED出来的。
ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。
INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。
iptables规则编写
1) 编写参数介绍
[-t 表名]:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter
-A:新增一条规则,到该规则链列表的最后一行
-I:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1
-D:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除
-R:替换某条规则,规则替换不会改变顺序,而且必须指定编号。
-P:设置某条规则链的默认动作
-nL:-L、-n,查看当前运行的防火墙规则列表
chain名:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等
[规则编号]:插入、删除、替换规则时用,—line-numbers显示号码
[-i|o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出
[-p 协议类型]:可以指定规则应用的协议,包含tcp、udp和icmp等
[-s 源IP地址]:源主机的IP地址或子网地址
[--sport 源端口号]:数据包的IP的源端口号
[-d目标IP地址]:目标主机的IP地址或子网地址
[--dport目标端口号]:数据包的IP的目标端口号
-m:extend matches,这个选项用于提供更多的匹配参数,如:
-m state --state ESTABLISHED,RELATED
-m tcp —dport 22
-m multiport —dports 80,8080
-m icmp —icmp-type 8
<-j 动作>:处理数据包的动作,包括ACCEPT、DROP、REJECT等
2) 处理数据包的动作:
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,不回应任何信息
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息。
SNAT:源地址转换。在进入路由层面的route之前,重新改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。
MASQUERADE,是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上
DNAT:目标地址转换。和SNAT相反,IP包经过route之后、出本地的网络栈之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址。
REDIRECT:是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。
3) 配置iptables的注意事项如下:
3.1) 规则的顺序非常重要
规则是有序号的,数据包报文通过是按照规则顺序处理的。针对相同服务的规则,更严格的规则应该放在前面。若不同类别的规则则被匹配次数多的、匹配频率高的规则放在前面。
3.2) 当规则中有多个匹配条件时,条件之间默认存在”与”的关系
如果一条规则中包含了多个匹配条件,那么报文必须同时满足这个规则中的所有匹配条件时,报文才能被这条规则处理。
3.3) 在配置iptables,若默认策略设置为ACCEPT,最后设置REJECT规则,那么将实现名单机制。但若将默认策略设置为DROP,则严禁执行flush清空所有规则,否则管理员的请求也将会被DROP掉,此时只能登录console去解决故障了。
3.4) 当iptables所在主机作为网络防火墙时,建议至少内外2块网卡,在配置规则时,应着重考虑方向性,双向都要考虑,从外到内,从内到外。
参考
马哥运维的iptables防火墙原理知多少。