iptables/netfilter命令、实现及利用

nftables基础与实践 @[TOC](nftables应用与实践(一) 基础) 鉴于之前的小项目的缺点,以及对比iptables(ipset)、nftables、ebpf-iptables后,敲定过滤网络数据包的底层工具还是选用nftables而不是iptables+ipset。 理由: ebpf很优秀,但需要C编程,开发效率低下;golang库小众年久失修; 红帽自己的iptables和ipset替代方案nftables纳入考虑;而且有golang的比较成熟的库; iptables+ipset,优点是只需要熟悉一下ipset, 阅读详情

一、Netfilter和Iptables概述

       netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。

      虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件 netfilter 和 iptables 组成。

      netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

      iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。

      iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。

      4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。

          filter:一般的过滤功能

          nat:用于nat功能(端口映射,地址映射等)

           mangle:用于对特定数据包的修改

           raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

      5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

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

           INPUT:通过路由表后目的地为本机

           FORWARDING:通过路由表后,目的地不为本机

           OUTPUT:由本机产生,向外转发

           POSTROUTIONG:发送到网卡接口之前。如下图:

image001

    iptables中表和链的对应关系如下:

绘图1.vsd     数据包在netfilter中的传递流程:

image005

二、Iptables的使用:

iptables [-t 表名] -命令 –链表 [-匹配] [-j 动作/目标]

表名:filter;nat;mangle;raw

常用命令:

-A, --append chain rule-specification:添加

-D, --delete chain rule-specification:删除

-D, --delete chain rulenum:删除

-I, --insert chain [rulenum] rule-specification:插入

-R, --replace chain rulenum rule-specification:替换

-L, --list [chain]:显示

-F, --flush [chain]:刷新

链表:INPUT;OUTPUT;FORWORD;PREROUTING;POSTROUTING

匹配:

-p -protocal [!]protocol:协议

-s -source [!] address[/mask]:源地址

-d --destination [!] address[/mask]:目的地址

-j --jump target:

-i –in-interface [!][name]:入口

-o --out-interface [!][name]:出口

-f, --fragment:分片

匹配扩展:

指定-p tcp时:

--source-port [!] [port[:port]]:原端口(也作--sport)

--destionation-port [!] [port:[port]]:目的端口(也作--dport)

--tcp-flags [!] mask comp:匹配指定的TCP标记

[!] –syn:设置了SYN位而清除了ACK和FIN位的TCP包。

--tcp-option [!] number:设置了TCP选项的包

指定 –p udp时:

--source-port [!] [port:[port]]

--destination-port [!] [port:[port]]

常见动作:

ACCEPT:放行

DROP:拒绝

QUEUE:传递给应用层

REJECT:和DROP类似,只是REJECT还返回一个错误包消息

REDIRECT:在nat表PREROUTING链中使用,修改数据包为本机地址和用户指定的端口。

TPROXY:在mangle表的PREROUTING链中使用,不修改数据包包头,直接把数据传递给一个本地socket。

较完整的命令参数见下图:

image007

三、NetFilter的内核实现

Netfilter中有两个要点:一个是Hooks点的实现,一个是表、链、规则的概念

Hooks

struct list_head nf_hooks[NFPROTO_NUMPROTO][NF_MAX_HOOKS]是其中核心的数据结构。nf_hooks的功能类似一个二维的函数指针数组。

nf_hooks数组的第一维是按照协议进行分类的,对于不同的协议有不同的hook点和hook函数,常见的协议包括ipv4,ipv6,arp,bridge等。

nf_hooks数组的第二维是按照hook点进行划分的,分为

NF_INET_PRE_ROUTING,NF_INET_LOCAL_IN,NF_INET_FORWARD,NF_INET_LOCAL_OUT,NF_INET_POST_ROUTING等5个hook点,与iptables的5个链相对应。

nf_hooks数组中的每一个元素可以理解为一个函数指针链表的链表头。这个函数指针链表是一个有序链表,按照函数hook的优先级进行排序。iptables的4个表分别对应不同的优先级:NF_IP_PRI_RAW、NF_IP_PRI_MANGLE、NF_IP_PRI_NAT_DST /NF_IP_PRI_NAT_SRC、NF_IP_PRI_LAST等。iptables中的表的优先级就是通过有序链表的方式来实现的。

