果然翁 | 【教學】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 ...........................完成!! 語法: #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 1G RAM Linux版本為 Cent OS 4.2 上面運作成功, 把 P2P 上傳成功限制住了,但會有些小誤差, 例如限定 25k 上傳就會在 22k 與 28k 前後飄.. 不知道是不是網路卡不好還是 CPU 不夠力的關係, 因為我只是用幾個智邦與螃蟹的網路卡做的.. 若有人也實作成功的,歡迎意見交流一下... 後記:編譯核心選項時,可以把一些沒用到的項目都刪除, 像是 wireless 或是 IPV6 之類等等用不到的都可以移除, 不要笨笨的甚麼都選... |
回覆 |
散人 | 先收下了,後面再慢慢看,謝謝了! |
回覆 |
果然翁 | 晚上看了看有關 iptables 實作 vpn 的書,覺得步驟差不多,等下次有空來玩玩 VPN 的好了... |
回覆 |
會員 | 回覆: 【教學】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/showthread.php?t=110123 此篇文章於 2006-06-07 10:24 AM 被 needmaster 編輯。. |
回覆 |
會員 | 回覆: 【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 (Kernel 2.6.14) 好文章啊 對於要diy的人很實用 |
回覆 |
灌水會員 | 回覆: 【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 (Kernel 2.6.14) 收下,再研究看看! |
回覆 |
會員 | 回覆: 【教學】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 |
回覆 |
會員 | 回覆: 【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 (Kernel 2.6.14) 請問我執行iptables指令後出現下列訊息 "can't initialize iptables table 'mangle':Table does not exist" 請問哪裡出了問題呢? |
回覆 |
果然翁 | 回覆: 【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 (Kernel 2.6.14) |
回覆 |
會員 | 回覆: 【教學】Linux Layer 7 Netfilter QOS 實作成功紀錄 (Kernel 2.6.14) 這個好~先收下了~ 感謝分享~ |
回覆 |
主題工具 | |
|
類似的主題 | ||||
主題 | 主題作者 | 討論版 | 回覆 | 最後發表 |
【教學】Linux cluster建制經驗分享 | Marty | -- FreeBSD & Linux 討 論 版 | 17 | 2006-05-22 11:39 AM |
【教學】Linux 多網卡NAT主機實做 | linux_xp | -- FreeBSD & Linux 討 論 版 | 4 | 2004-06-24 01:18 PM |
【教學】Linux Shell 裡一些很少用到卻很有用的指令 | smallway | -- FreeBSD & Linux 討 論 版 | 0 | 2002-11-05 01:40 AM |
【教學】Linux 常用網路指令介紹 | VBird | -- FreeBSD & Linux 討 論 版 | 0 | 2002-07-31 05:28 PM |
關於更新 kernel... | Man | -- FreeBSD & Linux 討 論 版 | 5 | 2002-01-04 12:33 PM |
XML | RSS 2.0 | RSS |
本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。