浅谈iptables
iptables是linux系统下用来做防火墙的二进制文件(linux上位于/sbin/iptables,android中位于/system/bin/iptables),底层依赖于内核的netfilter模块,用来完成封包过滤、封包重定向和网络地址转换(NAT)等功能(在android上需要root使用)。
举个例子来简单看看iptables命令的基本用法。
意思是在nat转发表的OUTPUT输出链中增加这样一条规则:倘若OUTPUT输出链拦到了tcp请求,则将其重定向到本地的8123端口。
可以看到iptables中有 表 、 链 和 规则 的概念,那么先通过iptables传输数据包的过程来简单了解下表和链是什么以及他们之间的关系。
可以看到 链 就是对数据包传输路径的一种抽象,一个数据包根据其具体场景以固定的顺序依次经过PREROUTING、INPUT等各个链,在经过各个链时,又有不同的表在监听这个链,而nat、filter等 表 中有包含一系列的 规则 ,当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则。
值得注意的是,
至此我们了解了表、链和规则是什么以及他们之间的关系,下面来具体看下 iptables命令的基本用法 。
更多关于各command、parameter的具体含义以及用法可以参考 https://wangchujiang.com/linux-command/c/iptables.html
iptables对网络数据包做过滤或拦截时其维度只能局限于网络数据包收发的ip地址、端口号、网卡、tcp/udp协议,因此可以推测iptables最终是在ip层对网络数据包做的拦截。
那iptables基于netfilter具体是怎么做到在各个链上对数据包做拦截的呢?
/net/ipv4/ip_output.c
/net/ipv4/ip_input.c
/net/ipv4/ip_forward.c
可以看到内核在每一个数据转发的关键节点都调用了NF_HOOK这个宏,来看下NF_HOOK这个宏干了啥
关于NF_HOOK相关具体逻辑可参见 https://sites.google.com/site/ibmsdu/network-security-development/netfilter%E8%AE%BE%E8%AE%A1%E4%B8%8E%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90