IPSET 匹配不適用於一個 linux 安裝,但不是另一個…並且只有 IPv4 受到影響
我有兩台 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天后……