« 從電容“爆漿”開始認識電容 | 首頁 | Apache HTTP Server + Mozilla Calendar / Sunbird »

2005年12月26日

L7-filter 安裝實錄

L7-filter (Application Layer Packet Classifier for Linux), 是 Linux netfilter 的外掛模組, 它能讓 Linux 的 iptables 支援 Layer 7 (Application 應用層) 封包過濾功能, 限制 P2P、即時通訊等使用動態埠口的網路軟體.

以下是在 Fedora Core 3 的安裝過程:

下載 Layer 7 Patches & Protocol definitions

下載點:

http://sourceforge.net/project/showfiles.php?group_id=80085
(Ref: http://l7-filter.sourceforge.net/HOWTO#Get)

分別下載並解包至 /usr/local/src, 本篇以 l7-protocols-2005-12-16 和 netfilter-layer7-v2.0 為例

先安裝 Layer 7 Protocol definitions:

cd /usr/local/src/l7-protocols-2005-12-16
make install

安裝 kernel source

依需求選擇下載點:

Fedora Core 系列 kernel.src.rpm 操作備忘:

wget ftp://ftp.isu.edu.tw/pub/Linux/Fedora/linux/core/3/SRPMS/kernel-2.6.9-1.667.src.rpm
rpm -ivh kernel-2.6.9-1.667.src.rpm
cd /usr/src
tar -jxf ./redhat/SOURCES/linux-2.6.9.tar.bz2
ln -s linux-2.6.9 linux

重新編譯、安裝 Layer 7 Patches 更新過的 kernel source

cd /usr/src/linux
patch -p1 < /usr/local/src/netfilter-layer7-v2.0/kernel-2.6.13-2.6.14-layer7-2.0.patch (選用與核心版本對應的 patch 檔)
make oldconfig (如果之前已經有編譯過 kernel source, 需先執行 make mrproper)

重點: Layer 7 match support (EXPERIMENTAL)... [N/m/?] (NEW) -> m

(亦可全部按 Enter 接受預設值, 再 make menuconfig 進行調整)

make menuconfig (若需進一步設定 kernel config 才執行; make menuconfig 需求套件: ncurses-devel)

重點 (以 kernel 2.6.13 為例, 不同的核心版本排列方式不一定相同):

Code maturity level options --> [*] Prompt for development and/or incomplete code/drivers

Networking --> Networking options -->
    [*] Network packet filtering (replaces ipchains) -->
        IP: Netfilter Configuration -->
            <M> Connection tracking (required for masq/NAT)
            [*] Connection tracking flow accounting
            <M> IP tables support (required for filtering/masq/NAT)
            <M> Layer 7 match support

make bzImage (kernel 2.4 需先執行 make dep)
make modules
make modules_install
make install

安裝 Layer 7 Patches 更新過的 iptables

http://netfilter.org/ 下載 iptables source

解包至 /usr/local/src, 本篇以 iptables-1.3.4 為例

cd /usr/local/src/iptables-1.3.4
patch -p1 < ../netfilter-layer7-v2.0/iptables-layer7-2.0.patch
chmod +x ./extensions/.layer7-test
make KERNEL_DIR=/usr/src/linux
make install KERNEL_DIR=/usr/src/linux

若原本已安裝 iptables 套件的處理
cd /sbin
mv iptables iptables.old
ln -s /usr/local/sbin/iptables iptables

chkconfig iptables on
vi /boot/grub/menu.lst
(改成預設以新的 kernel 開機)
reboot

使用 iptables layer-7 filter

iptables -t mangle -A PREROUTING -m layer7 --l7proto yahoo -j DROP (禁止 Yahoo! Messenger 封包)

L7-filter 支援的所有通訊協定: L7-filter Supported Protocols

亦可使用 -j MARK 參數搭配 QoS 頻寬管理, 詳情可參考: cbq.init 設定手札

iptables 封包過濾圖: http://linux-ip.net/nf/nfk-traversal.png


後記 1. - make oldconfig 的奧秘

make oldconfig 會比對舊的 kernel config, 帶入先前的設定值來產生新的 kernel config, 這樣就不用在 make menuconfig 的時候改太多設定. 舊的 kernel config 通常可以在這兩個地方找到:

  • /boot/config-2.x.x-x
  • /usr/src/linux/.config (如果這個 kernel source 之前有編譯過的話)

後記 2. - Trustix 2.2 安裝備忘

以 swup 安裝 kernel source 需先修改 swup 設定檔:

vi /etc/swup/swup.conf --> 註解 exclude_pkg_regexp = "kernel.*"
swup --install kernel-source

經前述程序安裝完成後, iptables 使用 layer7 參數時會出現錯誤訊息:

iptables v1.3.4: Couldn't load match `layer7':/usr/local/lib/iptables/libipt_layer7.so: undefined symbol: __guard

任何版本的 iptables 都會出現相同的錯誤訊息, 目前尚未找出解決辦法...


參考資料:

相關網頁:

Posted by Jamyy at 2005年12月26日 16:33

Trackback Pings

TrackBack URL for this entry:
http://cha.homeip.net/cgi-bin/mt/mt-tb.cgi/153

Listed below are links to weblogs that reference L7-filter 安裝實錄:

» 網管的利器 - L7-filter from 瓶水相逢 - CHHuang

L7-filter [Read More]

Tracked on 2006年07月01日 11:31

Comments

你好,我是初學者,看到你發表的文章覺得收獲良多,感謝你的分享
我現在因為要用l7-filter,在網路上看來看去你寫的最清楚
我是用fedora5 kernel 2.6.15-1 ,netfilter-layer7-v2.2,iptables-1.3.5
我照你的方法做完全部
最後重開機後,下iptables -t mangle .....等
出現error
iptables unknow error 4294967295

不知從這錯誤你可以看出是什麼問題嗎?
謝謝...高手...不吝賜教.....

Posted by: eric at 2006年05月19日 11:22

您好!
我最近剛好也在 Fedora Core 5 (kernel 2.6.15-1.2054_FC5)
安裝了 iptables 1.3.5 和 l7-filter
不過並沒有發生你說的那種問題

以下提供幾個參考方向:

1. 若只有部份的 iptables -m layer7 --l7proto 有問題,
應該是參數錯誤所致. 請查明參數的確實用法,
或將無法執行的 iptables 指令告訴我,
我再幫您看看是哪邊出問題

2.執行 find /lib/modules/$(uname -r) -name "*layer7*"
和 find /usr/local/lib -name "*layer7*"
正常的話可以找到 ipt_layer7.ko 和 libipt_layer7.so 這兩個檔案,
而且執行 modprobe ipt_layer7 應該不會有錯誤訊息
如果找不到檔案, 或 modprobe 執行後出現錯誤訊息
就得重新安裝 l7-filter 和 iptables 了

以上兩點是我目前可以想到的狀況, 如果都不能解決您的問題
請將您所執行的 iptables 指令告訴我, 我再幫您查查看

Posted by: Jamyy at 2006年05月19日 13:14

你所遇到的trustix的layer7模塊加載錯誤是因爲你在trustix的kernel modules編譯的時候沒有加上 CC="gcc -fno-stack-protector"參數

詳細的説明可以看trustix的官方FAQ:
http://www.trustix.org/wiki/index.php/TrustixFAQ#I_have_problems_compiling_the_kernel_and_certain_other_packages.__I_get_some___guard_error_message.

Posted by: coolzsb at 2006年06月21日 12:12

請教一下~
是不是一定要用新的Kernal去重新編譯~
假如我先使用yum下載更新了新版的Kernal後~
可不可直接用現有的Kernal呢?

Posted by: casper at 2006年09月06日 11:12

如果您想用當前版本的 kernel 來編譯 L7-Filter 其實也是可以的,

不過還是得要有 kernel source 才行.

我的方法是:

假設您使用的是 Fedora Core 5, 已經將 kernel 更新到 2.6.17-1.2174

ftp 到 ftp.isu.edu.tw, 進入 /Linux/Fedora/linux/core/updates/5/SRPMS

下載 kernel-2.6.17-1.2174_FC5.src.rpm, 並安裝之.

接著您可以在 /usr/src/redhat/SOURCES 路徑中找到 linux-2.6.17.tar.bz2

將它解包到 /usr/src, 然後建立一個 soft link (ln -s) /usr/src/linux 指到剛剛解包的路徑

接著 cd /usr/src/linux, vi Makefile, 設定 EXTRAVERSION = -1.2174 (也就是 2.6.17 後面那一串)

這樣就能以目前的 kernel 版本來安裝 L7-Filter 了.

Posted by: Jamyy at 2006年09月06日 17:39

您好~
冒味再教請一下~
我最近照著上面的步驟去作過後~
把l7 filter的drop指令寫到/etc/rc.d/rc.local中,
可是我發覺每次開機時都沒法成功,
必須開機完成後,再重下一次才會把條件式寫入到iptables內~
不知您有沒有遇到過相同的問題~

Posted by: casper at 2006年09月14日 15:46

抱歉~
我找到問題了~
是我的iptables有問題...
我再新再作ln -s的鏈結就ok了~
好奇想問您個問題...
您有沒有OpenLDAP來替代NT的經驗~

Posted by: casper at 2006年09月14日 16:39

您也可以用 iptables-save > filename 和 iptables-restore < filename 來存取 iptables 設定
這樣您的 rc.local 會更簡潔有力
不過缺點是, 日子久了可能會忘記當初的指令是怎麼打的 :P

說實在的, 我對 LDAP 一點概念都沒有...
哪天心血來潮時再來研究看看 :)

