关于 十一月, 2008 的文章

安装L7filter使iptables支持对七层应用进行过滤

重新编译内核,使iptables支持L7filter,对七层应用进行过滤

Iptables对于七层上面的应用过滤本身不支持,需要安装第三方的模块方可支持。
L7-filter是一个iptables的外挂模块,它可以过滤很多种的L7协议,这样能够封杀如P2P、IM等应用。

1.适用编译环境
操作系统:RedHat Enterprise Linux AS4 U4 以上 且带有GCC编译工具

2.软件下载
kernel:2.6.25
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.tar.bz2
iptables:
http://www.netfilter.org/projects/iptables/files/iptables-1.4.0.tar.bz2
l7-filter:
http://sourceforge.net/projects/l7-filter
netfilter-layer7-v2.20.tar.gz
l7-protocols-2008-04-23.tar.gz

3.给内核打L7-filter补丁
将以上各软件包都解压到 /usr/src 目录
#cd /usr/src
#tar xzvf netfilter-layer7-v2.20.tar.gz
#tar xjvf linux-2.6.25.tar.bz2
#cd linux-2.6.25
#patch -p1 < /usr/src/netfilter-layer7-v2.20/kernel-2.6.25-layer7-2.20.patch

4.编译内核
#make oldconfig
使用make oldconfig可以继承老的kernel的配置,为自己的配置省去很多麻烦。

#make menuconfig
make menuconfig是文字界面下推荐一种方式,在这里可以选择你需要编译到核心的模块。
因为前面make oldconfig已经很多都继承老的配置,所以一般配置不要动。
有两项需要注意:
第一项:(在我的版本里面默认就是选上的)
General setup --->features --->

Prompt for development and/or incomplete code/drivers
第二项:(选择iptables里面关于L7filter的)
Networking ---> Networking options --->
--- Network packet filtering framework (Netfilter)
[ ] Network packet filtering debugging

Advanced netfilter configuration>

Bridged IP/ARP packets filtering-->
Core Netfilter Configuration --->
IP: Netfilter Configuration --->
Bridge: Netfilter Configuration --->

Core Netfilter Configuration --->
里面有很多的选项,推荐将其全部选择。

IP: Netfilter Configuration --->
IP tables support (required for filtering/masq/NAT)
该项必须选择,其它项可根据需要选择,不过同样推荐将其全部选择。

#make
#make modules
#make modules_install
#make install

#vi /boot/grub/grub.conf
default=0

修改默认以新的内核启动。
#cp /usr/src/linux-2.6.25/.config /boot/config-2.6.25

将新的内核配置文件复制到/boot目录。
#reboot

重启服务器。
#uname –r
2.6.25

重启完成后确认内核版本是否正确。

5.给iptables打补丁并升级

#rpm -qa |grep iptables
#rpm -e --nodeps iptables1.x.x

卸载系统中的旧版本iptables。
#cd /usr/src
#tar xjvf iptables-1.4.0.tar.bz2

#tar xzvf netfilter-layer7-v2.20.tar.gz
#cd iptables-1.4.0
# patch p1 < /usr/src/netfilter-layer7-v2.20/iptables-1.4-for-kernel-2.6.20forward-layer7-2.20.patch
# chmod +x extensions/ .layer7-test
# export KERNEL_DIR=/usr/src/linux-2.6.25
# export IPTABLES_DIR=/usr/src/iptables-1.4.0
#make BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man install
# iptables -V
iptables v1.4.0

确认iptables版本是否正确。

6.安装l7-protocol
#cd /usr/src/
#tar xzvf l7-protocols-2008-11-23.tar.gz
#cd l7-protocols-2008-11-23
#make install
其实就是把响应的目录copy到 /etc/l7-protocols/
真正调用的是/etc/l7-protocols/protocols/下面的文件
可以打开下面具体的文件,里面是一些L7程序特征码的正则表达式形式
这样自己也可以按照这样的样子,写自己的特征码。

该特征码软件包一直在不停的更新,其后面的日期就是更新的日期,推荐定期选择最新的包进行更新。

7.测试
#iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" --algo bm -j DROP
#iptables -I FORWARD -p tcp -m multiport --dport 80,443 -m layer7 --l7proto qq -j DROP
#iptables -I FORWARD -p udp --dport 8000 -j DROP
#iptables -I FORWARD -p tcp -m layer7 --l7proto socks -j DROP
#iptables -I FORWARD -p udp --dport 53 -m string --string "messenger" --algo bm -j DROP
#iptables -I FORWARD -p tcp -m multiport --dport 80,443 -m layer7 --l7proto msnmessenger -j DROP
#iptables -I FORWARD -p udp --dport 1863 -j DROP
#iptables -t mangle -A PREROUTING -m layer7 --l7proto qq -j DROP
#iptables -t mangle -A PREROUTING -m layer7 --l7proto msnmessenger -j DROP
可通过上面的策略表达式测试是否成功禁止掉qq和msn。

