PCZONE 討論區  遠傳 Seednet 2010 學生方案 終身優惠價 遠傳大寬頻半價方案  
PCZONE 版規 帳號無法發言?
首頁 註冊 個人設定 悄悄話 搜尋文章 最新文章 今日所有文章 會員登出

返回   PCZONE 討論區 > ▲ ADSL_CABLE_FTTH 寬 頻 上 網 討 論 > -- 網 路 技 術 版

-- 網 路 技 術 版 較深入的網路方面技術問題,請來此這版討論

回覆
 
主題工具 搜尋本主題
舊 2005-12-11, 01:03 AM   #1
果然翁
 
apage 的大頭照
 
註冊日期: 2004-09-26
文章: 246
apage
寄送 ICQ 訊息給 apage 寄送 AIM 訊息給 apage 寄送 MSN 訊息給 apage 寄送 Yahoo! 訊息給 apage
【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 ( kernel 2.6.14)

這是小弟參考網路上資料所實作的心得,
當然做好之後也有回覆原文,不過卻沒多少回應,
因此想說自己來宣傳一下,

於是我開始重編核心...以下是成功的步驟略述:

1. 到 http://www.kernel.org/ 找 Kernel 最新版
2. 下載並解壓縮
3. 到 http://l7-filter.sourceforge.net/L7-HOWTO-Netfilter 下載 Layer 7 patch
4. 解壓縮 kernel 與 Layer 7 patch
5. 將解壓縮的 patch copy 到 kernel 目錄下,輸入 patch 與 Kernel 的合體指令:patch -p1 < patch_name
6.接著在 kernel 的目錄下輸入:
a.make mrproper
b.make clean
c.cp /boot/之前的config ./(如果沒有也無所謂,直接下步)
d.make menuconfig
7.選擇核心選項,如果因為核心功能沒開啟而造成以後的失敗,那可是很可惜的,所以請多多留意選項。記住 network 裡面有 qos 與 Layer 7 選項都要選成[*],保險一點乾脆 network 功能統統都弄成[*]也沒差
8.選好後儲存離開
9.開始編譯
a.make bzImage
b.make modules
c.make modules_install
d.make install
10.順利的話重開機即可順利運作。
(可將編譯時的訊息儲存到 txt 中,將可更容易看到一些錯誤訊息幫助 debug)

接著要重新安裝 iptables
只要一邊照著下面安裝就可以了,
1.make KERNEL_DIR=/你的 kernel 擺放路徑
2.make install KERNEL_DIR=/你的 kernel 擺放路徑
若編譯過後 iptables 底下
並沒有 libipt_layer7.so 的話,
(重新安裝後此檔會出現在 iptables 在 /user/local/lib,iptables執行檔則是 /usr/local/sbin)
需要先編輯 kernel 目錄底下的:
/net/ipv4/netfilter/ipt_layer7.c
底下,並搜尋到:
static int num_packets = ?? (並不是真的寫 ?? 只是我忘了它原本是多少了。)
這個 ?? 應該是原本的預設值,把它改為 8 再重新編譯 iptables 即可。

接著就可以開始定義規則了,以下是我定義的規則檔:

(公司是使用 12M/1M ADSL線路)
語法:
#/bin/sh
#清除規則
echo 開始執行QOS..................
echo 1.清除規則
tc qdisc del dev eth0 root 2>/dev/null
tc qdisc del dev eth1 root 2>/dev/null
echo 2.定義最頂層
#定義上傳最頂層根部規則
tc qdisc add dev eth0 root handle 10: htb default 20
#定義10:1總上傳頻寬
tc class add dev eth0 parent 10: classid 10:1 htb rate 100kbps ceil 100kbps
#這裡是各種分類
echo 3.開始分類
#定義10:20 FTP 上傳
tc class add dev eth0 parent 10:1 classid 10:10 htb rate 30kbps ceil 50kbps prio 0
#定義10:10 網頁瀏覽上傳頻寬
tc class add dev eth0 parent 10:1 classid 10:20 htb rate 30kbps ceil 50kbps prio 1
#定義20:40 MSN傳送檔案速度
tc class add dev eth0 parent 10:1 classid 10:30 htb rate 25kbps ceil 38kbps prio 2
#定義10:30 P2P 上傳
tc class add dev eth0 parent 10:1 classid 10:40 htb rate 25kbps ceil 38kbps prio 3
echo 4.佇列宣告
#定義佇列規則
#給上傳
tc qdisc add dev eth0 parent 10:10 handle 101: pfifo
tc qdisc add dev eth0 parent 10:20 handle 102: pfifo
tc qdisc add dev eth0 parent 10:30 handle 103: pfifo
tc qdisc add dev eth0 parent 10:40 handle 104: pfifo
echo 5.定義標籤
#過濾器
#設定貼有"10"標籤的封包歸類於"10:10"(以此類推)
#給上傳
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 20 fw classid 10:20
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 30 fw classid 10:30
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 40 fw classid 10:40
echo 6.清除 iptables mangle
#清除 mangle 內所有規則
/usr/local/sbin/iptables -F -t mangle

