Linux技术03-Netfilter、Iptables、Nftables、Firewalld

简介

      Netfilter是Linux内核中的一个强大的网络数据包处理框架,主要用于实现防火墙、网络地址转换(NAT)等功能。它通过在网络协议栈的关键路径上设置多个钩子(Hooks)点,允许用户自定义数据包的处理策略。它位于网络栈的中心,为不同的防火墙和流量处理工具提供基础设施。

        Iptables是Netfilter的传统用户空间工具。它直接与Netfilter交互,用于定义如何处理通过内核的数据包。

        Nftables是基于Netfilter的下一代工具,旨在替代Iptables。它直接利用Netfilter的数据包处理机制,但在用户空间中提供了一个更现代的接口,统一了不同协议(IPv4、IPv6、ARP和桥接流量)的处理。

        Firewalld是一种高级的防火墙管理工具,本身并不直接处理数据包,而是通过Iptables或 Nftables与Netfilter交互。

        以下是几种工具的对比,今天重点研究Netfilter以及常用的工具Iptables。

特性NetfilterIptablesNftablesFirewalld
核心功能负责处理网络流量的过滤、连接跟踪和地址转换等功能防火墙、包过滤、NAT防火墙、包过滤、NAT动态防火墙管理
工作层内核空间用户空间用户空间用户空间
配置方式给其他工具提供接口规则语法相对复杂规则语法简洁,支持批处理基于区域管理,动态配置
性能内核底层框架,性能强劲成熟、稳定,但大规模规则性能欠佳高效、内存占用低性能依赖底层 iptables/nftables
适用场景给各种网络场景提供底层框架中小型防火墙配置替代iptables,复杂网络场景桌面和服务器动态防火墙管理

Netfilter

核心功能

        Netfilter的核心功能包括以下几个部分:

1.钩子函数(hooks):Netfilter提供了一组钩子,允许系统在数据包生命周期的不同阶段插入处理逻辑。这些钩子点是Netfilter的核心,帮助实现包过滤、转发、NAT等功能。

2.数据包过滤和转发规则:管理员可以通过工具(如iptables或nftables)在用户空间定义数据包处理规则,这些规则被传递到内核空间并在钩子点处应用。

3.连接跟踪(ConnectionTracking):Netfilter包含一个连接跟踪模块,能够跟踪所有通过Linux内核的连接状态。连接跟踪允许Netfilter识别数据包是否属于现有的连接(如NEW、ESTABLISHED、RELATED等)。

4.NAT(网络地址转换):Netfilter实现了源地址和目标地址转换功能,用于解决NAT和端口映射问题,常用于防火墙、路由器等网络设备。

5.扩展模块:Netfilter支持通过内核模块扩展功能,如不同类型的过滤匹配器、地址转换规则和日志功能。

数据包处理流程

        当一个数据包通过Linux网络栈时,Netfilter在多个不同的钩子点对其进行处理。不同的钩子点负责不同阶段的数据包过滤和转发。Netfilter主要有以下五个钩子点:

1.PREROUTING:在数据包进入系统时立即处理,应用于所有入站数据包。在此阶段可以进行包过滤和网络地址转换(如DNAT)。

2.INPUT:当数据包目标地址是本地主机时,经过PREROUTING后会进入INPUT链。在此阶段,数据包可以被处理并交给本地进程。

3.FORWARD:如果数据包不是发给本机而是要转发给其他主机(路由功能),则进入FORWARD链。在这里可以对转发的数据包进行过滤。

4.OUTPUT:当主机本地生成数据包时,它会首先进入OUTPUT链,可以在此阶段进行数据包过滤和处理(如源地址转换)。

5.POSTROUTING:当数据包离开系统(即将发送到网络)时,会通过POSTROUTING链。在此阶段可以进行网络地址转换(如SNAT)。

连接跟踪(Connection Tracking)

        连接跟踪模块是Netfilter的关键部分,帮助系统了解所有通过的网络连接的状态。每个连接的信息都存储在连接跟踪表中,表项包含以下几类状态:

NEW:表示一个新连接,通常是第一个数据包。

ESTABLISHED:表示连接已经建立,后续数据包会标记为已建立连接的数据包。

RELATED:与现有连接有关的连接(例如FTP的数据连接)。

INVALID:无法识别状态的数据包。

        通过连接跟踪,Netfilter能够实现有状态防火墙,允许系统基于连接状态动态调整数据包处理规则。       

NAT(网络地址转换) 

        Netfilter支持多种类型的NAT,主要包括以下两种:

SNAT(源网络地址转换):常用于出站连接,将本地网络的私有IP地址转换为公共IP地址。

DNAT(目标网络地址转换):常用于入站连接,将外部访问的公共IP地址映射到内部网络的私有IP地址。

        NAT通常在PREROUTING和POSTROUTING链上进行处理,具体视具体的规则定义。

扩展模块

        Netfilter支持通过内核模块扩展功能,例如:

MATCH模块:用于匹配特定的数据包属性(例如IP地址、端口号、协议类型等)。

TARGET模块:定义数据包匹配后如何处理(如ACCEPT、DROP、LOG、SNAT、DNAT等)。