Posted by: Jamyy at 2006年09月14日 17:19

站長您好,小弟也做好了l7-filter,也成功的檔住了該擋的東東,但發現個問題,就是msn傳檔的檔不下來,就是可以登msn.但不讓傳檔,我的指令是:iptables -t mangle -I POSTROUTING -m layer7 --l7proto msn-filetransfer -j DROP

但是還是可以傳檔,我測的是msn 8~不知站長是否有試過?

Posted by: ken at 2006年09月28日 22:44

剛剛試了一下, 真的無效耶
用 iptables -L -v 參數下去看
msn_filetransfer 規則的 pkgs 和 bytes 都是 0
windows 下的 netstat 只看到 1863 port
難道 msn 已經將 msn_filetransfer 整合到 msnmessenger 的 1863 port 了嗎? (不解)
我測試的是 msn 7.5 和 msn 8

不曉得這篇是否有幫助:
http://www.hypothetic.org/docs/msn/client/file_transfer.php

Posted by: Jamyy at 2006年09月29日 00:22

你好喔,請問一下
我灌在一台有apache 的主機上,
kernel-2.6.13 iptable-1.3.5 l7-filter灌好了,過程中也都沒錯誤!
iptables -t mangle -A PREROUTING -m layer7 --l7proto http -j DROP
我下這樣的rule,
但是我從另台電腦取存主機上的網頁,
還可是可以ㄟ,這樣是有可能是什麼問題呢?
[root@localhost ~]# iptables -t mangle -A PREROUTING -m layer7 --l7proto http -j DROP
[root@localhost ~]# iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere LAYER7 l7proto http
===============我檢查的結果====

