Chinaunix首页 | 论坛 | 博客
  • 博客访问: 131714
  • 博文数量: 30
  • 博客积分: 1045
  • 博客等级: 上士
  • 技术积分: 221
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-19 09:52
个人简介

冬天来了,春天还会远吗?

文章分类

全部博文(30)

文章存档

2011年(30)

我的朋友

分类: LINUX

2011-04-19 14:18:22


感謝 study-area 站長 Netman 網中人提供資料
原文出處:


觀念解說:
本程式是透過 iptables 指令導引至 kernal 做 l7 filter 分析,
不如說是行為特徵比對.舉例來說一般為了想讓公司內部的員工禁用 IM
軟體如 MSN 但往往只能針對連線 Server & port 做封鎖,但此軟體又會
嘗試走 proxy 方式做連線,讓能防不勝防!如今打造此核心程式後就能迎
刃而解!為何如此說?因該程式會讓第一個封包產生 ESTABLISHED 之後就
Drop 掉以後封包讓該程式無法再轉由 proxy 做連線.

所有要做特徵比對參考檔案皆位在 /etc/l7-protocols/protocols
目錄下,只要在命令內加入如此 --l7proto msnmessenger 就開始做分析!

我 OS 環境:
Redhat 9.0
Kernel: 2.4.20-42.9.legacy
iptables: 1.2.11

技 巧︰
1﹒抓的是 bz2 的壓縮﹐所以用 j 參數﹐
抓的是 gz 格式﹐ 就用 z 參數。
2﹒可藉由 yum update 參數更新至上述核心!或者手動方式自行下載

3﹒在移除舊版 iptables 時記得先行備份此檔 /etc/init.d/iptables
再執行 yum remove iptables
4﹒由於 fro_older_kernels\kernel-2.4-layer7-0.9.1.patch 此檔,
是針對 linux-2.4.26-stock 做 patch ,而我的核心碼確非該版故
只能手動修改相關檔案位置插入要新增程式碼!如以下所述。
5﹒定期更新 Protocol definitions 檔案即可!位置如下:

6﹒kernel 在 2.4.20-28.9 以後版本 QOS 已支援 HBT Function,只要重編
核心選取即可。差意點在與 iprouter2 元件中 tc 指令並不支援,
故 Redhat 9 必須 update 該套件才能用。(套件名稱如後所指!)
而 tc 一般在設計上只能針對單一 device 做設定,而往往申請 ADSL
皆是非對稱式,故在使用上︰將下載設為對內網卡(本例為 eth0),
上行設為對外網卡(本例為 eth1)。
7﹒在實例應用︰預設禁止使用 msn,只開放少數人使用。
其語法不能如此下︰
#iptables -t mangle -A POSTROUTING -m layer7 --l7proto msnmessenger -j DROP
結果是︰所有封包皆以啟動核心比對!因用 iptables -L -n 或者 iptables -t nat -L
查看發現它不會顯示在 rule 內,以至於在下任何 iptables 指令皆無效!正確做法如
下所述 案例二方式,誤犯我相同錯誤觀念:-)

8﹒
從 下載核心 patch-o-matic-20030912.tar.bz2 包
就可以新增如下 Function 給予參考!
./runme base/iprange.patch

說明如下:
---------------------------------------------------------------------
Each patch is a new feature: many have minimal impact, some do not.
Almost every one has bugs, so I don't recommend applying them all!
-------------------------------------------------------
Testing... iprange.patch NOT APPLIED (2 missing files)
The base/iprange patch:
Author: Jozsef Kadlecsik
Status: Works

This patch makes possible to match source/destination IP
addresses against inclusive IP address ranges.

Examples.

iptables -A FORWARD -m iprange --src-range 192.168.1.5-192.168.1.124 -j ACCEPT
iptables -A FORWARD -m iprange --dst-range 10.0.0.0-10.5.255.255.255 -j ACCEPT
---------------------------------------------------------------------


~正式開始︰~
------------------------------------------------------------------------

~可先做此步驟︰
[root@linux2005 temp]# gunzip l7-protocols-2005-02-06.tar.gz
[root@linux2005 temp]# tar -xvf l7-protocols-2005-02-06.tar
[root@linux2005 l7-protocols-2005-02-06]# make install

