動作

OB2D Iptables

出自 Itsmw

Linux防火牆 IPTABLES 簡介

 IPTABLES 這個套件,在 Linux 上的功能很多,它可以對網卡的封包進行「允許/阻擋」、「轉向」、「限制數量」等作業,因此只要搞懂 iptables 的指令,就可以拿它來擔任:

  1. 本機的防禦:限制連線、DoS阻擋等
  2. 網路閘道器:限制流量、NAT架設、連線管控



OB2D情況

 OB2D 安裝完畢,便已內建基本的防火牆規則,它是採 IPTABLES 來進行封包過濾的動作。預設的規則列主要在防止外面主機連線至主機,被阻擋的服務有 FTP, SSH, Samba網芳等。

關於 iptables 的用法,可參考下列相關文件:



Ubuntu桌面版情況

 Ubuntu 桌面版安裝完畢,預設不會啟用任何防火牆措施,不過只要把 iptables 的規則寫入 /etc/rc.local 這個開機預設執行檔,就可以達到相同目的。因此筆者已開發一套工具叫 yhtools 在 http://myip.tw/download/yhtools.tar.gz ,它可以用來協助 ubuntu 桌面版的使用者快速設定防火牆規則列。使用方式請參考本站:YHTools#fw4local.pyw內的文件說明。



基本原理

設定檔

 設定規則列位置及套用方式是 OB2D 專用的方法,與其他 Debian OS 不同。

  • 使用工具: iptables
  • 規則列位置: /etc/rc.local
  • 修改後套用
    root@dns:~# service rc.local start
  • 註: rc.local 原本設計是為開機後要手動執行特定工作的設定區,OB2D 把它借來放置防火牆規則列


基本觀念

  • IPTABLES = "/sbin/iptables"
    這一行是指:設定 IPTABLES 這個變數,以後只要看到 $IPTABLES 這個字串,就代表 /sbin/iptables 這個指令
  • $IPTABLES -F
    這一行是指:把之前所有已設過的規則清空(flush)


封包進出主機方向

 在 /etc/rc.local 內之「設定 filter table 的預設政策」會看到三行設定值,如下:

###-----------------------------------------------------###
# 設定 filter table 的預設政策
###-----------------------------------------------------###
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

 筆者將其簡化說明如下:

  • INPUT   --> 外面要進入主機的網路封包,主要用於規範外面如何連線至主機上的各種服務,與 NAT 內網無關
  • OUTPUT  --> 從主機出去的網路封包。
  • FORWARD --> 從 B 網卡轉至 A 網卡,規範於有 NAT 主機或透通式防火牆用途時,內轉外網路封包之控管。
  • 依上例,預設所有的封包皆開放,不阻擋


INPUT規則列的寫法

規則列的寫法,是把預設政策擺在最下面一行,例外規則擺上面,如下所例

# 只有本主機所屬網段才能連到這台主機的 ssh port 22
$IPTABLES -A INPUT -p tcp -s 163.26.182.0/24 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 203.68.102.0/24 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 220.130.230.76 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 22 -j DROP


上面的規則列可以用下面這張圖來表達,預設 22 埠是不被連線的,但有四個綠點例外。

Iptables sample.png



進階處理

取消某個通訊埠的阻擋

 只要把所有該 port (--dport)的規則列前面加上 # 變成註解,或直接刪除即可,以 FTP 示例如下:

# 只有本主機所屬網段才能連到這台主機的 FTP SERVER port 21
# $IPTABLES -A INPUT -p tcp -s 163.26.182.0/24 --dport 21 -j ACCEPT
# $IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 21 -j ACCEPT
# $IPTABLES -A INPUT -p tcp --dport 21 -j DROP

# 只有本主機所屬網段才能連到這台主機的 ssh port 22
$IPTABLES -A INPUT -p tcp -s 163.26.182.0/24 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 203.68.102.0/24 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 220.130.230.76 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 22 -j DROP




新增例外連線範圍

 若要新增例外連線點,一定要加在相同埠值區塊最後一行之前(建議第一行),假設我們要加中華電信某個網段 59.127.0.0/16 至 Port 22 的例外點上,做法如下:

  • 編輯 /etc/rc.local (紅字為新增部分)
    root@dns:~# vi /etc/rc.local

# 只有本主機所屬網段才能連到這台主機的 ssh port 22
$IPTABLES -A INPUT -p tcp -s 59.127.0.0/16 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 163.26.182.0/24 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 203.68.102.0/24 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 220.130.230.76 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 22 -j DROP


  • 套用新規則
    root@dns:~# service rc.local start



新增某個通訊埠連線限制

以 TCP 1723 為例

 假設主機有架 VPN 服務,經由「netstat -nlp」查詢後得知其使用的埠值為 TCP 1723。因此,為避免不具善意的網客隨便亂測密碼,我們可以在 /etc/rc.loal加上其連線限制。

假設允許的網段為

  1. 校內: 163.26.182.0/24
  2. 校外某點: 220.130.230.76
  • 編輯 /etc/rc.local,在 IPv4 的設定區(就是 /sbin/ip6tables -F 之上),依 port 值排序,大約在網芳區塊後面加上。
    root@dns:~# vi /etc/rc.local(紅字為新增部分)
 ......

$IPTABLES -A INPUT -p tcp --dport 139 -j DROP
$IPTABLES -A INPUT -p tcp --dport 445 -j DROP
$IPTABLES -A INPUT -p udp --dport 137 -j DROP
$IPTABLES -A INPUT -p udp --dport 138 -j DROP

