動作

Link Control

出自 Itsmw

在Linux閘道器下的網路管控

 本文主要是沿續「橋接式防火牆」及「NAT主機」兩文,說明其後續的資安控管作法。由於這兩者皆是使用 OB2D 架設,並利用 iptables 來做為封包過濾的機制,因此,他們內部網路的終端設備控管方式是一樣的。

 其實大部分的管制措施都只管到「君子」而已,對技術高超的「小人」無效。下面有一篇可以讓網管們知己知彼的好文「如何突破區域網路對上網的限制」,大家先看一下: http://forum.slime.com.tw/thread165780.html
 看完只有一個感想,如果我的技術連「加密跳板(FLAT)」都防得了,那不就可以開公司賣那種一台數百萬的 IPS(入侵防禦系統)了嗎?第二個感想,難怪那些數百萬的 IPS 設定畫面超級複雜。



通訊埠管制

 「通訊埠是否要管制?」這個問題,見人見智,其實沒有標準答案。尤其在台南縣,因為各校皆已建置妥硬體防火牆,所以校內是否還要管制通訊埠便是個難題。以下筆者列示一下各自的優缺點,以筆者的價值觀暨 NGN 專案建議架設 NAT 主機考量下,筆者比較建議學校採用預設不管制的作法。

  • 預設管制,只開放部分
    • 做法:可參考 http://myip.tw/b2ddoc/LinuxBase/m7_security.html 有關 NAT 通訊埠過濾等相關部分文件
    • 優點:若內部機器中毒,無法對外掃描入侵,網路隔離效果較好。
    • 缺點:必須充分考慮各種預設狀況,若少開一兩組通訊埠,造成設備無法連線,也是一種困擾。
  • 預設不管
    • 做法:NAT主機部分,只要做到啟動封包轉送,其餘通訊埠的管理,保留其預設的設定。
    • 優點:簡單好設,相容性高
    • 缺點:無法完全隔離內外網段



連線狀況檢視

流量檢視

 BandWidthd 是一套簡易的流量監控軟體,只要啟動後,它會產生日、週、月的 TOP 20 IP 流量表,並製成網頁,我們只要建立起網頁連結,並設妥連線限制,便可安心的提供給網管人員之重要參考。值得注意的是,它必須架在流量的咽喉點(如 NAT 或橋接式防火牆)上,當所有內網的網路封包皆經由它進出,所抓的流量才是確實有用的資料。

  • 安裝 bandwidthd
    root@nat:~# apt-get install bandwidthd