链表元素的实际的数据结构是struct nf_hook_ops,其核心的数据成员就是一

个函数指针,还包含其他的一些属性。

struct nf_hook_ops 
{ 
        struct list_head list;                        //链表成员 
        /* User fills in from here down. */ 
        nf_hookfn *hook;                        //钩子函数指针 
        struct module *owner; 
        int pf;                             //协议簇,对于ipv4而言,是PF_INET

int hooknum;                                //hook类型 
int priority;                                //优先级

};

     nf_hooks的全局结构示意图如下:

image009     netfilter中的数据流程如下图:

image011

上图为ipv4协议的数据包,当数据包到达对应的hook点时,检查对应的nf_hooks[NFPROTO_NUMPROTO][NF_MAX_HOOKS]函数指针链表是否为空,如果为空则继续tcp/ip协议栈的后续流程;如果不为空,则按照链表中的顺序依次调用hook函数。

iptables的默认的核心hook函数是ipt_do_table(ip_tables.c),其核心功能是检查对应的协议的对应的表中的对应的链中的规则是否和当前的数据包相匹配,如果匹配则执行对应的动作。

Tabales

netfilter中提供了一系列的表(tables),每个表包含若干个链(chains),而每条链中包含由一条或若干条规则(rules),每一条规则都被用于数据包的检测。实际上netfilter是表的容器,表是链的容器,而链又是规则的容器。

相关的数据结构:

struct xt_table //表结构

{

    struct list_head list;//表链

    unsigned int valid_hooks;

    struct xt_table_info *private;// iptable的数据区

    struct module *me;

    u_int8_t af; //协议簇

    int priority; //优先级

    const char name[XT_TABLE_MAXNAMELEN];// 表名,如"filter"、"nat"等,为了满足自动模块加载的设计,包含该表的模块应命名为iptable_'name'.o

};

struct ipt_table_info //表的实际数据结构 
{

    unsigned int size;//表大小 
    unsigned int number;//表中规则数 
    unsigned int initial_entries;//初识的规则数,用于模块计数 
    unsigned int hook_entry[NF_IP_NUMHOOKS];// 记录所影响的HOOK的规则入口相对于下面的entries变量的偏移量 
    unsigned int underflow[NF_IP_NUMHOOKS];//与hook_entry相对应的规则表上限偏移量,当无规则录入时,相应的hook_entry和underflow均为0 
    char entries[0] ____cacheline_aligned;//规则表入口

};

下面的3种数据额结构是被填充到struct ipt_table_info的规则表(entries开始的)中的。

    ipt_entry结构如下图所示,其成员ip指向结构ipt_ip,该结构主要保存规则中标准匹配的内容 (IP、mask、interface、proto等),target_offset的值等于ipt_entry的长度与 ipt_entry_matches的长度之和,next_offset的值等于规则中三个部分的长度之和。通过target_offset与 next_offset可以实现规则的遍历。

struct ipt_entry

{

    struct ipt_ip ip;/* 所要匹配的报文的IP头信息 */ 
    unsigned int nfcache;/* 位向量,标示本规则关心报文的什么部分,暂未使用 */ 
    u_int16_t target_offset;/* target区的偏移,通常target区位于match区之后,而match区则在ipt_entry的末尾;初始化为sizeof(struct ipt_entry),即假定没有match */ 
    u_int16_t next_offset;/* 下一条规则相对于本规则的偏移,也即本规则所用空间的总和,初始化为sizeof(struct ipt_entry)+sizeof(struct ipt_target),即没有match */ 
    unsigned int comefrom;/* 规则返回点,标记调用本规则的HOOK号,可用于检查规则的有效性 */ 
    struct ipt_counters counters;/* 记录该规则处理过的报文数和报文总字节数 */ 
    unsigned char elems[0];/*target或者是match的起始位置 */

}

ipt_entry_match主要保存规则中扩展匹配内容(tos、ttl、time等),其是 Netfilter中内核与用户态交互的关键数据结构,在其内核部分由一个函数指针指向一个ipt_match结构,该结构体中包含了对包做匹配的函数, 是真正对包做匹配的地方。ipt_entry_target结构与ipt_entry_match结构很类似。