Posted by: kotowy at 2006年09月29日 17:35

ㄝ... 殺雞不需要用到牛刀啦
如果要限制瀏覽本機的網站
在 httpd.conf 的 <Directory> 裡面設定:
Order deny,allow
Deny from xxx
Allow from xxx
或是用 iptables -A INPUT -p tcp --dport 80 -s 來源 -j DROP 也可以
l7filter 在這裡無效的原因, 我想可能是因為它無法對目的地為本機 (INPUT) 的封包做管制吧? (猜的)

Posted by: Jamyy at 2006年09月29日 17:50

站長~請教您一下...
我最近在運行L7-filter時,發生了一個好怪的問題~
只要我下了這段執行...
iptables -t mangle -I POSTROUTING -m layer7 --l7proto skypeout -j DROP
很多網站就會連不進去...會停頓非常久...
例如這個網址
http://www.jfrich.com.tw/cgi-bin/jfonline/home/guest_home.jsp
不知您有沒有遇到這樣相同的情形~

Posted by: casper at 2006年11月03日 16:08

真的會讓網頁瀏覽速度變得很慢耶!
用 iptables -t mangle -L -n -v 來看
真的有封包被那行 rule 給擋下來

Posted by: Jamyy at 2006年11月03日 17:32

沒錯~
超怪的....
我今天又試了一次....
只要加上那行規則...
連看這個blog的網頁都變慢了...
真是怪~~~