內容說明︰
all:
@echo Nothing to compile, just run \'make install\'
@echo \(This just copies this directory into $(PREFIX)/etc/l7-protocols \)
install:
mkdir -p $(PREFIX)/etc/l7-protocols
cp -R * $(PREFIX)/etc/l7-protocols



~修正核心 patch
1、先解壓縮並做 kernel & iptables path
[root@linux2005 temp]# gunzip netfilter-layer7-v1.0.tar.gz
[root@linux2005 temp]# tar -xvf netfilter-layer7-v1.0.tar
[root@linux2005 temp]# cd netfilter-layer7-v1.0
[root@linux2005 netfilter-layer7-v1.0]# cd for_older_kernels/
[root@linux2005 for_older_kernels]# cp kernel-2.4-layer7-0.9.1.patch /usr/src/.

手動編修下列檔案修改內容,參考 kernel-2.4-layer7-0.9.1.patch
linux-2.4.26-stock/Documentation/Configure.help
linux-2.4.26-stock/include/linux/netfilter_ipv4/ip_conntrack.h
linux-2.4.26-stock/include/linux/netfilter_ipv4/ipt_layer7.h
linux-2.4.26-stock/net/ipv4/netfilter/Config.in
linux-2.4.26-stock/net/ipv4/netfilter/Makefile
linux-2.4.26-stock/net/ipv4/netfilter/ip_conntrack_core.c
linux-2.4.26-stock/net/ipv4/netfilter/ip_conntrack_standalone.c
linux-2.4.26-stock/net/ipv4/netfilter/ipt_layer7.c

~ mkdir regexp 目錄
linux-2.4.26-stock/net/ipv4/netfilter/regexp/regexp.c
linux-2.4.26-stock/net/ipv4/netfilter/regexp/regexp.h
linux-2.4.26-stock/net/ipv4/netfilter/regexp/regmagic.h
linux-2.4.26-stock/net/ipv4/netfilter/regexp/regsub.c

2、
[root@linux2005 src]# pwd
/usr/src
[root@linux2005 src]# ln -sf linux-2.4.20-42.9.legacy linux

3、開始核心編譯
[root@linux2005 linux-2.4]# pwd
/usr/src/linux-2.4
[root@linux2005 linux-2.4]# make mrproper <-- 去除 .o 的編譯過的檔案

相同版本核心編譯可借用原始 .config 設定檔︰
[root@linux2005 linux-2.4]# cp /boot/config-2.4.20-42.9.legacy /usr/src/linux-2.4/.config

[root@linux2005 linux-2.4]# make oldconfig
...
會顯現新的選項:
Layer 7 match support (EXPERIMENTAL) (CONFIG_IP_NF_MATCH_LAYER7) [N/m/?] (NEW) m
Layer 7 debugging output (EXPERIMENTAL) (CONFIG_IP_NF_MATCH_LAYER7_DEBUG) [N/y/?] (NEW) y
Buffer size for application layer data (256-65536) (CONFIG_IP_NF_MATCH_LAYER7_MAXDATALEN) [2048] (NEW) 2048
...
*** End of Linux kernel configuration.
*** Check the top-level Makefile for additional configuration.
*** Next, you must run 'make dep'.

核心重新選取︰
[root@linux2005 linux-2.4]# make menuconfig

[root@linux2005 linux-2.4]# make clean <-- 新的核心才需執行!
或者
[root@linux2005 linux-2.4]# make dep <-- 相同核心執行此步驟
!!重要!!
若使用 make dep 方式原有 /lib/modules 目錄下核心目錄不能
移除或更名!
---------------------------------------------------------
#make bzImage <--開始編譯核心!這個步驟很長,因核心是經過壓縮
放置位址 /usr/src/linux-2.4.20-20.7/arch/i386/boot/bzImage
#make modules <--開始編譯模組!
#make modules_install <--將模組資料安裝在 /lib/modules/'uname -r' 裡面
#make install <--將剛 bzimage 建立完成核心給他安裝上來!

