IPSET 匹配对于一个 Linux 安装不可用,但对另一个安装不可用......并且只有 IPv4 受到影响

IPSET 匹配对于一个 Linux 安装不可用,但对另一个安装不可用......并且只有 IPv4 受到影响

我有两台 Ubuntu 16.04 服务器,一台位于本地网络上的小型 intelatom itx 盒子上,另一台作为 VPS 托管。两者均在上周全新安装。两者的配置通常相同,只是在强化可公开访问的 VPS 方面付出了更多努力。两者都没有重新编译内核。两者通常都安装了相同的软件包集。

然而......其中之一,VPS,坚持认为它的网络过滤器无法与 ipsets 匹配。

wolferz@unipuma ~ $ sudo shorewall check
Checking using Shorewall 5.1.6.1...
Processing /etc/shorewall/params ...
Processing /etc/shorewall/shorewall.conf...
Loading Modules...
Checking /etc/shorewall/zones...
Checking /etc/shorewall/interfaces...
Determining Hosts in Zones...
Locating Action Files...
Checking /etc/shorewall/policy...
Adding Anti-smurf Rules
Checking TCP Flags filtering...
Checking Kernel Route Filtering...
Checking Martian Logging...
Checking MAC Filtration -- Phase 1...
Checking /etc/shorewall/blrules...
   ERROR: ipset names in Shorewall configuration files require Ipset Match in your kernel and iptables /etc/shorewall/blrules (line 39)

我打算使用的配置在很大程度上取决于用于动态黑名单和白名单大型 IP 集的 ipsets。因为 netfilter 不适合经常更改或拥有大量规则列表(每个 ip 一个……通常有数千个)。

如果没有 ipset 匹配,这里就无法前进。尽管我使用 Shorewall 来管理 netfilter 和 ipsets,但这似乎不是 Shorewall 问题。除非它的检测以某种方式倾斜......但我不知道如何确认它的输出。

以下是 Shorewall 在 VPS 上检测到的内核 netfilter 功能。

wolferz@unipuma ~ $ sudo shorewall version
5.1.6.1

wolferz@unipuma ~ $ sudo shorewall show -f capabilities | grep IPSET
IPSET_MATCH=                <== this is the problem
IPSET_MATCH_COUNTERS=       <== this is not great either
IPSET_MATCH_NOMATCH=        <== this is not great either
IPSET_V5=Yes
OLD_IPSET_MATCH=

wolferz@unipuma ~ $ sudo shorewall6 version
5.1.6.1

wolferz@unipuma ~ $ sudo shorewall6 show -f capabilities | grep IPSET
IPSET_MATCH_COUNTERS=       <== normal for ipv6
IPSET_MATCH_NOMATCH=        <== normal for ipv6
IPSET_MATCH=Yes             <== correct
IPSET_V5=Yes
OLD_IPSET_MATCH=

wolferz@unipuma ~ $ uname --kernel-release
4.4.0-93-generic

wolferz@unipuma ~ $ ipset --version
ipset v6.29, protocol version: 6

wolferz@unipuma ~ $ iptables --version
iptables v1.6.0

wolferz@unipuma ~ $ ip6tables --version
ip6tables v1.6.0

如果它有说明IPSET_MATCH=但后面没有任何内容,则应该显示它IPSET_MATCH=Yes。它在 VPS 上失败,而不是在本地服务器上失败。更奇怪的是,ip6tables 报告了 ipset 匹配支持,而 iptables 没有。

我最初在本地服务器上没有 Shorewall(尽管我计划这样做)...所以我继续安装它。但我很着急,从 apt 安装了它,给了我 Shorewall 版本5.0.4。当它报告它具有完整的 ipset 匹配功能时,我认为这可能是 Shorewall 特有的功能5.1.6.1。所以我使用 apt 从 tarball 中删除5.0.4并安装,5.1.6.1就像在 vps 上一样。两者都5.0.4给出5.1.6.1相同的输出。

wolferz@khaos ~ $ sudo shorewall version
5.1.6.1

wolferz@khaos ~ $ sudo shorewall show -f capabilities | grep IPSET
IPSET_MATCH_COUNTERS=Yes
IPSET_MATCH_NOMATCH=Yes
IPSET_MATCH=Yes
IPSET_V5=Yes
OLD_IPSET_MATCH=

wolferz@khaos ~ $ sudo shorewall6 version
5.1.6.1

wolferz@khaos ~ $ sudo shorewall6 show -f capabilities | grep IPSET
IPSET_MATCH_COUNTERS=
IPSET_MATCH_NOMATCH=
IPSET_MATCH=Yes
IPSET_V5=Yes
OLD_IPSET_MATCH=

wolferz@khaos ~ $ uname --kernel-release
4.4.0-93-generic

wolferz@unipuma ~ $ ipset --version
ipset v6.29, protocol version: 6

wolferz@unipuma ~ $ iptables --version
iptables v1.6.0

wolferz@unipuma ~ $ ip6tables --version
ip6tables v1.6.0

相同的发行版,相同的版本,相同的内核。好吧,所以我想,也许他们安装 VPS 的模板被篡改了。我决定检查已安装模块的差异:

wolferz@unipuma ~ $ sudo ls -R -D /lib/modules/4.4.0-93-generic/kernel/ | grep -P '\.ko$' | sort > unipuma_sorted_modules.list

... scp 将其发送到其他主机...

wolferz@khaos ~ $ sudo ls -R -D /lib/modules/4.4.0-93-generic/kernel/ | grep -P '\.ko$' | sort > khaos_sorted_modules.list

wolferz@khaos ~ $ diff --brief --report-identical-files khaos_sorted_modules.list unipuma_sorted_modules.list

Files khaos_sorted_modules.list and unipuma_sorted_modules.list are identical

然后我检查了我正在使用的内核的实际配置:

wolferz@unipuma ~ $ sudo cat /boot/config-4.4.0-93-generic | grep -P '(?:NETFILTER|IPSET)' | sort > unipuma_kernel_config.list

wolferz@khaos ~ $ sudo cat /boot/config-4.4.0-93-generic | grep -P '(?:NETFILTER|IPSET)' | sort > khaos_kernel_config.list

wolferz@khaos ~ $ diff --brief --report-identical-files khaos_kernel_config.list unipuma_kernel_config.list
Files khaos_kernel_config.list and unipuma_kernel_config.list are identical

那么好吧。让我感到困惑。相同的内核。相同的模块。相同的配置。不同的能力。呃?

而且...只是为了在传递时切断这种思路...它也不是虚拟主机。我有第三台服务器运行 CentOS6,具有相同版本的 shorewall(以及旧版本的 netfilter/iptables/ipset),但不存在此问题。它托管在同一物理机上,使用与上述 Ubuntu 16.04 vps 相同的虚拟化 (KVM)。

...帮助?

答案1

那么好吧。感谢所有好主意。没有你们的帮助就不可能做到这一点。

正如我所知道的,这个问题非常简单。在 shorewall.conf 文件中,我有以下行:

IPTABLES=/sbin/ip6tables

问题是...那是 shorewall.conf 文件。不是 shorewall6.conf 文件。当我开始配置 ipv4 的一半时,我已经复制了它,显然,错过了那个特定的“6”。

修正后的行是:

IPTABLES=/sbin/iptables

因此,为什么这个问题表现得像一个iptables问题……确实是这样。所以是的...三天后...

相关内容