【发布时间】:2022-10-19 08:03:43
【问题描述】:
我在目标系统上有一个内核(4.14.136),其中 netfilter 多端口匹配支持未配置为内置或可加载模块:
$ zgrep MULTIPORT /proc/config.gz
# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
正如预期的那样,尝试将multiport 与iptables 一起使用不起作用:
$ iptables -A OUTPUT -o eth1 -p udp -m multiport --dports 1111,2222 -j LOG
iptables v1.8.2 (legacy): Couldn't load match `multiport':No such file or directory
在开发机器上,我将内核重新配置为支持multiport 作为模块,运行make modules 并将新的模块文件net/netfilter/xt_multiport.ko 复制到目标机器。我没有重新启动目标,所以内核仍然是没有配置multiport 模块的“旧”内核。
在目标上,新的 multiport 模块加载没有问题或错误:
$ zgrep MULTIPORT /proc/config.gz
$ CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
$ insmod /root/xt_multiport.ko
$ lsmod
Module Size Used by
xt_multiport 4921
我现在可以添加之前失败的iptables 规则。现在,当我将数据包发送到端口 1111 或 2222 时,该规则会将条目发送到 syslog,因此 multiport 模块似乎正在工作。
这是为什么?如果您尝试加载在内核配置中设置为“未设置”的模块,我认为内核会给您错误。
【问题讨论】:
-
.config 由内核在构建时使用,而不是在运行时使用。请注意,定义可能会在其他地方使用,因此您的计划在某些情况下会失败。
-
我不明白你的问题。在第一部分,您没有编译模块。内核尝试加载模块并找不到匹配模块并给您一个错误。所以你有一个错误。模块通常独立于主内核(因此有用),因此内核不应该知道您编译了哪些模块。
-
@stark 我的问题是基于我的(错误的)假设,即内核只能加载内核
.config中设置为=m的模块。因此我很困惑为什么不是这样。首先,我不确定您对我们的评论是什么意思,但现在在阅读了@MarcoBonelli 的回答后,我明白了您的意思。 -
@GiacomoCatenazzi 我以为我有问题,但实际上一切都按预期工作! :D 关于缺少模块的第一个错误是预期的。我感到困惑的是关于没有问题的模块加载的后半部分。但这是由于我对内核 .config 和模块加载的误解。
标签: linux linux-kernel