iptables 实际上就是一种包过滤型防火墙。就是通过书写一些接受哪些包,拒绝哪些包的规则,实现数据包的过滤。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。
四表五链对应图
数据包进入的基本步骤:
- 数据包到达网络接口(eth0)
- 进入raw表的PREROUTING链,这个链的作用是赶在连接跟踪之前处理数据包;(可以设置不跟踪以提高性能)
- 如果进入了连接跟踪
- 进入mangle表的PREROUTING链,在这里可以修改数据包(TOS)
- 进入nat表的PREROUTING链,可以在此做DNAT(目的地址转换)
- 进入决定路由,看是交给本机还是转发给其他主机
后面就需要进行分情况讨论:
- 本机:
如果数据包的目标主机是防火墙本机(比如说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
