網路的世界,總是存在一群隱密的駭客,無時無刻連線網路上主機所開放的任何連接方式,來嘗試入侵或破壞。當完成一台主機的部署之後,第一件要做的就是建立安全區的連線,透過基本的 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)。

#!/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 "已完成"

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

Related Posts Plugin for WordPress, Blogger...

您可以延伸閱讀這些文章:

  1. [教學] CentOS 6.3 設定 – (1) 基本調效與 SSH 連線
  2. [教學] 在 CentOS 中使用 Proftpd 來架設 FTP 伺服器
  3. [教學] CentOS 吃了我的記憶體?(Cache Memory)
Tagged with:
 
About The Author

阿百

大家好,我是陳彥百(YenPai Chen)

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

*

你可以使用這些 HTML 標籤與屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>