Centos

如何屏蔽中國並在重啟後保持屏蔽?執行中有問題

  • January 5, 2022

我正在嘗試使用此解決方案

我正在執行 Centos 7 和 iptables v1.4.21。

為什麼我需要它? 我有幾個 Wordpress 部落格。我每天都會收到 4000 到 20000 次暴力登錄、不存在的文件以及自動嘗試查找易受攻擊的外掛和文件以供以後利用的情況。他們都來自中國。其他國家也有,但一天不到1000個。所以我想幫助一點安全性並在這些請求到達網路伺服器或 PHP 引擎之前阻止它們以節省硬體資源。我考慮在 Security StackExchange 上提問,但我認為這裡更好。不過不知道。我想避免重複的問題。

我的腳本如下所示:

# Create the ipset list
ipset -N china hash:net

# remove any old list that might exist from previous runs of this script
rm cn.zone

# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done

# Restore iptables
/sbin/iptables-restore < /etc/sysconfig/iptables

規則文件看起來像這樣(沒有空格,沒有新行):

[root@myserver etc]# cat /etc/sysconfig/iptables
-A INPUT -p tcp -m set --match-set china src -j DROP
[root@myserver etc]#

當我執行腳本時,我得到了這樣的錯誤:

ipset v7.1: Element cannot be added to the set: it's already added
ipset v7.1: Element cannot be added to the set: it's already added
ipset v7.1: Element cannot be added to the set: it's already added
ipset v7.1: Element cannot be added to the set: it's already added
(a plenty of the same lines)

在這裡,我看到了兩個或三個問題:

  • 當我將 IP 添加到 IPset 一次時,它們已經存在了。在腳本開頭添加一些將所有IP從中國黑名單中刪除的內容不是更好嗎?
  • 如果是,該怎麼做?
  • 重啟後如何恢復ipset?也許只是讓相同的腳本在啟動時執行?

Ps 添加後我看到了這個 - 這似乎很好,但我仍然想解決上述問題:

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       tcp  --  anywhere             anywhere             match-set china src

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

ipset有一個子命令來原子交換兩組:(swap-W)。這允許填充一個新集,將其與舊集交換,並使用新名稱刪除現在無用的集。這比刷新集合(使用ipset flush china)要好,因為這會暫時使系統暴露,並允許用不同的參數替換集合,而不必刪除引用它的iptables規則(因為在仍然被引用時不能銷毀集合)。我也在切換到ipset的較新語法,這是最近的聯機幫助頁中唯一保留的語法(兩種語法都有效)。

# -exist for idempotence: don't trigger an error the 2nd time this script is run
ipset -exist create china hash:net

# old cn.zone will stay around if download fails
wget -O /etc/cn.zone.tmp http://www.ipdeny.com/ipblocks/data/countries/cn.zone && \
   mv /etc/cn.zone.tmp /etc/cn.zone

ipset create china.tmp hash:net
sed 's/^/add china.tmp /' /etc/cn.zone | ipset -exist restore   
ipset swap china china.tmp # new set atomically replaces older set
ipset destroy china.tmp

/sbin/iptables-restore < /etc/sysconfig/iptables

用(正確格式化的輸入饋入)替換循環ipset -exist restore將條目的載入提高了兩個數量級(這裡循環測試從 ~ 6 秒到 ~ 0.06 秒)。-exist在這裡,以防輸入列表本身包含重複項,以忽略它們並防止在載入條目時過早中止。如果您認為輸入列表可能包含不可解析的內容,那麼要麼對其進行過濾以使其可解析(例如:刪除任何空行)或恢復為循環,但for最好使用以下while read構造:

while read net; do
   ipset -exist add china.tmp "$net"
done < /etc/cn.zone

iptables-restore可以留在目前腳本中,也可以放在單獨的腳本中(這將取決於目前腳本,因為 iptables 的規則取決於已經創建的集合)以保持更新集合和更新 iptables 規則的功能分開.

我確信腳本可以進一步改進(尤其是在載入cn.zone預計在啟動時會失敗的文件時,即使這不會影響整體結果。也許這也應該被拆分)。

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