AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 675052
Accepted
Mark
Mark
Asked: 2021-10-28 12:44:19 +0800 CST2021-10-28 12:44:19 +0800 CST 2021-10-28 12:44:19 +0800 CST

netfilter:丢弃具有 IP 选项的数据包

  • 772

我想添加一个规则来丢弃一个IPv4带有任何IP option跟随头的数据包。我了解标头中IHL的(Internet 标头长度)字段包含 IPv4 标头中的 32 位字数,包括选项。所以,我的理解是,规则应该从IHL字段中获取数据包+选项长度并与 20(不带选项的 IPv4 标头长度)进行比较,如果大于 20,则丢弃数据包。

是否有iptables允许检查IP标头和评估(进行算术运算)的特定模块?

linux networking
  • 1 1 个回答
  • 235 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2021-10-30T02:45:58+08:002021-10-30T02:45:58+08:00

    iptables包括u32match 方法,它允许对数据包有效负载进行一些按位(但不是任意算术)操作、范围比较和一些类似指针的间接操作以匹配条件:

    u32

    U32 测试从数据包中提取的最多 4 个字节的数量是否具有指定值。提取内容的规范足以从 tcp 标头或有效负载中找到给定偏移量的数据。

    它有自己的子语言语法,需要检查手册中的语法和示例。

    IHL是 IP 标头大小(以 32 位块而不是字节为单位)并且是标头中前 32 位的一部分(4 位用于版本,IPv4 值为 0x04,后跟 4 位用于 IHL),因此,如果有没有选项,这个大小应该是最小大小:20(字节)/4(每 32 位字的字节数)所以 IHL = 5(32 位字)。我不会处理 IHL < 5 的无效情况,IPv4 堆栈应该已经解决了这个问题。

    这转化为:

    • 取前 32 位值
    • 为国际人道法部分掩盖它
    • 将其移动 24 位
    • 将相等性与 5 进行比较(!在匹配时反转结果)

    因此,要使用iptables丢弃此类传入数据包:

    iptables -A INPUT -m u32 ! --u32 '0 & 0x0F000000 >> 24 = 5' -j DROP
    

    没有反转(匹配 6 或更大):

    iptables -A INPUT -m u32 --u32 '0 & 0x0F000000 >> 24 = 6:0xF' -j DROP
    

    手册有一个类似的例子,它被移动了 24 位,然后乘以 4(所以只移动了 22 位)以获得字节而不是 32 位字(因为u32稍后使用的指针使用 8 位地址),以检索第 4 层有效载荷并继续进行进一步操作:

    ... 0 >> 22 & 0x3C @ 0 >> 24 = 0"
    

    第一个 0 表示读取字节 0-3,>>22 表示向右移动 22 位。移动 24 位将给出第一个字节,因此只有 22 位是该字节的四倍加上更多位。&3C 然后消除右侧的两个额外位和第一个字节的前四位。例如,如果 IHL=5,那么 IP 报头是 20 (4 x 5) 字节长。
    [...]

    给予 OP 的案例:

    iptables -A INPUT -m u32 ! --u32 '0 >> 22 & 0x3C = 20' -j DROP
    

    没有反转(并且不关心第一个可能的值不是 21 而是 24 也不关心确切的最大值,只要给定的值更大):

    iptables -A INPUT -m u32 --u32 '0 >> 22 & 0x3C = 21:0xFF' -j DROP
    

    第一种方法可以简化为:

    • 取前 32 位值
    • 为国际人道法部分掩盖它
    • 将相等性与 (5<<24) 进行比较,即与 0x05000000 进行比较(同上)

    给予:

    iptables -A INPUT -m u32 ! --u32 '0 & 0x0F000000 = 0x05000000' -j DROP
    

    或者:

    iptables -A INPUT -m u32 --u32 '0 & 0x0F000000 = 0x06000000:0x0F000000' -j DROP
    

    甚至:

    • 取前 32 位值
    • 将值与 0x45000000 和 0x45FFFFFF 之间的范围进行比较以表示 OK(IPv4始终以 4 开头,并且 IHL 部分之后的任何值都将被忽略)或在 0x46000000 和 0x4FFFFFFF 之间的范围内表示不OK。

    给予:

    iptables -A INPUT -m u32 ! --u32 '0 = 0x45000000:0x45FFFFFF' -j DROP
    

    或者:

    iptables -A INPUT -m u32 --u32 '0 = 0x46000000:0x4FFFFFFF' -j DROP
    

    选择您的选择。

    • 2

相关问题

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 奇怪的路由器与centos 6一起工作[关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve