Ubuntu

IPSET 匹配不適用於一個 linux 安裝,但不是另一個…並且只有 IPv4 受到影響

  • September 8, 2017

我有兩台 Ubuntu 16.04 伺服器,一台在我的本地網路上的一個小型 intel atom 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)

我打算使用的配置在很大程度上依賴於 ipsets,用於對大量 IP 進行動態黑名單和白名單。因為 netfilter 不適合經常更改或擁有大量規則列表(每個 ip 一個……通常是數千個)。

沒有ipset匹配,這裡就沒有進展。儘管我使用 Shorewall 來管理 netfilter 和 ipset,但這似乎不是 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。所以我像在 vps 上一樣使用 apt 從 tarball 中刪除5.0.4和安裝。5.1.6.1兩者都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) 託管在同一台物理機器上。

…幫助?

那好吧。感謝所有偉大的想法。沒有你們的幫助是做不到的。

問題很簡單,就像我知道的那樣。在shorewall.conf 文件中,我有以下行:

IPTABLES=/sbin/ip6tables

問題是……那是shorewall.conf 文件。不是shorewall6.conf 文件。當我開始配置 ipv4 一半時,我已經複製了它,並且顯然錯過了那個特定的“6”。

修正後的行是:

IPTABLES=/sbin/iptables

因此,為什麼這個問題表現得像一個iptables問題……它有點像。所以是的…… 3天后……

引用自:https://unix.stackexchange.com/questions/390839