echo ...........................完成!!
程式執行結果:如果語法沒錯的話將會看到以下畫面:
(是我拿來 debug 用的啦)
語法:
開始執行QOS..................
1.清除規則
2.定義最頂層
3.開始分類
4.佇列宣告
5.定義標籤
6.清除 iptables mangle
...........................完成!!
接著開始執行 iptables 語法,貼上標籤之後就可實際運作!
語法:
#layer7 QOS
#P2P
/usr/local/sbin/iptables -t mangle -A PREROUTING -m layer7 --l7proto edonkey -j MARK --set-mark 40
/usr/local/sbin/iptables -t mangle -A PREROUTING -m layer7 --l7proto bittorrent -j MARK --set-mark 40
/usr/local/sbin/iptables -t mangle -A POSTROUTING -m layer7 --l7proto edonkey -j MARK --set-mark 40
/usr/local/sbin/iptables -t mangle -A POSTROUTING -m layer7 --l7proto bittorrent -j MARK --set-mark 40
#上傳
/usr/local/sbin/iptables -t mangle -A PREROUTING -m layer7 --l7proto http -j MARK --set-mark 10
/usr/local/sbin/iptables -t mangle -A PREROUTING -m layer7 --l7proto ftp -j MARK --set-mark 20
/usr/local/sbin/iptables -t mangle -A PREROUTING -m layer7 --l7proto msn-filetransfer -j MARK --set-mark 30
是在 nforce 2 的板子 Athlon XP 2500+
1G RAM Linux版本為 Cent OS 4.2 上面運作成功,
把 P2P 上傳成功限制住了,但會有些小誤差,
例如限定 25k 上傳就會在 22k 與 28k 前後飄..
不知道是不是網路卡不好還是 CPU 不夠力的關係,
因為我只是用幾個智邦與螃蟹的網路卡做的..
若有人也實作成功的,歡迎意見交流一下...

後記:編譯核心選項時,可以把一些沒用到的項目都刪除,
像是 wireless 或是 IPV6 之類等等用不到的都可以移除,
不要笨笨的甚麼都選...


apage 目前未上線   回覆時引用此篇文章
舊 2005-12-11, 01:08 AM   #2
散人
 
rushoun 的大頭照
 
註冊日期: 2001-07-29
文章: 4,862
rushoun 已經是超級明星了rushoun 已經是超級明星了rushoun 已經是超級明星了rushoun 已經是超級明星了rushoun 已經是超級明星了rushoun 已經是超級明星了

先收下了,後面再慢慢看,謝謝了!
__________________
========================================
用智慧處理事情,用慈悲對待他人。(節錄 聖嚴法師與人文對話一書內容)
rushoun 目前未上線   回覆時引用此篇文章
舊 2005-12-12, 11:31 AM   #3
果然翁
 
apage 的大頭照
 
註冊日期: 2004-09-26
文章: 246
apage
寄送 ICQ 訊息給 apage 寄送 AIM 訊息給 apage 寄送 MSN 訊息給 apage 寄送 Yahoo! 訊息給 apage

晚上看了看有關 iptables 實作 vpn 的書,覺得步驟差不多,等下次有空來玩玩 VPN 的好了...
apage 目前未上線   回覆時引用此篇文章
舊 2006-05-31, 03:28 PM   #4
會員
 