Posted by: casper at 2006年11月05日 15:01

站長大人...
因為小弟剛開始接觸iptables的指令,有點不熟悉...
我想請教您一個作法...
假如我要封鎖整個網段使用MSN,然後在這個網段裡只開放幾台使用MSN....
要怎麼做才合適呢?

Posted by: casper at 2006年11月09日 12:42

您好!

假設 Linux 電腦是 Gateway, 區域網路的網段是 192.168.1.0/24
只想開放給 192.168.1.100 和 192.168.1.123 這兩台電腦使用 msn

iptables -A FORWARD -s 192.168.1.100 -m layer7 --l7proto msnmessenger -j ACCEPT
iptables -A FORWARD -s 192.168.1.123 -m layer7 --l7proto msnmessenger -j ACCEPT
iptables -A FORWARD -m layer7 --l7proto msnmessenger -j DROP

Posted by: Jamyy at 2006年11月09日 15:36

站長:
我試過您的方法了~還是不行...
後來我用iptables -t mangle -L -n -v去看了一下...
改成這樣就ok了...
就可以單獨開放一台上線....
iptables -t mangle -A POSTROUTING -d 192.168.1.123 -m layer7 --l7proto msnmessenger -j ACCEPT
iptables -t mangle -A POSTROUTING -s 192.168.1.123 -m layer7 --l7proto msnmessenger -j ACCEPT
iptables -t mangle -A POSTROUTING -m layer7 --l7proto msnmessenger -j DROP
不過我本來想偷懶...想把-d 和-s 下在同一行...結果不行~

Posted by: casper at 2006年11月09日 18:21

對吼! 還有進來的封包也要允許才是 ^^'
不過, 為什麼你在 filter 的 FORWARD 裡不能 work 呢?
(雖然官方網站也說, 放在 mangle 的 POSTROUTING 最保險)

http://l7-filter.sourceforge.net/HOWTO

Posted by: Jamyy at 2006年11月09日 19:33

我後來有試過了~其實放在FORWARD裡也是可以的....
只是因為寫習慣在POSTROUTING裡了...呵
現在還在研究把MSN傳檔的功能擋下來的功能....
不知你有沒有什麼好的建議....

Posted by: casper at 2006年11月10日 00:04