struct xt_entry_

    union {

        struct {

             __u16 match_size;

            char name[XT_EXTENSION_MAXNAMELEN];

            __u8 revision;

        } user;

        struct {

            __u16 match_size;

           struct xt_match *match;

        } kernel;

        __u16 match_size;

    } u;

    unsigned char data[0];

};

struct xt_entry_target {

    union {

        struct {

             __u16 target_size;

            char name[XT_EXTENSION_MAXNAMELEN];

            __u8 revision;

        } user;

        struct {

            __u16 target_size;

            struct xt_target *target;

        } kernel;

        __u16 target_size;

    } u;

    unsigned char data[0];

};

上面各种数据结构是按照下图的形式进行关联的。这里被分成表、链、规则三级。

每个表(xt_tables)都有一个private指针指向一个ipt_table_info结构,在ipt_table_info结构之后紧接着的是是实际的规则。

从数据结构中看链结构不是很明显,但是规则是被封装在链中的。ipt_table_info结构中的hook_entry成员和underflow成员就是用于划分规则所在的链。

每个规则由一个ipt_entry结构,N个xt_entry_match结构和一个xt_entry_target结构组成。ipt_entry结构表示的是基本的匹配规则(协议、地址等),xt_entry_match结构表示的是扩展的匹配规则,xt_entry_target结构表示的是匹配之后的动作。

绘图1.vsd


四、NetFilter的利用

   由于netfilter在内核中预留了Hook点,因此可以通过加载模块的方式方便对其加以利用。下面代码可以在2.6.20上运行。

 

 

Makefile:

 

 

利用上述模块可以简单实现对地址、端口的过滤

 

 

 

 

http://blog.youkuaiyun.com/sealyao/archive/2010/10/11/5934268.aspx

Linux iptables/Netfilter 防火墙 详解 Linux iptables/Netfilter 防火墙详解防火墙的概念1、安全技术2、防火墙的分类3、网络层防火墙4、应用层防火墙iptables 基本认识1、iptables 概念2、Netfilter 组件3、三种报文流向4、iptables 的组成4.1 五表(table)4.2 五链(chain)4.3 五表五链的对应关系(常用是 raw 和 filter)4.4 通过 CLI 查看五表... 阅读详情

相关推荐

Android网络安全:Netfilter与iptables

1、Netfilter与iptables关系 Netfilter: http://www.netfilter.org/: Netfilter is a framework provided by the Linux kernel that allows various networking-related operations to be implemented in the form of customized handlers. Netfilter offers

u013686019的专栏 8780

ipt_do_table函数

