iptables只是一个前端命令行工具,用来调用内核空间的netfilter完成封包过滤。
netfilter是linux操作系统核心内部的一个数据处理模块,具有以下三大功能:
1,网络地址转换
2,数据包内容修改
3,数据包过滤
虽然使用service iptables start 启动iptables,但是iptables并不是一个服务,因为它并没有一个守护进程。
POSTROUTING:数据包进行路由后流出网卡前。
1,本机发出的包:本机进程 -> OUTPUT链 -> 路由选择 -> POSTROUTING链 -> 出口网卡
2,本机收到的包:入口网卡 -> PREROUTING链 -> 路由选择 -> 此时有两种可能的情况:
PREROUTING
、INPUT
、FORWARD
、OUTPUT
、POSTROUTING
;raw
、mangle
、nat
、filter
四张表;raw>mangle>nat>filter
NOTRACK
一起使用,用于跳过连接跟踪(conntrack)
和 nat 表的处理;raw 表除了 -j NOTRACK
外,还有一个常用的动作,那就是 -j TRACE
,用于跟踪数据包,进行规则的调试,使用 dmesg 查看
默认策略默认策略只有两个动作:ACCEPT、DROP;当一个数据包未与该链中的任何规则匹配时,它将被默认策略处理; 也就是所谓的黑白名单,如果默认策略为 ACCEPT,则为黑名单模式,如果默认策略为 DROP,则为白名单模式。
连接跟踪连接跟踪
,顾名思义,就是跟踪并记录网络连接的状态(你可能认为只有 TCP 才有“连接”这个概念,但是在 netfilter 中,TCP、UDP、ICMP 一视同仁)。netfilter 会为每个经过网络堆栈的连接生成一个连接记录项(Connection Entry);此后所有属于此连接的数据包都被唯一地分配给这个连接并标识连接的状态;由所有连接记录项组成的表其实就是所谓的连接跟踪表。
为什么需要连接跟踪?因为它是状态防火墙和 NAT 的实现基础!
状态防火墙
:iptables 的 conntrack/state 模块允许我们根据连接的状态进行规则配置,如果没有连接跟踪,那是做不到的。NAT
,NAT 其实就是修改数据包的源地址/端口、目的地址/端口,如果没有连接跟踪,那么也不可能再找回修改前的地址信息。Linux 默认会为所有连接都创建连接记录项,而维护连接跟踪表是有开销的,要命的是这个表还有大小限制; 因此,如果你在一个大流量的 Web 服务器上启用 iptables,很容易因为连接记录项过多而导致服务器拒绝连接! 那么有什么解决的办法呢?利用 raw 表的 NOTRACK 功能,让所有发往 80 端口的数据包跳过连接跟踪和 nat 表。 iptables -t raw -I PREROUTING -p tcp --dport 80 -j NOTRACK
将所有发往 80/tcp 的数据包跳过 conntrack。
查看 conntrack 的使用情况、相关参数:
cat /proc/sys/net/netfilter/nf_conntrack_max
:允许的最大连接记录项的数目,超过此值后会直接拒绝新连接cat /proc/sys/net/netfilter/nf_conntrack_count
:查看当前已使用的连接记录项数目,如果居高不下则应考虑优化cat /proc/sys/net/netfilter/nf_conntrack_buckets
:查看存储记录项的哈希桶的数目,默认为 nf_conntrack_max / 4规则总体顺序
原文链接:linux防火墙工具之iptables的理解总结,转载请注明来源!