LOG模块:允许将匹配的数据包信息写入系统日志,帮助进行网络排错和监控。

核心概念

钩子点(Hooks)

PREROUTING:数据包进入路由表之前。

INPUT:数据包通过路由表后,目的地为本机。

FORWARD:数据包通过路由表后,目的地不为本机。

OUTPUT:由本机产生的数据包。

POSTROUTING:数据包发送到网卡接口之前。

规则(Rules)

        每条规则定义了数据包的匹配条件和相应的处理动作。匹配条件可以包括源 IP、目标 IP、端口等,而处理动作可以是接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)等。

链(Chains)

        链是一个有序的规则列表。Netfilter中的每个钩子点都对应一个或多个链,数据包在通过钩子点时会依次匹配链中的规则。

表(Tables)

        表是链的集合,用于分类管理不同类型的规则。常见的表包括:

filter表
  • 用途:主要用于数据包过滤。
  • :包含 INPUT、FORWARD和OUTPUT链。
  • 说明:这是最常用的表,用于决定数据包是否被接受、丢弃或拒绝。
nat表
  • 用途:用于网络地址转换(NAT)。
  • :包含PREROUTING、POSTROUTING和OUTPUT链。
  • 说明:用于修改数据包的源地址或目标地址,常用于端口转发和IP伪装。
mangle表
  • 用途:用于修改数据包的内容。
  • :包含PREROUTING、POSTROUTING、INPUT、OUTPUT和FORWARD链。
  • 说明:可以用于修改数据包的 TOS 字段、标记数据包等。
raw表
  • 用途:用于决定数据包是否被状态跟踪机制处理。
  • :包含PREROUTING和OUTPUT链。
  • 说明:主要用于关闭NAT表上的连接追踪机制。
security表
  • 用途:用于强制访问控制(MAC)网络规则。
  • :包含 INPUT、OUTPUT 和 FORWARD链。
  • 说明:与安全模块(如 SELinux)集成,用于实施安全策略,目前不常用。

与用户空间工具的交互

        Netfilter的规则和行为通过用户空间工具(如iptables和nftables)进行配置。这些工具在用户空间定义规则和表,并将这些配置传递到内核中的Netfilter框架。Netfilter在内核空间执行这些规则,对数据包进行过滤、转发、NAT和其他操作。

iptables:传统的用户空间工具,通过定义规则链来配置Netfilter的行为。

nftables:iptables的现代替代工具,具有更高效的规则管理和性能。

Iptables

        iptables是Linux 中一个非常强大的工具,用于配置网络防火墙。它基于Netfilter框架工作,允许管理员设置规则来过滤和控制进出系统的数据包流量。iptables主要用于管理和控制Linux内核中的数据包过滤和网络地址转换(NAT)。下面是对iptables的使用示例

使用示例

查看当前规则

iptables -L

清空所有规则

iptables -F 

保存恢复规则

iptables-save > /etc/iptables/rules.v4

iptables-restore < /etc/iptables/rules.v4

允许HTTP(端口 80)和HTTPS(端口 443)的入站流量

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

将所有到达本机端口8080的流量转发到内部网络中的另一台机器(IP地址192.168.1.102)的端口80

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.102:80
iptables -t nat -A POSTROUTING -j MASQUERADE

 语法规则

        基本命令格式如下:

iptables  [-t 表名]  命令选项  [链名选项]  [条件匹配]  [-j 目标动作]

        其中表名可选项:

  • filter:默认表,用于数据包过滤
  • nat:用于网络地址转换
  • mangle:用于修改数据包
  • raw:用于决定数据包是否被状态跟踪机制处理

        命令选项:

  • -A:追加一条规则到指定链的末尾
  • -I:插入一条规则到指定链的指定位置
  • -D:删除指定链中的一条规则
  • -L:列出指定链中的所有规则
  • -F:清空指定链中的所有规则
  • -P:设置指定链的默认策略
  • -Z:将指定链的所有计数器归零

          链名选项:

  • INPUT:处理进入本机的数据包
  • FORWARD:处理转发的数据包
  • OUTPUT:处理从本机发出的数据包
  • PREROUTING:处理刚到达的数据包
  • POSTROUTING:处理即将离开的数据包

        目标动作:

  • ACCEPT:允许数据包通过
  • DROP:丢弃数据包
  • REJECT:拒绝数据包并发送响应
  • SNAT:源地址转换
  • DNAT:目的地址转换

        常见条件匹配:

  • -s 或 --source:源地址匹配,例如 -s 192.168.1.1
  • -d 或 --destination:目的地址匹配,例如 -d 192.168.1.1
  • -p 或 --protocol:协议匹配,例如 -p tcp 或 -p udp
  • --sport 或 --source-port:源端口匹配,例如 --sport 80
  • --dport 或 --destination-port:目的端口匹配,例如 --dport 80
  • -i 或 --in-interface:输入接口匹配,例如 -i eth0
  • -o 或 --out-interface:输出接口匹配,例如 -o eth0
  • -m 或 --match:指定扩展匹配模块,例如 -m state --state NEW

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炸裂狸花猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值