多年拆除工程經驗,專營裝潢拆除
隔間打牆等施工,歡迎洽詢
比價網創新廣告招牌設計,親民價格
頂級質感,連鎖企業合作推薦!

首頁  •  j2h 論壇 • 程式設計討論     • 

透過iptables來限制上下載的流量

房東:新手
發表時間:2007-03-11


在校園網路裡面為了避免某些人濫用網路資源(架地下ftp)常會限制上下傳的資料量如果不小心用破表了就會被強迫斷線甚至可能會被請到計算機中心喝咖啡順便
說清楚講明白...(以前也曾活在這種恐怖陰影下)
要達到這樣的目的大多都是透過硬體的方式來實現(可是硬體的成本並不便宜)
因此我在想是否有辦法利用Linux強大的網路能力來實現呢?
找了許多關於iptables的資料後終於找到一個解決方法同時也實現了
[原理]
Linux kernel 2.4的Net Filter機制裡面有內建了三個chain
1.INPUT
2.FORWARD <------------我們要討論的主角
3.OUTPUT
既然要達到流量監控因此必須要Router作控管拉...
如果是拿Linux來當作Router的話那勢必得把IP Forwarding的功能給打開來
既然非得要把Forwarding功能打開那封包勢必得通過FORWARD Chain了
因此我們就拿FORWARD Chain來動手腳了
例如我們內部有一個Nat的環境使用的IP範圍是192.168.0.0/24
要監控192.168.0.1這個ip的流量
首先我們先新增兩條rule
iptables -A FORWARD -s 192.168.0.1 -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j ACCEPT
我們使用iptables -L FORWARD -nvx看看我們剛剛建的這兩個rule
Chain FORWARD (policy ACCEPT 3109 packets, 1529728 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 192.168.0.1 0.0.0
0 0 ACCEPT all -- * * 0.0.0.0/0 192.168.0.1
^^^^^^
這個就是我們要監控的主角了
第一個rule表示不管連到哪邊只要來源是192.168.0.1的封包都會經過這條規則
同時bytes也會根據封包的資料量作累加的動作
第二個rule則是不管來源是哪裡只要目的地是192.168.0.1就列入紀錄
所以拉第一條規則就192.168.0.1這個ip的上傳資料量
第二條就是下載的資料量了
我們用個簡單的文字處理規則取出上下傳的資料量
iptables -L FORWARD -nvx|grep "192.168.0.1 *0.0.0.0/0 *$"|awk {'print $2'}---->上傳
iptables -L FORWARD -nvx|grep "0.0.0.0/0 *192.168.0.1 *$"|awk {'print $2'}---->下載
然後寫個script擺在cron裡面定期的去檢查就ok拉....當使用量破表時嘿嘿就把這兩個rule設為drop那192.168.0.1這個ip就在也出不去了

[實作]
以下是我寫的兩支script

將checkquota.sh丟到crontab裡面每隔一段時間跑一次作檢查動作
#################checkquota.sh####################
#!/bin/bash
HostRange=$(cat /etc/NetUsage.conf|grep "^[^ *#]"|awk {'print $1'})
InQuota=$(cat /etc/NetUsage.conf|grep "^[^ *#]"|awk {'print $2'})
OutQuota=$(cat /etc/NetUsage.conf|grep "^[^ *#]"|awk {'print $3'})
TrafficIn=`iptables -L FORWARD -nxv|grep "0.0.0.0/0 *$HostRange *$"|awk {'print
\$2'}`
TrafficOut=`iptables -L FORWARD -nvx|grep "$HostRange *0.0.0.0/0 *$"|awk {'print
\$2'}`
echo "In:$TrafficIn/$InQuota"
echo "Out:$TrafficOut/$OutQuota"
if [ $TrafficIn -gt $InQuota ] ; then
iptables -D FORWARD -d $HostRange -j ACCEPT
iptables -A FORWARD -d $HostRange -j DROP
fi
if [ $TrafficOut -gt $OutQuota ] ; then
iptables -D FORWARD -s $HostRange -j ACCEPT
iptables -A FORWARD -s $HostRange -j DROP
fi
###############################################

將zerocount.sh也擺到cron裡面每隔一段時間就將count歸0
###################zerocount.sh####################
#!/bin/bash
HostRange=$(cat /etc/NetUsage.conf|grep "^[^ *#]"|awk {'print $1'})
InQuota=$(cat /etc/NetUsage.conf|grep "^[^ *#]"|awk {'print $2'})
OutQuota=$(cat /etc/NetUsage.conf|grep "^[^ *#]"|awk {'print $3'})
iptables -F
iptables -X
iptables -A FORWARD -s $HostRange -j ACCEPT
iptables -A FORWARD -d $HostRange -j ACCEPT


最後再編輯一個檔案/etc/NetUsage.conf
裡面的內容就像這樣
ip位址 下傳限制 上傳限制
例如
192.168.0.1 1024000 2048000
表示192.168.0.1這個ip下傳限制1024000bytes 上傳2048000bytes
也可以針對某個網段作限制
192.168.0.0/24
這樣表示192.168.0.0~192.168.0.255都列入限制(注意這裡是指全部加起來的流量喔)
這個script只有簡單的針對單一範圍作設限
如果想一次對多個範圍作設限的話就自行發揮想像力了



  • 贊助網站       

    廣利不動產-板橋在地生根最實在--新板特區指名度最高、值得您信賴的好房仲
    完整房訊,房屋、店面熱門精選物件,廣利不動產 優質仲介,房屋租賃、買賣資訊透明,交易真安心!
    廣利不動產-新板特區指名度最高、值得您信賴的好房仲
    您的托付,廣利用心為您服務



  •  共 0 人回應

    姓名:
    佈告內容:
    其他選項: