iptables 实际上就是一种包过滤型防火墙。就是通过书写一些接受哪些包,拒绝哪些包的规则,实现数据包的过滤。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。

iptables.xmind

四表五链对应图
linux_firewall_iptables_intro_4tables_5chains.jpg

数据包进入的基本步骤:

  1. 数据包到达网络接口(eth0)
  2. 进入raw表的PREROUTING链,这个链的作用是赶在连接跟踪之前处理数据包;(可以设置不跟踪以提高性能)
  3. 如果进入了连接跟踪
  4. 进入mangle表的PREROUTING链,在这里可以修改数据包(TOS)
  5. 进入nat表的PREROUTING链,可以在此做DNAT(目的地址转换)
  6. 进入决定路由,看是交给本机还是转发给其他主机

后面就需要进行分情况讨论:

  • 本机:

如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

  • 转发

如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

  • 出站

防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

参考

https://blog.csdn.net/longbei9029/article/details/53056744
https://my.oschina.net/rsty/blog/364266
https://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646466.html