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 / 问题 / 771871
Accepted
metablaster
metablaster
Asked: 2024-03-08 18:35:39 +0800 CST2024-03-08 18:35:39 +0800 CST 2024-03-08 18:35:39 +0800 CST

nftables - 多播数据包不匹配

  • 772

我设置了一条匹配多播数据包的规则,如下所示:

add rule filter_4 new_out_4 meta pkttype multicast goto multicast_out_4

filter_4是 IPv4 表,new_out4是输出链,multicast_out_4是处理纯组播流量的链。

以下是排除不相关部分的 IPv4 表的更完整图片:

#!/usr/sbin/nft -f

add table filter_4

add chain filter_4 output {
    # filter = 0
    type filter hook output priority filter; policy drop;
}

add chain filter_4 multicast_out_4 {
    comment "Output multicast IPV4 traffic"
}

add chain filter_4 new_out_4 {
    comment "New output IPv4 traffic"
}

#
# Stateful filtering
#

# Established IPv4 traffic
add rule filter_4 input ct state established goto established_in_4
add rule filter_4 output ct state established goto established_out_4

# Related IPv4 traffic
add rule filter_4 input ct state related goto related_in_4
add rule filter_4 output ct state related goto related_out_4

# New IPv4 traffic ( PACKET IS MATCHED HERE )
add rule filter_4 input ct state new goto new_in_4
add rule filter_4 output ct state new goto new_out_4

# Invalid IPv4 traffic
add rule filter_4 input ct state invalid log prefix "drop invalid_filter_in_4: " counter name invalid_filter_count_4 drop
add rule filter_4 output ct state invalid log prefix "drop invalid_filter_out_4: " counter name invalid_filter_count_4 drop

# Untracked IPv4 traffic
add rule filter_4 input ct state untracked log prefix "drop untracked_filter_in_4: " counter name untracked_filter_count_4 drop
add rule filter_4 output ct state untracked log prefix "drop untracked_filter_out_4: " counter name untracked_filter_count_4 drop

在上面的设置中,包括多播在内的新输出流量通过规则进行匹配add rule filter_4 output ct state new goto new_out_4

这是new_out_4仅包含不起作用的相关(非工作)多播规则的链:

# Multicast IPv4 traffic ( THIS RULE DOES NOT WORK, SEE LOG OUTPUT BELOW)
add rule filter_4 new_out_4 meta pkttype multicast goto multicast_out_4

#
# Default chain action ( MULTICAST PACKET IS DROPPED HERE )
#
add rule filter_4 new_out_4 log prefix "drop new_out_4: " counter name new_out_filter_count_4 drop

以下是日志中有关丢弃的多播数据包的内容:

删除new_out_4:IN = OUT = eth0 SRC = 192.168.1.100 DST = 224.0.0.251 LEN = 163 TOS = 0x00 PREC = 0x00 TTL = 255 ID = 27018 DF PROTO = UDP SPT = 5353 DPT = 5353 LEN = 143

被丢弃的数据包被发送到目标地址224.0.0.251,这是多播地址,它应该与new_out_4链中的多播规则匹配,并且应该由multicast_out_4链处理,但没有。

相反,数据包不匹配,并被上面链中的默认丢弃规则丢弃new_out_4,请参阅注释(默认链操作)。

显然这意味着组播规则不起作用。

为什么组播规则不起作用?

预期的:

meta pkttype multicast匹配目标地址224.0.0.251

编辑:

系统信息:
内核:6.5.0-0.deb12.4-amd64
与早期内核 6.1 存在相同的问题

nftables:v1.0.6(莱斯特·古奇#5)

firewall
  • 1 1 个回答
  • 28 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2024-03-10T00:32:34+08:002024-03-10T00:32:34+08:00

    使用一些附加条目复制(并完成缺失的部分)设置,例如:

    nft insert rule filter_4 new_out_4 counter meta pkttype host counter
    

    meta pkttype实际上,此 skbuff 的属性不是传出多播数据包的host预期属性。multicast请注意,当引入这个关键字时,它是关于输入,而不是输出:

    src:在元表达式中添加对 pkttype 的支持

    如果你想匹配 skbuff 的 pkttype 字段,你必须使用以下语法:

    nft 添加规则 ip 过滤器输入元 pkttype PACKET_TYPE

    其中 PACKET_TYPE 可以是:单播、广播和多播。

    实际上iptables的直接等价物是pkttype 匹配模块:

    pkttype

    该模块匹配链路层数据包类型。

    [!] --pkt-type {unicast|broadcast|multicast}

    # iptables-translate -A OUTPUT -m pkttype --pkt-type multicast
    nft 'add rule ip filter OUTPUT pkttype multicast counter'
    

    将所有这些放在一起,当创建传出 IP(路由:第 3 层)数据包时,它尚未到达第 2 层(链路层),因此它的 skbuff 不会反映它可能会变成什么,即使以后打算这样做。

    实际应该测试的是关于路由堆栈的IP地址属性,而不是关于以太网的数据包属性。iptables为此提供了addrtype匹配模块:

    addrtype

    该模块根据数据包的地址类型来匹配数据包。[...]

    它的翻译暗示了实际应该使用什么:fib表达式:

    # iptables-translate -A OUTPUT -m addrtype --dst-type MULTICAST
    nft 'add rule ip filter OUTPUT fib daddr type multicast counter'
    

    FIB 表达式

    fib {saddr | daddr | mark | iif | oif} [. ...] {oif | oifname | type}

    fib 表达式查询 fib(转发信息库)以获取诸如特定地址将使用的输出接口索引之类的信息。输入是一个元素元组,用作 fib 查找函数的输入。

    没有多播的直接示例。最近的例子是一个更复杂的例子,关于丢弃不打算用于传入接口上的地址的 pacjet,其中多播属于 3 个例外:

    # drop packets to address not configured on incoming interface
    filter prerouting fib daddr . iif type != { local, broadcast, multicast } drop
    

    因此,只需替换输出(或后路由)挂钩中使用的任何位置即可:

    meta pkttype multicast
    

    和:

    fib daddr type multicast
    

    在输入(或预路由)钩子中,虽然 skbuff 属性可能与 IP 属性匹配,但为了保持一致,也应该将其替换为完全相同:

    fib daddr type multicast
    

    下面的测试命令在 LAN 中的其他主机(用于测试输入)和主机(用于测试输出)上联合使用:

    socat -d -d UDP4-DATAGRAM:224.0.0.251:5555,bind=:5555,ip-add-membership=224.0.0.251:eth0 -
    

    将正确匹配fib daddr type multicast输入和输出。


    重要说明:

    我相信上面解决了这个问题,但请注意,Netfilter 的conntrack无法正确跟踪多播,因为它无法将使用其他单播源地址的回复与初始查询的多播目标地址关联起来:它们不同,因此它考虑回复为其他(新)流,而不是将它们关联起来并将此类回复视为前一个流的一部分。因此,这种流永远不会通过conntrack或conntrack -L命令显示为 ESTABLISHED 状态。规则集应该适应这一点:它不能仅依赖于ct state established,related某种规则,但这超出了这个问题的范围。

    • 1

相关问题

  • 无法通过 WiFi 注册 SIP

  • 在 linux 服务器上发送邮件的 IpTables 规则

  • 何时以及如何在 nftables 中使用链优先级

  • nmap 在一个非常裸的服务器上“过滤”结果 - “过滤”可能只是意味着“沉默”吗?

  • 通过远程端口转发通过 jumphost 进行 SSH 会话

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