一、使用结构体 struct ipt_ip((include/uapi/linux/netfilter_ipv4/ip_tables.h))。 68 /* Yes, Virginia, you have to zero the padding. */ 69 struct ipt_ip { 70 /* Source and destination IP addr */ 71 ...

sidemap的博客 1969

Linux Kernel nf_tables 本地权限提升漏洞(CVE-2024-1086)

2024年1月,各Linux发行版官方发布漏洞公告,修复了一个 netfilter:nf_tables 模块中的释放后重用漏洞(CVE-2024-1086)。在nft_verdict_init()函数的错误处理导致nf_hook_slow()函数在NF_DROP的分支的时候以NF_ACCEPT返回,进而在NF_HOOK()函数产生释放后重用漏洞。鉴于该漏洞易于利用,并且允许本地攻击者提升至ROOT权限。​

李同學AI安全 9745

iptables 四表五链图

iptables 通过配置四表五链,来控制内核多数据包的过滤、记录、转发、修改操作。

my_friend_ship的专栏 1150

别再只盯着Text-VQA了!这4个主流VQA数据集(含中英双语)的保姆级下载与对比指南

本文深入解析了Text-VQA、ST-VQA、OCR-VQA和EST-VQA这4个主流视觉问答数据集的特性与应用场景,提供了详细的下载与预处理指南。通过对比分析,帮助开发者根据项目需求选择最适合的数据集,避免因选型不当导致的模型性能问题,特别适合需要处理中英双语或多模态文本理解的AI项目。

weixin_42524708的博客 360

智能车竞赛独轮组信标灯系统全解析:从硬件选型到实战调试

本文全面解析了智能车竞赛独轮组信标灯系统的核心原理与实战应用。从硬件架构(灯板、灯罩、控制器)的深度剖析,到红外信号(特别是40kHz调制信号)的接收与解码策略,再到车模的灭灯机构设计与路径规划,提供了从硬件选型到软件调试的全链路指南。文章重点分享了实战调试技巧与常见问题排查方法,旨在帮助参赛队伍深入理解系统,提升车模的识别精度与比赛表现。

e4f5g6h的博客 1124

Linux netfilter源码分析(5)

五、 ipt_do_table()函数,数据包的过滤 5.1          ipt_entry 相关结构  ip_tables.hipt_entry结构前面有过了,再看一遍struct ipt_entry{struct ipt_ip ip;/* 所要匹配的报文的IP头信息 */unsigned int nfcache;/* 位向量,标示本规则关心报文的什么部分,暂未使用 *

venoy4806的专栏 916

WinForm轻松打造AntDesign现代化工具栏

摘要: 本文介绍如何在WinForm中利用AntdUI库实现AntDesign风格工具栏,包括安装配置、动态生成按钮/下拉菜单、布局优化及主题美化。通过AntButton、AntDropdown等控件结合事件绑定,可快速构建支持图标、工具提示、权限控制的现代化工具栏,并解决常见图标加载、布局错乱问题。最后提供代码示例与响应式设计技巧,助你打造高效美观的WinForm界面。 (字数:150)

java专栏 1590

iptables/netfilter命令、实现及利用(转)

原文链接:http://blog.youkuaiyun.com/sealyao/article/details/5934268 一、Netfilter和Iptables概述 netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 L...

weixin_33862188的博客 115

【CANoe16安装教程】亲测安装成功

CANoe16安装教程

qq_45302638的博客 2万+

【Oracle数据库】Oracle11g数据库下载与安装教程(超详细安装图解)

Oracle11g是Oracle公司出的一个比较轻量版的数据库,这里重点说一下在window系统上如何安装Oracle11g, Oracle11g是很早之前的安装包,win7 系统安装时不会遇到环境不满足最低要求的提示,win11系统安装时会提醒环境不满足,修改配置文件即可(注意:先安装oracle服务端/oracle客户端,再安装第三方工具(PL/ SQL Developer,DBeaver等)服务器端环境概述:ORACLE数据库版本:Oracle 11g 64位(11.2.0)

qq_34463511的博客 1万+

netfilter/iptables 简介

<!-- @page {margin:2cm} pre.cjk {font-family:"文泉驿微米黑",monospace} p {margin-bottom:0.21cm} code.cjk {font-family:"文泉驿微米黑",monospace} a:link {} --> Linux 安全性和netfilter/iptables L

ccfeng 584

C/C++小宇宙代码(完整代码)

C语言实现小宇宙的完整代码。

AIGC 2523

iptables/netfilter 与 路由表 docker 部署 flannel

iptables/netfilter 我们知道,Linux 网络协议栈非常高效,同时比较复杂。如果我们希望 在数据的处理过程中对关心的数据进行一些操作该怎么 做呢? Linux提供了一套机制来为用户实现自定义的数据包处理过程。 在Linux 网络协议栈中一组回调函数 挂节点,通过这些挂接的钩子函数可以在Linux网络栈处理数据包的过程中对数据包进行一些 操作,例如过滤,修改,丢弃等。整个挂...

weixin_39639119的博客 1457

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1070

构建一个基于Simulink的LC滤波器仿真模型

需求分析LC滤波器(Inductor-Capacitor Filter)是一种常见的无源滤波器,广泛应用于电力电子、通信、音频处理等领域。其主要作用是平滑输入信号中的高频谐波成分,保留低频或直流成分,从而提高输出信号的质量。在电力电子系统中,LC滤波器常用于逆变器、整流器等设备的输出端,以减少开关噪声和电磁干扰(EMI),确保输出电压和电流的稳定性。本项目将基于Simulink平台,开发一个完整的LC滤波器仿真模型,涵盖从电源输入到滤波输出的整个过程,并通过PI控制器实现对滤波效果的闭环控制。

MHD0815的博客 740

netfilter/iptables 简介使用 netfilter/iptables 为 Linux(内核 2.4.x)配置防火墙

<br />简介: netfilter/iptables 是与最新的 2.4.x 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器,则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。Mugdha Vairagade 将介绍 netfilter/iptables 系统、它是如何工作的、它的优点、安装和配置以及如何使用它来配置 Linux 系统上的防火墙以过滤 IP 信息包。<br /> <b

zhangxinrun的专栏 1225

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

iptables教程

netfilter/iptables(简称iptables)是与2.4.x和2.6.x系列版本Linux内核集成的IP信息包过滤系统。

wbo 1313

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

iptables命令_理解 Linux 下的 Netfilter/iptables

Netfilter/iptables 项目由 Rusty Russe 创建于1998年,并于 1999 年建立了 Netfilter Core team,并在此后负责维护此项目,同时也于2000年3月合并进了 linux 2.3.x 版本的 linux 内核。Netfilter/iptables 有三部分组成,分别是Netfilter 框架/Iptables(内核空间)/Iptables 命令行工...

weixin_39746229的博客 2217

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Netfilter和iptables命令详解,从入门到精通

iptables命令详解

meihualing的专栏 3704

netfilter/iptables 原理

1. 引言 linux&nbsp;3.5&nbsp;版本内核开始集成一个&nbsp;IP&nbsp;信息包过滤系统&nbsp;–&nbsp;iptables。 利用&nbsp;iptables,我们可以很有效的控制&nbsp;IP&nbsp;信息包的过滤条件和防火墙配置。 他可以配置有状态的防火墙规则,通过发送或接收信息包所建立的连接的状态来对网络信息包进行过滤。 本文我们就从原理出发,详细介绍一...

居士的优快云 3213

深入理解 netfilter 和 iptables

Netfilter (配合 iptables)使得用户空间应用程序可以注册内核网络栈在处理数据包时应用的处理规则,实现高效的网络转发和过滤。很多常见的主机防火墙程序以及 Kubernetes 的 Service 转发都是通过 iptables 来实现的。关于 netfilter 的介绍文章大部分只描述了抽象的概念,实际上其内核代码的基本实现不算复杂,本文主要参考 Linux 内核 2.6 版本代码(早期版本较为简单),与最新的 5.x 版本在实现上可能有较大差异,但基本设计变化不大,不影响理解其原理。

运维老生常谈 1116

Netfilter iptables 实现分析

1.前言 Netfilter/iptables是Linux的第三代防火墙,在此之前有Ipfwadm和Ip chains两种防火墙。在网络数据包处理过程中,按照数据包的来源和去向,可以分为三类:流入的(IN)、流经的(FORWARD)和流出的(OUT),其中流入和流经的报文需要经过路由才能区分,而流经和流出的报文则需要经过投递,此外,流经的报文还有一个FORWARD的过程。Netfilter/iptables正是通过将一系列调用接口,嵌入到内核IP协议栈的报文处理的路径上来完成对数据包的过滤,修改...

mabin2005的专栏 2811

netfilter和iptables--netfilter源码篇

防火墙是保护服务器和基础设施的重要工具,在Linux系统下,目前广泛使用的防火墙工具是iptables,但实际进行规则实施并产生实际作用的是Netfilter,iptables与内核中的netfilter框架中Hook协同工作,实现IP数据包的控制与过滤,本次将基于Linux6.5从源码视角分析。

weixin_48405654的博客 1920

Netfilter/iptables

不做SNAT时12可以把包传到14,但是14无法响应,因为响应时会把包的源地址转为目标地址,此时目标地址不在一个网段,同时没有路由,不是同一网段,无法到达13主机,就无法响应。优先级:security --> raw --> mangle --> nat --> filter。:::info iptables -t 表 -vnL 链(大写) 指定查看规则。iptables -nL [指定链] --line-numbers 显示行数。SNAT(地址伪装)--内网* 访问 公网--POSTROUTING链。

Meng677的博客 850
上一篇: OSGi 体系结构及Bundle简介
下一篇: 格式化字符串攻击原理及示例
ShenRui
博客等级 码龄20年 63粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值