$IPTABLES -A INPUT -p tcp -s 163.26.182.0/24 --dport 1723 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 220.130.230.76 --dport 1723 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 1723 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 1723 -j DROP


/sbin/ip6tables -F
/sbin/ip6tables -A INPUT -p tcp --dport 21 -j DROP
/sbin/ip6tables -A INPUT -p tcp --dport 22 -j DROP
/sbin/ip6tables -A INPUT -p tcp --dport 23 -j DROP
 ......


  • 套用新規則列
    root@dns:~# service rc.local start



以 ICMP 為例

 預設不讓外面網路任意點可以 PING 本主機,造就本主機不存在的假象,但選定數點開放偵測。 假設允許的網段為

  1. 教網中心:163.26.200.0/24
  2. 校內: 163.26.182.0/24
  3. 校外某點: 220.130.230.76


  • 編輯 /etc/rc.local,在 IPv4 的設定區,Port 21 規則列上方。
    root@dns:~# vi /etc/rc.local(紅字為新增部分)
 ......


$IPTABLES -A INPUT -p icmp -s 163.26.182.0/24 -j ACCEPT
$IPTABLES -A INPUT -p icmp -s 163.26.200.0/24 -j ACCEPT
$IPTABLES -A INPUT -p icmp -j DROP


# 只有本主機所屬網段才能連到這台主機的 FTP server port 21
$IPTABLES -A INPUT -p tcp -s 163.26.182.0/24 --dport 21 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 21 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 21 -j DROP
 ......


  • 套用新規則列
    root@dns:~# service rc.local start



防止 DoS 攻擊

 筆者朋友主機最近遭到 DoS 攻擊,我本來以 iptables -m limit 來處理,但發現它會不分來源一律阻擋,這樣無辜的 IP Address 也受到限制,非常不公平,思考並搜尋了一個晚上,後來決定以限制單一 IP 同時連線數(connlimit),來處理此類攻擊,它會把單一 IP 來源同時要求服務(--syn)的連線數,限制在一定的數量以內,正常用人工手動點網頁,就算該網頁有 FrameSet ,應也不致於大過 12(自已用手拼命點得到的結論)才對。因此在設定此限制時,以每一個 IP 同時連線數不得超過 15 為參數,並進行後續的觀察。在設定後,經過一段時間的觀察,CPU 再也不會一直維持在 90-100% 高檔了,大約只會偶而跳至 60-70% ,一般皆在 10 % 以內。重點是它只 tcp-reset 有問題的來源,無辜的人仍可享受應有的速度。

設定方式:

  • 請確認 syslog 有下列參數
    • OB2D 在 /etc/syslog.conf
    • Ubuntu 在 /etc/rsyslog.d/50-default.conf
# iptables 的記錄可以寫入 /var/log/kern.log
kern.*                          -/var/log/kern.log
  • 先把可能攻擊的 ip 寫入 /var/log/kern.log ,再把它的封包無聲的丟掉;以同時 15 個連線為限。
$IPTABLES -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 -j LOG --log-level 4
$IPTABLES -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 -j REJECT --reject-with tcp-reset
  • 分析攻擊可能來源
    • 螢幕觀看(以 tab 鍵分隔欄位)
      root@dns:~# cat /var/log/kern.log |awk '{print $1 "\t" $2 "\t" $9}'
    • 轉至純文字,以供下載至試算表統計
      root@dns:~# cat /var/log/kern.log |awk '{print $1 "\t" $2 "\t" $9}' > /root/dosatt.txt
      呈現的結果部分截取如下:
May	10	SRC=60.250.181.66
May	10	SRC=60.250.181.66
May	10	SRC=60.250.181.66
May	10	SRC=60.251.81.94
May	10	SRC=60.251.81.94
May	10	SRC=60.251.81.94
May	10	SRC=60.251.81.94
May	10	SRC=60.251.81.94
May	10	SRC=60.251.81.94
May	10	SRC=60.251.81.94
May	10	SRC=60.251.81.94
May	10	SRC=60.251.81.94
May	10	SRC=60.250.181.66
May	10	SRC=60.250.181.66
  • 鎖了吧,可疑者!
    若某個 IP 來源您不認識,但每天常常超過,人工點網頁的極限(同時超過 15 個連線數),可以再加以下規則,把它鎖了吧!
$IPTABLES -A INPUT -i eth0 -p tcp -s 60.250.xxx.xx --dport 80 -j DROP




本文小檔案

__NORICHEDITOR__

題名: Title::OB2D Iptables簡介
作者: Creator::itsmw作者群
主題/關鍵詞: Subject::iptables,firewall
簡述: Description::OB2D 內建的防火牆 iptables 簡介
出版者: Publisher::台南縣教網中心 itsmw 計畫
其他參與者: Contributor::itsmw作者群
日期: Date::2010-7-4
文件類型: Type::09資訊安全
資料格式: Format::text/html
文件識別代號: Identifier::http://myip.tw/itsmw/index.php?title=OB2D_Iptables
來源: Source::http://news.ols3.net/techdoc/old/b2dfw_intro/
語言: Language::zh-TW
相關資源: Relation::http://news.ols3.net/techdoc/old/firewall/
文件涵蓋範圍: Coverage::Linux平台
版權規範: Rights::GNU Free Documentation License 1.2