[教學] 自動透過 iptables 封鎖 IP 黑名單
網路的世界,總是存在一群隱密的駭客,無時無刻連線網路上主機所開放的任何連接方式,來嘗試入侵或破壞。當完成一台主機的部署之後,第一件要做的就是建立安全區的連線,透過基本的 iptables 設定,在最短時間將主機設定允許的連線區域,避免在軟體環境尚未更新或設定前就被攻破。
這看似十分安全,但當主機真正開始提供服務時,部份需公開的服務就可能不受 iptables 設定保護(如 WEB,匿名FTP),此時,我們也沒辦法告訴 iptables 誰可能駭客,也不可能隨時盯著連線IP來分析。這時就會想,如果有誰能告訴我那些 IP 可能是危險的那有多好?!
www.spamhaus.org 提供了一個固定更新的黑名單,會自動將網路上不法的 IP 定期記錄於 http://www.spamhaus.org/drop/drop.lasso 清單當中,因此,我們可以透過 Shell 腳本 + Crond 自動排程,每天自動下載該清單,並寫入我們的 iptables 設定中來阻擋那些可疑的 IP 。
依據官方解釋,這些 IP 網段主要是被用來當做發送垃圾封包使用,因此,這並不能有效的阻擋真實 IP 的攻擊,若要對真實 IP 來查驗,那可能只能多透過腳本寫出針對本機連線的次數、特性等分析加阻擋。但無論如何,我們還是把它列入阻擋清單當中吧。
我習慣將 iptables 寫成腳本來呼叫,這樣一來方便備份設定,另外也能快速加入新的條件,如果了解 iptables 運作,可以參考上面的圖。
接下來,來看基本型的 iptables 腳本(set_iptables.sh)。
#!/bin/bash # # iptables 基本設定腳本檔 # # 將 iptables 清空重設,只允許指定的服務連線 # PATH=/sbin:/bin:/usr/sbin:/usr/bin; export PATH ### iptables 清空初始化 ### iptables -F # 清空所有鏈的規則 iptables -X # 刪除所有非內建的鏈 iptables -Z # 將所有的計數器歸零 iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ### 允許本機和已經建立連線的封包通過 ### iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT ### icmp 全部開放 ### iptables -A INPUT -p icmp -j ACCEPT ### sshd 內網 開放 ### iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3322 -j ACCEPT ### nginx 全部開放 ### iptables -A INPUT -p tcp --dport 80 -j ACCEPT ### 儲存設定檔給下次開機使用 ### iptables-save > /etc/sysconfig/iptables
當我需要更改服務的 port 或添增時,我就只要更改這個腳本檔,並再重新呼叫。
再來看看如何達成自動下載 drop list 並生效的腳本(set_iptables_drop_lasso.sh)
#!/bin/bash # # iptables 阻擋黑名單腳本 # # 透過下載 http://www.spamhaus.org/drop/drop.lasso 提供的黑名單 # 產生一組專門阻擋的 chain,並建議使用 link (ln) 至 crond 來達成每日自動更新 # PATH=/sbin:/bin:/usr/sbin:/usr/bin; export PATH ### 設定暫存檔與 drop.lasso url FILE="/tmp/drop.lasso" URL="http://www.spamhaus.org/drop/drop.lasso" CHAIN_NAME="DropList" ### 準備開始 ### echo "" echo "準備開始產生 $CHAIN_NAME chain 至 iptables 設定中" ### 下載 drop.lasso ### [ -f $FILE ] && /bin/rm -f $FILE || : cd /tmp wget $URL blocks=$(cat $FILE | egrep -v '^;' | awk '{ print $1}') ### 清空與產生 chain ### iptables -F $CHAIN_NAME 2>/dev/null iptables -N $CHAIN_NAME 2>/dev/null ### 放入規則 ### for ipblock in $blocks do iptables -A $CHAIN_NAME -s $ipblock -j DROP done ### 刪除並放入主 chain 生效 iptables -D INPUT -j $CHAIN_NAME 2>/dev/null iptables -D OUTPUT -j $CHAIN_NAME 2>/dev/null iptables -D FORWARD -j $CHAIN_NAME 2>/dev/null iptables -I INPUT -j $CHAIN_NAME 2>/dev/null iptables -I OUTPUT -j $CHAIN_NAME 2>/dev/null iptables -I FORWARD -j $CHAIN_NAME 2>/dev/null ### 刪除暫存檔 ## /bin/rm -f $FILE ### 完成 ## echo "已完成"
這個腳本的內容我就不再詳加解釋,有興趣的就再研究看看啦。
您可以延伸閱讀這些文章:
友站鏈結
標籤
Cache CentOS Convert Image Convert Photo DISK ESX Firewall FTP Highlighter htop HTTP iftop ImageMagick iotop IPTABLES LinkWithin Linux Manager Tools Memory Network Network Setting Nginx OS PHP PHP-FPM Proftpd Security Server Service SSH Syntax VMDK VMware VMware Tools vSphere Web Windows Live Write WLW WordPress WordPress Plugin XmlRpc 資訊安全 防火牆免責聲明
本網站對於任何使用或引用本網站網頁資料,引致之損失或損害,概不負責。 本網站亦有權隨時刪除、暫停或編輯本網站所登載之各項資料,以維護本網站之權益。