4、
編修開機檔
[root@linux2005 linux]# cd /boot/grub
[root@linux2005 grub]# vi grub.conf
....
default=0
timeout=5

title Red Hat Linux (2.4.20-42.9.legacycustom)
root (hd0,0)
kernel /vmlinuz-2.4.20-42.9.legacycustom ro root=LABEL=/
initrd /initrd-2.4.20-42.9.legacycustom.img



~ Ipatbles Patch
[root@linux2005 src]# pwd
/usr/local/src
[root@linux2005 src]# tar -jxvf iptables-1.2.11.tar.bz2
[root@linux2005 src]# cp /temp/netfilter-layer7-v1.0/iptables-layer7-1.0.patch .
[root@linux2005 src]# patch -p1 < iptables-layer7-1.0.patch
patching file extensions/.layer7-test
patching file extensions/libipt_layer7.c
patching file extensions/libipt_layer7.man

[root@linux2005 extensions]# pwd
/usr/local/src/iptables-1.2.11/extensions
[root@linux2005 extensions]# cp /usr/local/src/extensions/* .
[root@linux2005 extensions]# cp /usr/local/src/extensions/.layer7-test .
[root@linux2005 extensions]# chmod 755 .layer7-test


[root@linux2005 src]# cd iptables-1.2.11/
附註:
需重編核心要執行下列步驟︰
[root@linux2005 iptables-1.2.11]# pwd
/usr/local/src/iptables-1.2.11
[root@linux2005 iptables-1.2.11]# make clean

正常方式︰
[root@linux2005 iptables-1.2.11]# make KERNEL_DIR= /usr/src/linux-2.4
[root@linux2005 iptables-1.2.11]# make install KERNEL_DIR= /usr/src/linux-2.4

安裝完後,要確認下列目錄有此檔案︰
iptables v1.2.11: Couldn't load match `layer7':/usr/local/lib/iptables/libipt_layer7.so


_使用方式︰
QoS to filter
iptables -t mangle -A POSTROUTING -m layer7 --l7proto imap -j MARK --set-mark 3

The number "3" is arbitrary. It can be any unsigned 32-bit integer. Then you can use tc
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3

當下此命令是所有 http protocol 皆被拒絕掉!
[root@linux2005 /]# iptables -t mangle -A POSTROUTING -m layer7 --l7proto http -j DROP


~ iptables 掛為 Deamon 模式
[root@linux2005 init.d]# chkconfig -h
chkconfig version 1.3.8 - Copyright (C) 1997-2000 Red Hat, Inc.
This may be freely redistributed under the terms of the GNU Public License.

usage: chkconfig --list [name]
chkconfig --add
chkconfig --del
chkconfig [--level ] )
[root@linux2005 init.d]# pwd
/etc/init.d
[root@linux2005 init.d]# chkconfig --add iptables
[root@linux2005 init.d]# chkconfig --level 3 iptables on

[root@linux2005 init.d]# locate iptables |more
/usr/local/sbin/iptables
/usr/local/sbin/iptables-save
/usr/local/sbin/iptables-restore

[root@linux2005 init.d]# cp /usr/local/sbin/iptables /sbin/.
因為 /etc/init.d/iptables 內定義執行程式是在 /sbin 目錄內


~ QOS __ HTTB
[root@linux2005 temp]# rpm -Uvh iproute-2.4.7-7.90.1.htb.i386.rpm
Preparing... ########################################### [100%]
1:iproute ########################################### [100%]
主要更新 iptables 內 tc 套件能支援 htb 模組.

[root@linux2005 rc.d]# ./hbt_ebt

QOS 查驗方式︰
# tc -s -d qdisc show dev eth1
# tc -s -d class show dev eth1

[root@linux2005 rc.d]# tc -s -d qdisc show dev eth1
qdisc sfq 8004: quantum 1514b limit 128p flows 128/1024 perturb 10sec
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)

qdisc sfq 8003: quantum 1514b limit 128p flows 128/1024 perturb 10sec
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)

qdisc htb 3: r2q 10 default 3 direct_packets_stat 0 ver 3.10
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)

[root@linux2005 rc.d]#


