iptables详解

linux 之软件防火墙iptables详解

netfilter是由rusth russell提出的linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(network address translation, nat),以及基于用户及媒体访问控制(media access control, mac)地址的过滤和基于状态的过滤、包速率限制等。iptables/netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都利益于它的优秀设计思想。

0x01:filter和iptables

netfilter是linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

  • 网络地址转换(network address translation)
  • 数据包内容修改
  • 以及数据包过滤的防火墙功能

netfilter平台中制定了数据包的五个挂载点(hook poing,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的boov,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是pre_routing、input、output、forward、post_routing。

netfilter所设置的规则是存放在内核内存中的,而iptables是一个应用层的应用程序,它通过netfilter放出的接口来对存放在内核中的xxtables(netfilter的配置表)进行修改。这个xxtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件。类似应用程序还有firewall、ufw。

iptables与内核

1.1:filter、nat、mangle raw规则表

filter表

主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如drop、accept、reject、log)。filter表对应的内核模块为iptable_filter,包含三个规则链:

  • input链:input针对那些目的地是本地的包
  • forward链:forward过滤所胡不是本地产生的并且旷日持久地不是本地(即本机只负责转发)的包
  • output链:output是用来过滤所有本地生成的包

nat表

主要用于修改数据包的ip地址、端口等信息(网络地址转换、如snat、dnat、masquerade、redirect)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做nat或masqueraded,那个余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为iptable_nat,包含三个链:

  • prerouting链:作用是在包刚刚到达防火墙时改变它的目的地址
  • output链:改变本地产生的包的目的地址
  • postrouting链:在包就要离开防火墙之前改变其源地址

mangle表

主要用于修改数据包的tos(type oof service,服务类型)、ttl(time to live,生存周期)值以及为数据包设置mark标记,以实现qos(quality of service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。包含一个规则链--prerouting、postrouting、input、output、forward。

raw表

是自1.2.9以后版本的iptables新增的表,主要用决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其它表。包含两条规则链--output、prerouting

iptables中数据包和4种被跟踪连接的4种不同状态:

  • new:该包想要形如一个连接(重新连接或将连接重定向)
  • related:该包是属于某个已经建立的连接所建立的新连接。例如:ftp的数据传输连接就是控制连接 所related出来的连接。–icmp-type 0(ping 应答)就是icmp-type 8(ping 请求)所 related出来的。
  • established:只要发送并接到应用,一个数据连接从new变为established,而且该状态会纠结匹配这个连接的后续数据包。
  • invalid:数据包不能被识别属于哪个连接或没有任何状态。比如内存举出,收到不知属于哪个连接的icmp错误信息,一般应该drop这个状态的任何数据。

1.2:input、forward等规则链和规则

在处理各种数据包时,根据防火墙规则的不同介入时机,iptables代涉及5种默认规则链,从应用时间点的角度理解这些链:

  • input链:当接收到防火墙本地地址的数据包(入站)时,应用此链中的规则。
  • output链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
  • forward链:当接收到需要通过防火墙发送给其它地址的数据包(转发)时,应用此链中的规则。
  • prerouting链:在对数据包作路由选择之前,应用此链中的规则,如dnat。
  • postrouting链:在对数据包作路由选择之后,应用此链中的规则,如snat。

防火墙处理数据包的方式(规则):

  • accept:允许数据包通过。

  • drop:直接丢弃数据包,不给任何回应信息。

  • reject:拒绝数据包通过,必要时会给数据发送端一个响应信息。

  • snat:源地址转换在进入路由层面的route之前,重新改写一个源地址,目标地址不变,并在本机建立nat表项,当数据返回时,根据nat表将目的地址数据改定为数据发送出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。

  • dnat:目标地址转换。和snat相反,ip包经过route之后、出本地的网络栈之前,重新修改目标地址,源地址不变,在本机建立nat表项,当数据返回时,根据nat表将源地址修改为熂发送过来的时候的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址。

    redirect:是dnat的一种特殊形式,将网络包转发到本地host上(不管ip头部指定的目标地址是什么),方便在本机做端口转发。

  • log:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一个规则。

0x02:linux数据包路由原理

我们已经知道了netfilter和iptables的架构和作用,并且学习了控制netfilter行为和xtables表的结构,那么这个xtables表是怎么在内核协议栈的数据包路由中直作用的呢?

风口数据包由底层的网卡nic(network interface card)接收,通过数据链路层的解包之后(去除数据链路帧头),就进入了tcp/ip协议栈(本质就是一个处理网络数据的内核驱动)和netfilter混合的数据处理流程中了。数据包的接收、处理、转发流程构成了一个有限状态微量机,经过一些列的内核处理函数、以及netfilter hook点,最后被转发、或者本次上层的应用程序消化掉。是时候看这张图了


iptables详解
https://ywmy.xyz/2018/08/22/iptables详解/
作者
ian
发布于
2018年8月22日
许可协议