防火墙工具之iptables的理解总结
iptables只是一个前端命令行工具,用来调用内核空间的netfilter完成封包过滤。
netfilter是linux操作系统核心内部的一个数据处理模块,具有以下三大功能:
1,网络地址转换
2,数据包内容修改
3,数据包过滤
虽然使用service iptables start 启动iptables,但是iptables并不是一个服务,因为它并没有一个守护进程。
数据包通过防火墙的流程图
### Netfilter 选取了5个位置进行数据包的操作:
- PREROUTING :数据包流入网卡后进行路由器前
- INPUT:数据包流入用户空间前;
- FORWARD:设在不同网卡之间;
- OUTPUT:数据包流出用户空间前;
POSTROUTING:数据包进行路由后流出网卡前。
1,本机发出的包:本机进程 -> OUTPUT链 -> 路由选择 -> POSTROUTING链 -> 出口网卡
2,本机收到的包:入口网卡 -> PREROUTING链 -> 路由选择 -> 此时有两种可能的情况:
- 目的地址为本机:INPUT链 -> 本机进程
- 目的地址不为本机:FORWARD链 -> POSTROUTING链 -> 网卡出口(内核允许网卡转发的情况下)
规则链和表
- 链:就是netfilter操作数据包的5个位置(城口),
PREROUTING
、INPUT
、FORWARD
、OUTPUT
、POSTROUTING
; - 表:为了方便管理而提出的逻辑概念,每个表都有其特定的功能;有
raw
、mangle
、nat
、filter
四张表; - 规则:很容易理解,规则就是用于描述如何处理一个数据包的;描述一条规则时都会说明它所在的链和所在的表。(规则就是链下面的具体匹配规则)
表的优先级
raw>mangle>nat>filter
- Raw:优先级最高,通常与
NOTRACK
一起使用,用于跳过连接跟踪(conntrack)
和 nat 表的处理; - Mangle:修改包头部的某些特殊条目,如 TOS、TTL、打上特殊标记 MARK 等,以影响后面的路由决策;
- Nat:用于进行网络地址转换,如 SNAT(修改源地址)、DNAT(修改目的地址)、REDIRECT 重定向等;
- Filter:用于过滤数据包,比如 ACCEPT(允许),DROP(丢弃)、REJECT(拒绝)、LOG(记录日志);
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
规则总体顺序
- 当一个数据包进入某个链时,首先按照表的优先级依次处理;
- 每个表中的规则都有序号(从 1 开始),数据包会根据规则序号依次进行匹配;
- 如果命中一条规则,则执行相应的动作;如果所有表的规则都未命中,则执行默认策略。
原文链接:linux防火墙工具之iptables的理解总结,转载请注明来源!