close

自動透過 iptables 封鎖 IP 黑名單

By 阿百 On 2012 年 11 月 12 日 ·

網路的世界,總是存在一群隱密的駭客,無時無刻連線網路上主機所開放的任何連接方式,來嘗試入侵或破壞。當完成一台主機的部署之後,第一件要做的就是建立安全區的連線,透過基本的 iptables 設定,在最短時間將主機設定允許的連線區域,避免在軟體環境尚未更新或設定前就被攻破。

這看似十分安全,但當主機真正開始提供服務時,部份需公開的服務就可能不受 iptables 設定保護(如 WEB,匿名FTP),此時,我們也沒辦法告訴 iptables 誰可能駭客,也不可能隨時盯著連線IP來分析。這時就會想,如果有誰能告訴我那些 IP 可能是危險的那有多好?!

www.spamhaus.org 提供了一個固定更新的黑名單,會自動將網路上不法的 IP 定期記錄於 http://www.spamhaus.org/drop/drop.lasso 清單當中,因此,我們可以透過 Shell 腳本 + Crond 自動排程,每天自動下載該清單,並寫入我們的 iptables 設定中來阻擋那些可疑的 IP 。

dropadvisory

依據官方解釋,這些 IP 網段主要是被用來當做發送垃圾封包使用,因此,這並不能有效的阻擋真實 IP 的攻擊,若要對真實 IP 來查驗,那可能只能多透過腳本寫出針對本機連線的次數、特性等分析加阻擋。但無論如何,我們還是把它列入阻擋清單當中吧。

iptables_small

我習慣將 iptables 寫成腳本來呼叫,這樣一來方便備份設定,另外也能快速加入新的條件,如果了解 iptables 運作,可以參考上面的圖。

接下來,來看基本型的 iptables 腳本(set_iptables.sh)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/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"
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 "已完成"

這個腳本的內容我就不再詳加解釋,有興趣的就再研究看看啦。

文章來源:http://yenpai.idis.com.tw/archives/399-%E6%95%99%E...

arrow
arrow
    創作者介紹
    創作者 Johnson峰 的頭像
    Johnson峰

    Johnson峰的部落格

    Johnson峰 發表在 痞客邦 留言(0) 人氣()