註冊日期: 2005-04-18
住址: 專線,ADSL,FTTB
文章: 122
needmaster 正向著好的方向發展
回覆: 【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 (Kernel 2.6.14)

L7使用在頻寬控管上確實有效,統計表出來的確會有一些誤差.但這是UDP封包判斷上的有時會有漏網之魚.不過無傷大雅


還有這是您的實際範例,也是一般書籍或討論區的標準範例
#P2P
/usr/local/sbin/iptables -t mangle -A PREROUTING -m layer7 --l7proto edonkey -j MARK --set-mark 40
/usr/local/sbin/iptables -t mangle -A PREROUTING -m layer7 --l7proto bittorrent -j MARK --set-mark 40
/usr/local/sbin/iptables -t mangle -A POSTROUTING -m layer7 --l7proto edonkey -j MARK --set-mark 40
/usr/local/sbin/iptables -t mangle -A POSTROUTING -m layer7 --l7proto bittorrent -j MARK --set-mark 40
#上傳
/usr/local/sbin/iptables -t mangle -A PREROUTING -m layer7 --l7proto http -j MARK --set-mark 10
/usr/local/sbin/iptables -t mangle -A PREROUTING -m layer7 --l7proto ftp -j MARK --set-mark 20
/usr/local/sbin/iptables -t mangle -A PREROUTING -m layer7 --l7proto msn-filetransfer -j MARK --set-mark 30


PCZONE上所有討論QOS實作上的進階問題,為何無人提出
大家也可到酷學園.鳥哥大大上看看,也為何無人提出


如您的範例而言均是針對所有的IP做P2P或者某些服務使用共同的頻寬.
很有可能漏網之魚的封包會吃掉您的未定義所有頻寬(通常有可能是全部頻寬)

如果再增加某些單獨IP上網時的頻寬限制,如果您把這些IP放在
PREROUTING 及 POSTROUTING的最下面時,您實際再測試看看
會發生什麼結果.....很有可能P2P或者某些服務配的頻寬會失效.

這個問題連市場上很多號稱多WAN有頻寬管理的設備上也都沒有這項的功能,何況還加上L7功能頻寬管理.

本人著作文章
http://www.pczone.com.tw/vbb3/thread/16/110123/

此篇文章於 2006-06-07 10:24 AM 被 needmaster 編輯。
needmaster 目前未上線   回覆時引用此篇文章
舊 2006-05-31, 11:41 PM   #5
會員
 
註冊日期: 2006-05-15
住址: ADSL 8m
文章: 11
binhu 正向著好的方向發展
回覆: 【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 (Kernel 2.6.14)

好文章啊
對於要diy的人很實用
binhu 目前未上線   回覆時引用此篇文章
舊 2006-06-01, 09:10 AM   #6
灌水會員
 
註冊日期: 2006-01-26
住址: 不是很快也不算慢,可以上網就對了。
文章: 447
infornet 正向著好的方向發展
回覆: 【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 (Kernel 2.6.14)

收下,再研究看看!
__________________
我承認,回覆純灌水!
infornet 目前未上線   回覆時引用此篇文章
舊 2006-07-16, 05:11 PM   #7
會員
 
註冊日期: 2006-05-17
住址: ADSL 2M/512
文章: 1
asrga 正向著好的方向發展
回覆: 【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 (Kernel 2.6.14)

有一個問題想請教
第二層的類別中如果超過十個以上時
classid要如何設定呢?
10:10~10:90以後要如何設呢???