Interface to listen on: eth1   (BridgeMode 也一樣)
Subnets to log details about: 192.168.110.0/24   (BridgeMode 改成實體 IP,例: 163.26.182.0/24
Recover old data from logs on restart? <是>

  • 註解
    • 註1: Interface --> 虛擬 IP 的網卡, 例: eth1
    • 註2: Subnets --> 要監聽的網段, 依虛擬 IP 所設定的網段為準,例: 192.168.110.0/24


  • 建立 /etc/bandwidthd/bandwidthd.conf,以下為參考檔,請實況修改內容
####################################################
# Bandwidthd.conf
#
# Commented out options are here to provide documentation and represent defaults

# 監控網段,必須使用 CIDR 格式的遮罩寫法
subnet 192.168.110.0/24

# 監控網卡:NAT 填虛擬 IP 卡; BridgeMode 填 br0
dev "eth1"


###################################################
# Options that don't usually get changed

# An interval is 2.5 minutes, this is how many intervals to skip before doing a graphing run
#skip_intervals 0

# Graph cutoff is how many k must be transfered by an ip before we bother to graph it
#graph_cutoff 1024
#Put interface in promiscuous mode to score to traffic that may not be routing through the host machine.

# 靜聽模式,因實際流量一定會經過網卡,所以設成 false
#promiscuous true
promiscuous false

#Log data to cdf file htdocs/log.cdf
#output_cdf false

output_cdf true

#Set the cdf log output directory
#log_dir "/var/lib/bandwidthd"

#Read back the cdf file on startup
#recover_cdf false

recover_cdf true

#Libpcap format filter string used to control what bandwidthd see's
#Please always include "ip" in the string to avoid strange problems
#filter "ip"

#Draw Graphs - 設成 true 後,會動用某程度的 RAM 及 CPU 使用率
graph true

#流量圖幾秒更新一次(default 150, use 0 to disable).
#meta_refresh 150
meta_refresh 150

#放置流量圖之實體位置
htdocs_dir "/var/lib/bandwidthd/htdocs"


  • 建立 http://nat.your.domain/bandw 網頁
    • 建立 /etc/apache2/conf.d/bandw.conf
      root@dns:~# vi /etc/apache2/conf.d/bandw.conf (內容如下所示)

Alias /bandw /var/lib/bandwidthd/htdocs

<Directory /var/lib/bandwidthd/htdocs>
   Options FollowSymLinks
   Order deny,allow
   Deny from all
   # 在此加上允許瀏覽的網址
   Allow from 127.0.0.1 163.26.182.0/24
</Directory>

  • 重新啟動 Apache2
    root@dns:~# service apache2 restart
  • 測試連線注意:剛裝好的流量監控,必須耐心等待其產生報表及圖檔,最好是等一小時以上再檢視


  • 連線示例
Bandwidthd Sample.png




動態連線狀況

  • 用 TCPTRACK 觀看目前內網對外動態連線狀態
    • 先確定是否已安裝
      root@nat:~# dpkg -l |grep tcptrack
      若跳出一行空白列,就是沒安裝,此時才需依下面步驟安裝。
    • 安裝
      root@nat:~# apt-get install tcptrack
    • 假設 192.168.1.0/24 是設定在 eth1 網卡上,可用下列指令檢視動態連線狀況
      root@nat:~# tcptrack -i eth1


  • 使用 IPTRAF 工具
    • iptraf 是可以在文字介面運作的圖形化網路狀況檢視器,功能遠比 tcptrack 強大許多
    • 安裝root@dns:~# apt-get install iptraf
    • 使用方法暫時沒空介紹



內部網路連線管理

 若學校的 NAT 主機架設實體與虛擬皆接回主線路,那麼校內網路設備(含 NGN 無線 AP 上網),其虛擬 IPv4 封包都一定會經過此主機才上得了網路。因此,我們就可以處理以下幾件事情:

  1. 監控內網的流量
  2. 利用鎖 MAC 位址技術,對問題的設備進行斷線處理,令其無法上網攻擊別人。


流量管制

 開學以來,一直有兩個 user 在剛下班時間或半夜大量下載東西,導致全校網路變得很慢,造成其他 user 的不便。因此計畫對學校的網路架設 QoS 機制。計畫分成兩部分處理,實體 IP 部分採用 OB2D增設一台 Bridge Mode FireWall+TC(htp演算法)+IPTABLES,原本的 NAT 就在其上直接設定 TC+IPTABLES。

 而且基於對同事間的尊重(其實是自己懶),只會針對某幾台流量特大的 MAC 做限制,不防礙其他善良老百姓。因此研究了一下單一IP 限制上傳與下載的流量的方法,目前找到較合理的方式是使用 tc 指令,下列是參考文件...。但是管制一兩天後發現,該 user 不知使用什麼工具,在大多數時間的平穩後,仍會有短暫暴量(27mbit/s),這樣仍會干擾學校網路運作。因此,不得已只好採用 iptables 的每秒封包限制措施,才成功壓下去,不知有無其他網管已採用而知道原因,若有再來信與筆者分享一下,感謝了。

IPTABLES+TC(HTB)



  • 由於 tc 指令是由 iproute 套件所提供,所以要先確認 iproute 套件是否已安裝
    root@dns:~# dpkg -l |grep iproute
    若出現下列訊息,代表套件已被安裝。
ii  iproute      20100519-3      networking and traffic control tools


  • 若沒安裝,安裝指令如下
    root@dns:~# apt-get update
    root@dns:~# apt-get install iproute


  • 使用本站提供的 fwtc.sh 協助流量管制
    • 功能:適用於 nat 及 bridge mode 下,針對某段IP或特定 MAC 進行流量管制
    • 原理:使用 tc 指令來管制流量可分成 cbq 及 htb 兩種方法,筆者所採用的是 htb 過濾法,它在塔配 iptables 的 set-mark 後,可簡化 tc 參數。加上 iptables 精準的抓取能力,例如某台 mac;某種協定(L4 or L7)等,形成強大的過濾力。
  • 先切換成 root 身份
    root@dns:~# sudo -i
  • 設定參數
    編輯 yhtools 資料夾內的「 fwtc.sh 」,修改下列參數(請依提示填入正確參數)
    root@dns:~/yhtools# vi fwtc.sh
#----------------------- 共用參數設定區------------------------------------
#上傳限制網卡;實體 IP 或 Bridge 對外(連接路由端)
DEV_UP="eth0"

#下載限制網卡;虛擬 IP 或 Bridge Mode 的內網(連集線器端至全部內網)
DEV_DW="eth1"

#防火牆種類,限填:"nat" 或 "bridge"; 註:bridge 指的是透通式防火牆,IN/OUT 皆實體 IP
FWTYPE="nat"

#管制類型:限填:"ipr", "mac",分別指的是「IP範圍」或「網卡MAC位址」
TCTYPE="ipr"

#對外上傳實際最大頻寬,單位為 mbit 或 kbit
UPMAX="100mbit"

#對外下載實際最大頻寬,單位為 mbit 或 kbit
DWMAX="100mbit"

#每台 Client 流量限制,注意此處的計量單位是 kbytes/秒
##上傳保證頻寬(不可以太大),最好直接由「最大頻寬 / Client數」
UpRate="100kbps"
##上傳最大頻寬
UpCeil="400kbps"
##下載保證頻寬(不可以太大),最好直接由「最大頻寬 / Client數」
DwRate="200kbps"
##下載最大頻寬
DwCeil="800kbps"
#-----------------------------------------------------------------------


#------------------------- 選用 IP 範圍(ipr)設定區-----------------------------
#控制網段,請填 IPv4 網段前三碼再加「.」,例 "192.168.1."
NETC="192.168.110."

#起始 IP
IPS="2"

#結束 IP
IPE="254"
#-----------------------------------------------------------------------
#------------------------ 選用 mac 管控(mac)設定區-----------------------------
#每個 mac address: (1).獨立一列,(2).大寫;下列內容為書寫範例
MACL="
00:50:7F:AB:XX:XX
D0:27:88:23:XX:XX
00:22:15:C4:XX:XX
00:26:18:87:XX:XX
"
#-----------------------------------------------------------------------
  • 啟動/關閉/狀態顯示
    啟動:root@dns:~/yhtools# ./fwtc.sh start
    中止:root@dns:~/yhtools# ./fwtc.sh stop
    顯示狀態:root@dns:~/yhtools# ./fwtc.sh show


 註:程式無法盡如人意,部分功能可能不符合您的需求,請自行修改套用。

純IPTABLES

  • 使用 iptables 的每秒封包數限制
iptables -A FORWARD -m mac --mac-source 48:5B:39:XX:XX:XX -m limit --limit 60/s --limit-burst 65 -j ACCEPT
iptables -A FORWARD -m mac --mac-source 48:5B:39:XX:XX:XX -j DROP

 註1:實際上 IPTABLES -m limit 大多用於阻擋 DDoS 攻擊用,做為流量管制需填思,因為這會造成被控方封包 lost 率升高。
 註2:若平均封包大小在 1500 bytes 左右,每秒 60 封包,就已接近 10mbit/s
 註3:經一天的實證下來,有的 user 還是能短暫的(Burst)突破到 15mbit/s 左右,不過這樣也可接受,因為已不再影響全校網路了。



鎖某些特定網站

  • 首先找出該網站之 IP Address,以奇摩為例
    root@dns:~# nslookup tw.yahoo.com -->得到 119.160.246.241 這組 IP
  • 修改 /etc/rc.local ,在以下位置加上紅字部分的規則列

###-----------------------------------------------------###
# 啟動內部對外轉址
###-----------------------------------------------------###
$IPTABLES -t nat -A POSTROUTING -o $FW_IFACE -j SNAT --to-source $FW_IP

###-----------------------------------------------------###
# 啟動外部對內部轉址
###-----------------------------------------------------###
# 凡對 $FW_IP:8080 連線者, 則轉址至 192.168.1.3:80
#$IPTABLES -t nat -A PREROUTING -p tcp -d $FW_IP --dport 8080 -j DNAT --to 192.168.110.3:80

$IPTABLES -A FORWARD -o $FW_IFACE -p tcp -d 119.160.246.241 --dport 80 -j DROP


# 以下封掉內部主機連到外部主機的 port 6677, 請自行針對不同服務 port 號做修改



鎖 MAC 做法

  • 用 nmap 找出連線設備所使用的 IP 及 MAC 位址
    • 假設發現 192.168.110.13 不斷對外掃描,懷疑其可能中毒,不讓其上網的最佳方法是鎖網卡 MAC 位址,這樣一來使用者如果換了 IP Address 也無法上網。
    • 使用 nmap 來找 192.168.110.13 的 MAC 位址
      root@nat:~# nmap -sP 192.168.110.13
    • 使用 nmap 找整個內網所有正在線上的設備
      root@nat:~# nmap -sP 192.168.110.0/24
    • 其他 nmap 的其他用法,請參考本站另一篇文章「Linux 基本工具指令」


  • 修改 /etc/rc.local 鎖其 MAC 位址
    • 註:NAT 主機一定要加在啟動外部對內部轉址後面(紅字部分)。

###-----------------------------------------------------###
# 啟動內部對外轉址
###-----------------------------------------------------###
$IPTABLES -t nat -A POSTROUTING -o $FW_IFACE -j SNAT --to-source $FW_IP

###-----------------------------------------------------###
# 啟動外部對內部轉址
###-----------------------------------------------------###
# 凡對 $FW_IP:8080 連線者, 則轉址至 192.168.1.3:80
#$IPTABLES -t nat -A PREROUTING -p tcp -d $FW_IP --dport 8080 -j DNAT --to 192.168.110.3:80


### 啟動 mac 鎖定功能,把下列清單中的電腦皆鎖起來
$IPTABLES -A FORWARD -p tcp -m mac --mac-source ##:##:##:51:3C:3A -j DROP




限定網內可連線的 IP 範圍

  • 若要限制網內可上網的 IP 範圍, IPTABLES 的寫法如下:
# 只允許某段 range ip 具上網權力,若採用嚴格鎖埠者,只要打開下面第一行即可
#$IPTABLES -A FORWARD -i $LAN_IFACE -p tcp -m iprange --src-range 192.168.110.128-192.168.110.150 -j ACCEPT
#$IPTABLES -A FORWARD -i $LAN_IFACE -p tcp -s 192.168.110.0/24 -j DROP
  • 重點在「-m iprange --src-range」這個參數



L7 Filter

使用 L7-Filter

 七層過濾的意思是,可以直接對封包內容進行過濾。若不加裝 L7Filter 功能,IPTABLES 只能判讀到 L4 的層級,也就是只能管制通訊埠。可是往往一些有資安疑慮的 P2P 或傳訊軟體也很聰明,在大多數埠被封鎖後,改用常用埠來溝通,比如 port 80, 21, 143...等,造成網路安全的危害,因此有必要幫咽喉點上的 firewall 加強封包的過濾能力。

使用 userspace l7-filter 配合 iptables 來過濾封包內容的做法如下:

  • 安裝
    root@fw:~# apt-get install l7-filter-userspace l7-protocols
  • 載入kernel模組:nf_conntrack_netlink
    root@fw:~# modprobe nf_conntrack_netlink
  • 可用樣版檔放置地
    • l7-filter 的樣板檔由 l7-protocols 套用維護,安裝後會放置在 /etc/l7-protocols/protocols 內
    • 裡面有百來個 *.pat 樣板檔,例 xunlie.pat, bittorrent.pat, edonkey.pat 等
  • 建立 /etc/l7-filter.conf 設定檔,加入要攔阻的通訊協定,不必再加副檔名「.pat」
xunlei 9
bittorrent 10
edonkey 11
  • 在背景啟動 l7-filter
    root@fw:~# l7-filter -f /etc/l7-filter.conf &
  • 再加入 iptables 規則列至 /etc/rc.local 至「拒絕外部 IP 連至內部 port 號」之上
###--------------------------------------------------------###
# L7-filter,註: -j QUEUE 是指 FORWARD 封包送至 userspace 去處理
###--------------------------------------------------------###

$IPTABLES -A FORWARD -j QUEUE
$IPTABLES -t mangle -A POSTROUTING -m mark --mark 9 -j DROP
$IPTABLES -t mangle -A POSTROUTING -m mark --mark 10 -j DROP
$IPTABLES -t mangle -A POSTROUTING -m mark --mark 11 -j DROP

###-----------------------------------------------------###
# 拒絕外部 IP 連至內部 port 號
###-----------------------------------------------------###
......

 註:請注意 l7-filter.conf 內的編號與 mark 的編號必須一致



自訂簡易過濾樣板

  • 自訂的樣板,以阻擋 facebook 的遊戲(但仍可上 www.facebook.com)為例
    • 介紹 Pattern 寫法之官方網站
      http://l7-filter.sourceforge.net/Pattern-HOWTO
    • 自訂樣板第一步要使用 wireshark 等軟體來分析封包
    • 再來建立樣板檔,每個樣板檔內容,基本上只要兩行,第一行是樣板名稱,第二行供過濾判斷的正規表達式規則
    • 由於我們的目標只是 facebook 遊戲網站 apps.facebook.com,因此只要針對關鍵字設樣板即可。
      建立 /etc/l7-protocols/protocols/facebook.pat 內容如下
facebook
apps\.facebook\.com
  • 啟用此樣板的做法就如同上面所述一樣,不再重覆。



關閉 l7-filter

  • 首先要修改 /etc/rc.local 把剛加的那幾行加 # 註解
###--------------------------------------------------------###
# L7-filter,註: -j QUEUE: 把 FORWARD 封包送至 userspace 去處理
###--------------------------------------------------------###
#$IPTABLES -A FORWARD -j QUEUE
#$IPTABLES -t mangle -A POSTROUTING -m mark --mark 9 -j DROP
#$IPTABLES -t mangle -A POSTROUTING -m mark --mark 10 -j DROP
#$IPTABLES -t mangle -A POSTROUTING -m mark --mark 11 -j DROP
  • 套用新規則
    root@fw:~# service rc.local start
  • 關閉 l7-filter 背景服務
    • 查出 PID
      root@fw:~# ps aux |grep l7-filter
root     16524  0.0  0.4  20140  1884 pts/1    Sl   16:18   0:00 l7-filter -f /etc/l7-filter.conf
  • KILL PID
    root@fw:~# kill -9 16524



本文小檔案

__NORICHEDITOR__

題名: Title::Firewall 內網的資安控管
作者: Creator::itsmw作者群
主題/關鍵詞: Subject::firewall, tcp/ip layer 4, mac lock
簡述: Description::Firewall 內部網路的通訊埠鎖定與設備斷線處理
出版者: Publisher::台南縣教網中心 itsmw 計畫
其他參與者: Contributor::itsmw作者群
日期: Date::2011-4-26
文件類型: Type::07網路相關
Type::09資訊安全
資料格式: Format::text/html
文件識別代號: Identifier::http://myip.tw/itsmw/index.php/Link_Control
來源: Source::http://myip.tw/b2ddoc/LinuxBase
語言: Language::zh-TW
相關資源: Relation::http://myip.tw
文件涵蓋範圍: Coverage::Linux平台
版權規範: Rights::GNU Free Documentation License 1.2