附注:
使用-j MARK 参数与TC搭配: http://cha.homeip.net/blog/archives/2005/07/cbqinit.html

lsmod可以查看当前加载的模块
modprobe可以加载模块
与iptables相关的模块在下面两个目录:/lib/modules/2.6.25/kernel/net/netfilter/
/lib/modules/2.6.25/kernel/net/ipv4/netfilter/

相关网址:
下载与说明:http://l7-filter.sourceforge.net/HOWTO#Get
支持协议:http://l7-filter.sourceforge.net/protocols
其它:Application Layer Packet Classifier for Linux
L7-filter Supported Protocols
Netfilter Packet Traversal

流程图:

nfk-traversal

No Comments

工作笔记 -- 基于本地用户方式的Vsftp高级设置

创建一个专用的FTP数据存储目录:
# mkdir /ftpserver
# vi /etc/vsftpd/vsftpd.conf

设置vsftpd为standalone工作模式
listen=YES
tcp_wrappers=YES

启用本地用户:
local_enable=YES

禁用匿名用户:
anonymous_enable=NO
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES

更改FTP默认监听端口21:
添加
##Set the listen_port
Listen_port=5200

设置FTP的PASV模式传输端口,以配合防火墙通过PASV模式传输数据:
添加
##set the pasv ports
port_enable=NO
pasv_enable=YES
pasv_min_port=10021
pasv_max_port=10025

设置FTP服务器最大的并发连接数,默认值为0,表示不限最大连接数。
添加
max_clients=1000

设置每个IP地址最大的并发连接数目,默认值为0,表示不限制。
添加
max_per_ip=10

启用锁定主目录用户名单功能:
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
# touch /etc/vsftpd.chroot_list

启用特定用户独立配置文件功能:
添加
##set the user's private config
user_config_dir=/etc/vsftpd/user_config/
# mkdir /etc/vsftpd/user_config/

创建一个FTP用户,将该用户的主目录指向到/ftpserver,并使其不能登陆shell:
# useradd jacky -d /ftpserver/jacky -s /sbin/nologin
# passwd jacky

锁定jacky用户的主目录
# vi /etc/vsftpd.chroot_list
添加
jacky

创建jacky用户的独立配置文件:
# cd /etc/vsftpd/user_config/
# vi jacky
##Allow this user download?
#download_enable=YES
##Uncomment this to enable any form of FTP write command,such as "STOR,DELE,RNFR,RNTO,MKD,RMD,APPE,SITE ..."
#write_enable=YES
##If you set the "write_enable=YES",but don't want to allow "rename or delete ..."
##You can open "cmds_allowed",and remove the command which you don't allow.
##"delete" = "DELE,RMD" ; "rename" = "RNFR,RNTO" ; "mkdir" = "MKD"
#cmds_allowed=ABOR,ACCT,ALLO,APPE,CDUP,CWD,DELE,EPRT,EPSV,FEAT,
HELP,LIST,MDTM,MKD,MODE,NLST,NOOP,OPTS,PASS,PASV,PORT,PWD,
QUIT,REIN,REST,RETR,RMD,RNFR,RNTO,SITE,SIZE,SMNT,STAT,
STOR,STOU,STRU,SYST,TYPE,USER,XCUP,XCWD,XMKD,XPWD,XRMD,BYE
##Set the max rate for this user,"Bytes/s".
#local_max_rate=204800
##Set the root directory for this user.
#local_root=

使jacky用户仅具有下载、上传和创建目录的权限,而没有删除和重命名的权限:
download_enable=YES
write_enable=YES
cmds_allowed=ABOR,ACCT,ALLO,APPE,CDUP,CWD,EPRT,EPSV,FEAT,
HELP,LIST,MDTM,MKD,MODE,NLST,NOOP,OPTS,PASS,PASV,PORT,PWD,
QUIT,REIN,REST,RETR,SITE,SIZE,SMNT,STAT,
STOR,STOU,STRU,SYST,TYPE,USER,XCUP,XCWD,XMKD,XPWD,XRMD,BYE

限制jacky用户的最大下载速度为200KB左右
local_max_rate=204800

重启vsftpd以使配置生效:
# /etc/init.d/vsftpd restart

修改防火墙以使FTP通过:
# vi /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5200 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10021 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10023 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10024 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10025 -j ACCEPT

重启防火墙以使策略生效:
# /etc/init.d/iptables restart

OK! The end.

PS(根据实际需要):
开放root用户的FTP权限:
# vi /etc/vsftpd.ftpusers
#root
# vi /etc/vsftpd.user_list
#root

禁止jacky用户的FTP权限
# vi /etc/vsftpd.ftpusers
添加
jacky
# vi /etc/vsftpd.user_list
添加
jacky

No Comments