10:100之後不是要給第三層用的嗎???
語法:
echo 3.開始分類
#定義10:20 FTP 上傳
tc class add dev eth0 parent 10:1 classid 10:10 htb rate 30kbps ceil 50kbps prio 0
#定義10:10 網頁瀏覽上傳頻寬
tc class add dev eth0 parent 10:1 classid 10:20 htb rate 30kbps ceil 50kbps prio 1
#定義20:40 MSN傳送檔案速度
tc class add dev eth0 parent 10:1 classid 10:30 htb rate 25kbps ceil 38kbps prio 2
#定義10:30 P2P 上傳
tc class add dev eth0 parent 10:1 classid 10:40 htb rate 25kbps ceil 38kbps prio 3
echo 4.佇列宣告
#定義佇列規則
#給上傳
tc qdisc add dev eth0 parent 10:10 handle 101: pfifo
tc qdisc add dev eth0 parent 10:20 handle 102: pfifo
tc qdisc add dev eth0 parent 10:30 handle 103: pfifo
tc qdisc add dev eth0 parent 10:40 handle 104: pfifo
echo 5.定義標籤
#過濾器
#設定貼有"10"標籤的封包歸類於"10:10"(以此類推)
#給上傳
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 20 fw classid 10:20
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 30 fw classid 10:30
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 40 fw classid 10:40
以上類別的訂定可否改為
語法:
echo 3.開始分類
#定義10:20 FTP 上傳
tc class add dev eth0 parent 10:1 classid 10:10 htb rate 30kbps ceil 50kbps prio 0
#定義10:10 網頁瀏覽上傳頻寬
tc class add dev eth0 parent 10:1 classid 10:11 htb rate 30kbps ceil 50kbps prio 1
#定義20:40 MSN傳送檔案速度
tc class add dev eth0 parent 10:1 classid 10:12 htb rate 25kbps ceil 38kbps prio 2
#定義10:30 P2P 上傳
tc class add dev eth0 parent 10:1 classid 10:13 htb rate 25kbps ceil 38kbps prio 3
echo 4.佇列宣告
#定義佇列規則
#給上傳
tc qdisc add dev eth0 parent 10:10 handle 101: pfifo
tc qdisc add dev eth0 parent 10:11 handle 102: pfifo
tc qdisc add dev eth0 parent 10:12 handle 103: pfifo
tc qdisc add dev eth0 parent 10:13 handle 104: pfifo
echo 5.定義標籤
#過濾器
#設定貼有"10"標籤的封包歸類於"10:10"(以此類推)
#給上傳
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 20 fw classid 10:11
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 30 fw classid 10:12
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 40 fw classid 10:13 
asrga 目前未上線   回覆時引用此篇文章
舊 2007-01-09, 03:59 PM   #8
會員
 
註冊日期: 2006-10-26
住址: TANET
文章: 2
locking 正向著好的方向發展
回覆: 【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 (Kernel 2.6.14)

請問我執行iptables指令後出現下列訊息
"can't initialize iptables table 'mangle':Table does not exist"
請問哪裡出了問題呢?
locking 目前未上線   回覆時引用此篇文章
舊 2007-03-26, 03:21 AM   #9
果然翁
 
apage 的大頭照
 
註冊日期: 2004-09-26
文章: 246
apage
寄送 ICQ 訊息給 apage 寄送 AIM 訊息給 apage 寄送 MSN 訊息給 apage 寄送 Yahoo! 訊息給 apage
回覆: 【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 (Kernel 2.6.14)

引用:
作者: asrga 觀看文章
有一個問題想請教
第二層的類別中如果超過十個以上時
classid要如何設定呢?
10:10~10:90以後要如何設呢???
抱歉這麼晚才回覆,不過我的確沒時間去試驗這個問題,
因為公司的機器不允許我隨時改東西...
我想就由有空的人試驗,應該馬上就知道答案了吧...


apage 目前未上線   回覆時引用此篇文章
舊 2009-07-12, 04:25 PM   #10
會員
 
註冊日期: 2009-07-12
文章: 1
autoloan 正向著好的方向發展
回覆: 【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 (Kernel 2.6.14)

這個好~先收下了~
感謝分享~
__________________
汽車貸款汽車融資
autoloan 目前未上線   回覆時引用此篇文章
回覆



書籤

主題工具 搜尋本主題
搜尋本主題:

進階搜尋

發文規則
不可以發表新主題
不可以發表回覆
不可以上傳附加檔案
不可以編輯自己的文章

啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法



所有時間均為台北時間。現在的時間是 10:52 PM


 XML   RSS 2.0   RSS 
本站使用 vBulletin 合法版權程式
站務信箱 : www@pczone.com.tw

本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email : www@pczone.com.tw 處理。