[root@linux2005 rc.d]# tc -s -d class show dev eth1
class htb 3:1 root rate 960Kbit ceil 1Mbit burst 2827b/8 mpu 0b cburst 2909b/8 mpu 0b level 7
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
lended: 0 borrowed: 0 giants: 0
tokens: 18853 ctokens: 18187

class htb 3:2 parent 3:1 leaf 8003: prio 0 quantum 8192 rate 640Kbit ceil 1Mbit burst 2418b/8 mpu 0b cburst 2909b/8 mpu 0b level 0
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
lended: 0 borrowed: 0 giants: 0
tokens: 24189 ctokens: 18187

class htb 3:3 parent 3:1 leaf 8004: prio 0 quantum 4096 rate 320Kbit ceil 512Kbit burst 2008b/8 mpu 0b cburst 2254b/8 mpu 0b level 0
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
lended: 0 borrowed: 0 giants: 0
tokens: 40179 ctokens: 28187

[root@linux2005 rc.d]#


_案例一︰透過 l7_filter 轉至 QOS (鎖住下載對內網卡 eth0) 執行方法︰

[root@linux2005 rc.d]# iptables -t mangle -A POSTROUTING -m layer7 --l7proto http -j MARK --set-mark 3
[root@linux2005 rc.d]# tc filter add dev eth0 protocol ip parent 3:1 prio 1 handle 3 fw flowid 3:3

結 果:
當導入 Qos 頻寬管理後包含在 IE 網頁上直接下載 .exe 檔案皆會被限頻在你
所定規則內,本例是導入 classid 3:3 規則頻寬則設限為 20 KB/秒 範圍內.


~ HBT_EBT 定義內容如下︰
DEV_1="eth0"
EXT_IF="97.24.2.250"

# Up:_128 Kbps For DEV_1 InterNet eth2
# ---------------------------------------------------------------------------
# 128 KByte x 8 = 1024 Kbit

tc qdisc del root dev $DEV_1
tc qdisc add dev $DEV_1 root handle 3:0 htb default 3
tc class add dev $DEV_1 parent 3:0 classid 3:1 htb rate 960kbit ceil 1024kbit

#
tc class add dev $DEV_1 parent 3:1 classid 3:2 htb rate 640kbit ceil 1024kbit
tc class add dev $DEV_1 parent 3:1 classid 3:3 htb rate 160kbit ceil 160kbit


_案例二︰限制單一 IP 97.24.2.22 使用 MSN 軟體

iptables -s 97.24.2.22 -t mangle -A POSTROUTING -m layer7 --l7proto msnmessenger -j DROP

﹒倘若規則成立則 Linux 主機上會顯示如下訊息︰
→ layer7: regexec positive: msnmessenger!

﹒也可由 /var/log/messages 檔案 log 內容得知!



Q&A:
1、重開機啟動後檢查 layer7 module 有無載入?如有!應出現如下訊息。

[root@linux2005 /]# lsmod
Module Size Used by Not tainted
cls_fw 3480 1 (autoclean)
ipt_MARK 1432 1 (autoclean)
ipt_layer7 11260 1 (autoclean)
...
ip_conntrack 27016 2 [ipt_layer7 ipt_MASQUERADE ip_conntrack_ftp ip_nat_ftp iptable_nat]
ip_tables 14648 8 [ipt_MARK ipt_layer7 ipt_MASQUERADE iptable_mangle iptable_filter iptable_nat]
...


2、By default, l7-filter looks at the first 8 packets or 2kB, whichever is
smaller. You can alter the number of packets through
/proc/net/layer7_numpackets. i.e. "echo "12" > /proc/net/layer7_numpackets".
如編譯完在 /proc/net 目錄下無此 layer7_numpackets 檔案,而又需此功能!

_作者回覆︰
Well, I have no idea why you aren't getting the proc file. Perhaps it is
because you are using a Redhat kernel and one of their patches breaks it.
If you really need a higher numpackets, you can modify the default value
in linux/net/ipv4/netfilter/ipt_layer7.c, recompile, reinstall.

Near the top:

static int num_packets = 8;


阅读(529) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~