‧試過 L7-Filter 的 msn-filetransfer 不行
‧以 tcpdump 觀察, 發現 MSN 會從 tcp port: 3401 開始往上逐一找 port 將檔案傳出去, 所以無法以擋 port 的方式防治
‧微軟官方文件 (http://www.microsoft.com/technet/prodtechnol/winxppro/deploy/worki01.mspx) 指出, File Transfer 使用 6891-6900. 可是看了標題才知道, 這是 "Windows Messenger" 的文件 -_-"
‧在合勤 ZyWALL 70 UTM 的 IDP 設定: MSN File Transfer - "Drop Session", 結果也是無效

結論: 同志仍須努力...

Posted by: Jamyy at 2006年11月10日 16:38

的確是要努力的~~~我搞了一個週末和週日都還弄不出個所以然來~~
請教一下前輩~
當我使用iptables -t mangle -L -n -v時~
雖然可以看到mangle表格裡各規則的狀況~
那麼有沒有方法可以看到是那個ip現在在使用規則呢?
例如我把skype封鎖起來..那要如何知道現在是那個IP在嚐試使用skype而被我drop掉~

Posted by: casper at 2006年11月13日 11:29

這真是一個好問題!

man iptables 發現了這個線索: ipt_account
(http://www.svn.barbara.eu.org/ipt_account/wiki)

安裝方式和 l7filter 一樣, 只要 patch kernel & iptables 就行了

以下是應用範例:

iptables -A FORWARD -m layer7 --l7proto skypetoskype -m account --aaddr 192.168.1.0/24 --aname skype -j DROP

cat /proc/net/ipt_account/skype 就能查詢統計結果

Posted by: Jamyy at 2006年11月13日 13:17

原來還要重新patch kernel~
待我試試...
感謝您提供這麼寶貴的意見~

Posted by: casper at 2006年11月13日 13:41

請問我在make modules出現下列錯誤訊息,該如何解決?
我是用FC4 and kernel-2.6.11-1.1369_FC4.src.rpm ...Thks!

[root@localhost linux]# make modules
CHK include/linux/version.h
make[1]: `arch/i386/kernel/asm-offsets.s' is up to date.
CC [M] drivers/i2c/i2c-core.o
In file included from drivers/i2c/i2c-core.c:29:
include/linux/i2c.h:58: error: array type has incomplete element type
include/linux/i2c.h:197: error: array type has incomplete element type
drivers/i2c/i2c-core.c: In function ‘i2c_transfer’:
drivers/i2c/i2c-core.c:594: error: type of formal parameter 2 is incomplete
drivers/i2c/i2c-core.c: In function ‘i2c_master_send’:
drivers/i2c/i2c-core.c:620: error: type of formal parameter 2 is incomplete
drivers/i2c/i2c-core.c: In function ‘i2c_master_recv’:
drivers/i2c/i2c-core.c:649: error: type of formal parameter 2 is incomplete
make[2]: *** [drivers/i2c/i2c-core.o] Error 1
make[1]: *** [drivers/i2c] Error 2
make: *** [drivers] Error 2

Posted by: Nolan at 2006年12月08日 09:48

執行 make menuconfig
到 Device Drivers --> I2C support
將 <*> I2C support 改成 <M> I2C support 試試

Posted by: Jamyy at 2006年12月08日 11:53

Posted by: Jamyy at 2006年11月09日 19:33

我後來有試過了~其實放在FORWARD裡也是可以的....
只是因為寫習慣在POSTROUTING裡了...呵
現在還在研究把MSN傳檔的功能擋下來的功能....
不知你有沒有什麼好的建議....
--------------------------
請問你喔,在FORWARD下rule你是怎麼辦到的呢?

Posted by: Anonymous at 2007年01月22日 15:02

你是說 filter table 裡的 FORWARD chain 嗎?
就一般的寫法, 只是 -m 載入 layer7 而已囉~

ex. iptables -A FORWARD -m layer7 --l7proto msnmessenger -j DROP

Posted by: Jamyy at 2007年01月22日 15:26

你好.我依照此文章安裝l7 filter
不過在make modules(on FC4)之後也出現
make[2]: *** [drivers/i2c/i2c-core.o] Error 1
make[1]: *** [drivers/i2c] Error 2
make: *** [drivers] Error 2
雖然我也有進入menuconfig將I2C support改成模組
不過依然不行
後來使用FC3重灌看看
出現另一個問題 ,qla_os.o錯誤
請問這問題該如何解決呢?
難道是因為我用的netfilter是2.9的關係嗎?

Posted by: saiz at 2007年01月31日 12:32

若遇到 i2c error 取消勾選 i2c support 即可
qla_os.o 是 scsi 的東西
到 scsi 的 qla 相關項目中, 把 QLogic ISPxxx 的東西都拿掉即可 (亦可直接編輯 .config, 以 QLA 為關鍵字, 把它們最前面加上 # 就行了)

Posted by: Jamyy at 2007年01月31日 15:55

可以了.不過不是將QLogic ISPXXX給取消掉
我是用yum updates kernel*
將kernel更新到2.6.12-1.1381_FC3
在make modules部份就沒問題了
給有此問題的人另一個解決方法

Posted by: saiz at 2007年02月01日 22:11

原來換一個 kernel version 也能排除這個問題
謝謝您的分享 :)

Posted by: Jamyy at 2007年02月02日 10:47

现在好像L7已经挡不住Emule了哦,以前可以但,但emule升到了0.47C后就挡不了了;(

Posted by: spritecat at 2007年03月19日 11:21

您好~
我依照上述步驟,我可以選到 "[*] Connection tracking flow accounting " 但就是找不到 " Layer 7 match support" 這個選項,可否麻煩你幫我解答.

kernel : linux-2.6.19.7
l7 : netfilter-layer7-v2.9

我自己運行的步驟是:
1:[root@fw tmp]# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.19.7.tar.gz
2:[root@fw tmp]# cd /usr/src/
3:[root@fw src]# tar -zxvf /tmp/linux-2.6.19.7.tar.gz
4:[root@fw src]# ln -s linux-2.6.19.7/ /linux
5:取得netfilter 解壓並放在 /usr/src/netfilter-layer7-v2.9/
6:回到linux 內並執行patch -p1 < /usr/src/netfilter-layer7-v2.9/kernel-2.6.18-2.6.19-layer7-2.9.patch
7:再執行 make menuconfig

但是就是無法找到 Layer 7 MATCH 選項,請問我的步驟上有誤嗎?或是有漏的地方,麻煩您指點指點..謝謝.


Posted by: Bill at 2007年03月29日 11:56

您好! 請參考
http://l7-filter.sourceforge.net/HOWTO-kernel#Kernel
勾選相關項目後, Layer7 的選項就會出現了

Posted by: Jamyy at 2007年03月30日 09:56

您好
我的kernel 為 2.6.18
iptables 為 1.3.7
在 patch iptables 後
make 的過程中 會因為缺少 libipt_tcpmss.so 檔而 stop
請問是哪個部份出錯了呢?
謝謝

Posted by: litmay at 2007年04月18日 19:06

您好
我用相同的版本測試後, 並沒有出現如您所說的情況
能否請您列出完整錯誤訊息與操作過程?

Posted by: Jamyy at 2007年04月19日 08:46

前輩~
請教一個很笨的問題~
我最近因為重灌負責netfilter-layer7的主機,突然發現一個狀況~
現在netfilter-layer7只更新到v2.9,而v2.9所支援的Kernel只到kernel-2.6.19,可是當我重灌主機時,都會習慣更yum -y update的完整更新,這時kernel就是升到2.6.20的版本了,我試著安裝netfilter-layer7時,都無法作pach,所以想請教前輩~
1.yum -y update可不可以跳過Kernel的安裝~
2.現在netfilter有釋放出一套軟體叫l7-filter-userspace,好像是用來取代netfilter-layer7的,可是我怎麼裝都會出現缺少其他套件的狀況,不知前輩有沒有玩過呢?

謝謝

Posted by: casper at 2007年04月27日 17:01

casper 您好,

1. yum --exclude=kernel* update 或在 /etc/yum.repos.d/ 裡的 fedora-updates.repo 加入 exclude=kernel* 就行了

2. 我沒玩過 l7-filter userspace version, 不過根據初步瞭解, 之前的 l7-filter 是 kernel module 的方式運作, 而 userspace 似乎是以獨立的執行程式, 搭配 ip_conntrack_netlink 這個 kernel 模組來進行封包過濾. ip_conntrack_netlink 在 kernel v2.6.14 以上就有內建. 詳細內容請見 Layer 7 Userspace HOWTO: http://l7-filter.sourceforge.net/HOWTO-userspace

ps. 我在 Fedora Core 3 (kernel: 2.6.12) 試著安裝 libnfnetlink 卻怎麼樣都 make 不過, 傷腦筋哩~~

Posted by: Jamyy at 2007年04月30日 10:52

前輩~
我是在FC6上測試的~
是卡在無法./configure下.....我再試試看~
有任何進度再和你研究囉~

Posted by: casper at 2007年05月03日 09:29

我試了上面介紹的ipt_account,patch後在make modules時出錯了...請問有人知道該怎麼解嗎?
net/ipv4/netfilter/ipt_account.c: In function 'destory'
net/ipv4/netfilter/ipt_account.c:551: error: invalid application of 'sizeof' to incomplete type 'struct ipt_account_info'
make[3]: *** [net/ipv4/netfilter/ipt_account.o] Error 1
make[2]: *** [net/ipv4/netfilter] Error 2
make[1]: *** [net/ipv4] Error 2
make: *** [net] Error 2

Posted by: peter at 2007年06月25日 18:16

站長您好
我參考你的方法安裝了l7-filter,
但是我重新開機後,用新的包括l7-filter的核開機
但是在開機過程有一個Apply Intel CPU microcode update
error 的錯誤訊息
但是目前是沒有出現什麼異常,l7-filter式了一下也可正常
只是此錯誤不知您有遇過嗎?若有,有什麼解決方法參考呢?
因為如果我是用本來預設的核心開機,就沒有error
OS為CentOS5

Posted by: 阿榮 at 2007年07月04日 10:05

阿榮您好

請查看 /etc/rc*.d/*microcode_ctl 檔案內容, 檢查相關路徑是否正確

動手 run 一下看看是否有問題, 例如:
microcode_ctl -f /etc/firmware/microcode.dat

如果是 "cannot open /dev/cpu/microcode for writing", 執行:
mkdir /dev/cpu
touch /dev/cpu/microcode
再執行
microcode_ctl -f /etc/firmware/microcode.dat
就行了

(以上是在 Fedora 系列所操作的路徑)

Posted by: Jamyy at 2007年07月04日 14:48

站長謝謝您 可以了
請問一下 這是什麼問題呢?
我如果用沒有重新編譯的核心開機就部會有此錯誤訊息

Posted by: 阿榮 at 2007年07月05日 08:37

老實說, 我也不知道 :P
我是看了你的問題後才去摸索的
奇怪的是, 我 Fedora 7 的 kernel 也是手動編譯過的
也沒有 /dev/cpu 這個路徑
開機的過程中, microcode 的 update 竟然 OK

所以今天又稍加研究了一下, 才發現:
1. 執行 modprobe microcode, /dev/cpu 和裡面的 microcode 就會出現了
2. microcode 這個檔案其實是個 character file, 以 mknod 來建立的話: mknod microcode c 10 184
3. microcode_ctl 是個 service, 可用 /etc/init.d、service、chkconfig 來控制
4. microcode_ctl 在 Fedora 7: runlevel 2345 預設 on, 執行後自動 rmmod microcode (所以我才找不到 /dev/cpu :)
5. microcode_ctl 在 Fedora Core 3: 各 runlevel 皆預設 off, 載入 microcode module 後, service microcode_ctl stop 不會 rmmod, 需手動 rmmod

Posted by: Jamyy at 2007年07月05日 10:34

Jamyy您好:
初步接觸l7-filter時,
十分幸運能夠得到這篇文章的協助。

想在這裡提問一下,
如果我想把l7-filter的版本更新,
是否需要重新編譯核心?

Posted by: pcpark at 2007年07月09日 22:23

pcpark 您好
很高興這篇文章對您有幫助

關於您的問題, 我的建議是:
1. 若要在同一個 kernel 版本下升級 l7-filter, 先 make mrproper 再從頭來過
2. 不然就另起一個不同版本的 kernel source, 再來安裝新版本的 l7-filter
簡而言之, 就是必須重新編譯 kernel (iptables 也是)

也許就是因為 l7-filter kernel version 太硬了, 所以才會發展 userspace version 吧~

Posted by: Jamyy at 2007年07月09日 23:40

感謝您的回應。

如果得重新編譯核心,
那得考慮使用userspace version。

您有關於userspace version的心得嗎?

Posted by: pcpark at 2007年07月10日 09:00

Layer 7 Userspace HOWTO 說現在還在開發初期
我在 FC3 試不出來, 後來也就沒再研究了 :P
請見 2007年04月30日 10:52 這篇 comment

Posted by: Jamyy at 2007年07月10日 09:11

iptables -t mangle -A PREROUTING -m layer7 --l7proto yahoo -j DROP (禁止 Yahoo! Messenger 封包)
==>這行在yahoo V8.1不會work,因為無法match,我測了MSN/SKYPE可以match,所以可以禁止登入,但是MSN的檔案傳輸(msn-filetransfer)無法match,所以無法禁止檔案傳輸...
我的kernel是2.6.17
pattern version:l7-protocols-2007-07-27.tar.gz
kernel patch:netfilter-layer7-v2.9.tar.gz

請問有人都可以work嗎?

Posted by: richard at 2007年08月24日 18:01

Dear Jammy
請問一下layer 7 是針對NAT的方式去設計的嗎?
因為我試過NAT的方式是可以成功以iptables擋掉msn之類的,
可是我在router上設定同樣的iptables 就無法判斷。
我的router 就是下echo "1" > /proc/sys/net/ipv4/ip_forward 做的不做NAT
因為公司的需求,所以這樣做可是好像不能在router上面做,
可是我下iptables -P FORWARD DROP 這個就可以擋的下來,就是他有走防火牆可是就沒有辦法去判斷layer 7 。
請問您有這方面的經驗嗎??

Posted by: yien at 2007年08月28日 16:24

經測試, l7filter 似乎只能在 MASQUERADE
(iptables -t nat -A POSTROUTING -j MASQUERADE)
的狀況下發揮作用
光是 echo 1 > /proc/sys/net/ipv4/ip_forward
而不做 MASQUERADE 無法讓 -m layer7 的 rule 發揮作用

您可以在真正的 gateway 之前, 放一台 Linux host
做 ip_forward + masquerade + l7filter
1. 讓 client pc 的 default gateway 指向那台 Linux host
2. 真正的 gateway 只允許來自 Linux host 的封包通過, 禁止其他 client pc 通過
這樣就能把內部電腦的封包集中導入 l7filter 的 Linux host, 透過它來控管內部 user

Posted by: Jamyy at 2007年08月28日 17:14

Dear Jammy,
Thanks, 麻煩您特別去測式,那我知道了再次謝謝您的回答。

Posted by: yien at 2007年08月30日 09:44

比较复杂,很多问题,重要的是选好要编译的kernel

Posted by: hobbes at 2007年12月20日 17:37

請問大大
我的需求為,不讓USER可以上網,但要讓他可以使用SKYPE
但始終搞不定..

iptables -P FORWARD DROP
iptables -A FORWARD -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -m layer7 --l7proto skypeout -j ACCEPT
iptables -A FORWARD -m layer7 --l7proto skypetoskype -j ACCEPT

這樣用戶端的SKYPE依然登入不上..
請問有何好辦法呢?謝謝!

Posted by: Bruce_Wu at 2008年04月07日 16:57

請新增一個 rule:

iptables -A FORWARD -p tcp --dport 443 -j ACCEPT

這樣就可以使用 Skype 了
若通訊品質不良, 可以開放 udp ports:

iptables -A FORWARD -p udp --dport 1024:65535 -j ACCEPT

Posted by: Jamyy at 2008年04月09日 09:15

Jamyy 兄,
加入 iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
這我有測試過,是可行沒錯
但這樣使用這可以連上所有 https 的網站了..
而如果是改加入
iptables -A FORWARD -p tcp --dport 443 -m layer7 --l7proto skypeout -j ACCEPT
iptables -A FORWARD -p tcp --dport 443 -m layer7 --l7proto skypetoskype -j ACCEPT
這樣Skype依然登入不了..

真是一個頭兩個大

Posted by: Bruce_Wu at 2008年04月09日 10:20

我試出了一個有效, 但不是很好的辦法...

架設 squid, 啟用 transparent
squid.conf 設定:
acl lanuser 192.168.0.0/24
acl httpmtd method GET POST
acl deny lanuser httpmtd

iptables -t nat -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
iptables -t nat -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 443 -j REDIRECT --to 3128

FORWARD 的部份照舊

Client 端的 skype 須設置 HTTPS Proxy, 指向這台 Linux Host 的 3128 port

這樣就可以禁止 User 上網, 但 Skype 是暢通的

Posted by: Jamyy at 2008年04月09日 12:11

感謝 Jamyy 兄的回覆
不過本身我就有啟用 transparent 了
那我這樣就要一一排除可上網和不可上網的IP去設定 squid
且想要再不去動到用戶端的電腦 skype 設定狀態下完成上述功能..

所以我才會頭痛,繼續想辦法中....

也感謝 Jamyy 兄 的測試...

Posted by: Bruce_Wu at 2008年04月10日 15:43