系统环境:RHEL5.4 [ 2.6.18-8.el5xen ]
软件环境:
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.19.tar.bz2
http://www.netfilter.org/projects/iptables/files/iptables-1.4.2.tar.bz2
http://ie.archive.ubuntu.com/sourceforge/l/l7/l7-filter/netfilter-layer7-v2.20.tar.gz
http://ie.archive.ubuntu.com/sourceforge/l/l7/l7-filter/l7-protocols-2008-10-04.tar.gz
目标功能: 为iptables增加layer7补丁,实现应用层过滤。
一、重新编译内核
1、合并kernel+layer7补丁
shell> tar jxvf linux-2.6.25.19.tar.gz2 -C /usr/src/
shell> tar zxvf netfilter-layer7-v2.20.tar.gz -C /usr/src/
shell> cd /usr/src/linux-2.6.25.19/
shell> patch -p1 < /usr/src/netfilter-layer7-v2.20/kernel-2.6.25-layer7-2.20.patch
2、配置新内核
shell> cp /boot/config-2.6.18-8.el5 .config //偷个懒,沿用旧的内核配置
shell> make menuconfig //执行后,显示下图,安图选择。
附:如//配置内核时,在“Networking ---> Networking Options ---> Network Packet filtering framework (Netfilter) ”处主要注意两个地方(与上图所示相同):
1) ---> Code Netfilter Configuration
//将“Netfilter connection tracking suport (NEW)”选择编译为模块(M),需选取此项才能看到layer7支持的配置。
//将layer7、string、state、time、IPsec、iprange、connlimit……等编译成模块,根据需要看着办。
2) ---> IP: Netfilter Configuration
//将“IPv4 connection tracking support (require for NAT)”编译成模块。
//将“Full NAT”下的“MASQUERADE target support”和“REDIRECT target support”编译成模块。
注:先查看自己配置的.config文件是否拥有的自己选择的模块,
vim /usr/src/linux-2.6.25.19/.config (查找一下相应模块,避免二次编译内核)
3、编译及安装模块、新内核
shell> make && make modules_install && make install
//编译安装成后后,重启选择使用新的内核(2.6.25.19)引导系统
修改引导项,
二、重新编译iptables
1、卸载现有iptables
shell> rpm -e iptables iptstat --nodeps
2、合并iptables+layer7补丁
shell> tar jxvf iptables-1.4.2.tar.bz2 -C /usr/src/
shell> cd /usr/src/netfilter-layer7-v2.20/iptables-1.4.1.1-for-kernel-2.6.20forward/
shell> cp libxt_layer7.c libxt_layer7.man /usr/src/iptables-1.4.2/extensions/
3、编译安装
shell> cd /usr/src/iptables-1.4.2/
shell> ./configure --prefix=/ --with-ksource=/usr/src/linux-2.6.25.19
shell> make && make install
4、安装l7-protocols模式包
[root@host ~]# tar -zxvf l7-protocols-2009-05-10.tar.gz
[root@host ~]# cd l7-protocols-2009-05-10
[root@host l7-protocols-2009-05-10]# make install
mkdir -p /etc/l7-protocols
cp -R * /etc/l7-protocols
三、模块规则示例
简单编写一个shell方便来执行规则。
输写语法要正确,就可以正常执行,测试结果不再贴出。
附录:
1. string(字符串匹配,可以用做内容过滤)
# cat string/info (使用字符模块时,注意要指明算法)
iptables -I FORWARD -m string--algo bm --string "腾讯" -j DROP
iptables -I FORWARD -s 192.168.3.159 -m string --algo bm --string "qq.com" -j DROP
iptables -I FORWARD -d 192.168.3.0/24 -m string --algo bm --string "宽频影院" -j DROP
2. comment (备注匹配,可以支持最多256个字符)
Supported options:
--comment COMMENT
翻译:这个选项增加CONFIG_IP_NF_MATCH_COMMENT,补充一个注释匹配模块.这个匹允许你增加一个备注都任何规则,这个备注最多支持256个字符,例如
Example:(例子:)
iptables -I FORWARD -s 192.168.3.159 -p tcp --dport 80 -j DROP -m comment --comment "the bad guy can not online"
iptables -I FORWARD -s 192.168.3.159 -m string --algo bm --string "qq.com" -j DROP -m comment --comment "denny go to qq.com"
这样在iptables -L时,就看到每条规则后面出现备注的内容.可以提高可读和理解该条规则的作用.
这个comment 在2.6.x中已经被正式收录.
3. connlimit(同时连接个数限制匹配)
这个增加一个iptables匹配允许你限制每个客户ip地址的并发tcp连接,即同时连接到一个服务器个数.
Examples: 允许每个客户机同时两个telnet连接
iptables -A FORWARD-p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
# 你也可以匹配其他的方法
iptables -A FORWARD -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT
# limit the nr of parallel http requests to 16 per class C sized (这下面例子限制80端口最多同时16个连接请求)
# network (24 bit netmask)
iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT
模块 connlimit 作用:连接限制
--connlimit-above n 限制为多少个
--connlimit-mask n 这组主机的掩码,默认是connlimit-mask 32 ,即每ip.
这个主要可以限制内网用户的网络使用,对服务器而言则可以限制每个ip发起的连接数...比较实用
例如:只允许每个ip同时5个80端口转发,超过的丢弃:
iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j DROP
例如:只允许每组C类ip同时10个80端口转发:
iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP
例如:为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃.
iptables -A INPUT -s 192.1681.0/24 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
4. time(时间匹配)
Match only if today is one of the given days. (format: Mon,Tue,Wed,Thu,Fri,Sat,Sun ; default everyday)
(只是匹配已经给出的天,格式Mon,Tue,Wed,Thu,Fri,Sat,Sun ;默认每天)
(开始日期 日期)
Match only if it is after `date' (Inclusive, format: YYYY]]]] h,m,s start from 0 ; default to 1970)
(只是匹配这个开始日期值之后的(包括,格式: YYYY]]]] h,m,s start from 0 ; 默认是1970):
Match only if it is before `date' (Inclusive, format: YYYY]]]] h,m,s start from 0 ; default to 2037)
(只是匹配这个开始日期值之前的(包括,格式: YYYY]]]] h,m,s start from 0 ; 默认是2037):
Example: (例子:)
iptables -A INPUT -m time --timestart 8:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri
(上面将匹配从到达日期是星期一至星期五时间从8:00至18:00的包)
iptables -t filter -A OUTPUT -m time --timestart 8:00 --timestop 18:00 --weekdays Mon --date-stop 2012
(上面将匹配本地产生的时间范围直到2012年为止的每个星期一8:00至18:00的包)
NOTE: the time match does not track changes in daylight savings time
5. iprange (ip范围匹配)
这个补丁令匹配源/目标 IP地址可以依着给出的地址范围进行匹配
Examples:(例子)
iptables -t filter -A FORWARD -m iprange --src-range 192.168.1.5-192.168.1.124 -j ACCEPT
这个例子是允许源ip地址范围192.168.1.5-192.168.1.124的包通过
iptables -t filter -A FORWARD -m iprange --dst-range 10.0.0.0-10.255.255.255 -j ACCEPT
这个例子是允许目标ip地址范围10.0.0.0-10.255.255.255的包通过
netfilter/iptables基础学习
1、netfilter/iptables 系统简介
Linux 2.4 内核中 netfilter 是新的用来实现防火墙的过滤器,iptables 是用来指定 netfilter
规则的用户工具。
iptables 只是一个管理内核包过滤的工具,它为用户配置防火墙规则提供了方便。
iptables 可以加入、插入或删除内核包过滤表(链)中的规则。实际上真正来执行这些规则
的是 netfilter 及其相关模块。
2、netfilter/iptables 的用途
建立 Internet 防火墙和基于状态的包过滤
用 NAT 和伪装共享上网
用 NAT 实现透明代理
用修改 IP 包头的 ToS 字段来实现更复杂的功能
和 tc+iprouter2 配合使用可以实现 QoS 路由
3、IPTables 表与链的功能
IPTables中一共有三张表,分别为filter表,nat表,mangle表
1》filter表主要用于过滤的作用,在IPTables中几乎所以的过滤都在这个表内完成,它是IPTables中默认执行的表。
filter表中一共有三条链:INPUT链,FORWARD链,OUTPUT链
INPUT链:过滤所有目标地址是本机的数据包
FORWARD链:过滤所有路过本机的数据包,也就是目的地址和源地址都还是本机的数据包。
OUTPUT链:过滤所有由本机产生的数据包,也就是源地址是本机的数据包。
2》nat表主要用于网络地址转换,对于一个流的数据包只会经过这个表一次,也就是说在如果一个包被允许了转换,那么它后面而来的数据包就不会再nat,而是直接自动的随第一个被转换的数据包流过。
nat主要有三个转换的方式:DNAT SNAT MASQUERADE
DNAT: 改变数据包的目的地址,把外网的一个地址重定向到内网的一台主机上。
SNAT: 改变数据包的源地址,使内网的用户可以连接到外网
MASQUERADE:与SNAT功能相似,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE 都要查找可用的 IP 地址,而不像SNAT一样,只使用一个固定的地址。
Nat也有三个链:PREROTING链 POSTROUTING链 OUTPUT链
PREROUTING链:可以在数据包到达防火墙的时候改变包的目标地址
POSTROUTING链:在数据包就要离开防火墙时改变数据包的源地址
OUTPUT链:可以改变产生的数据包的目标地址
3》mangle 表不能做任何 NAT,它只是改变数据包的TTL,TOS 或 MARK,而不是其源目地址。防火墙内的其他的规则或程序可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的链: PREROUTING,POSTROUTING, OUTPUT,INPUT 和FORWARD。
iptables状态机制
4、netfilter/iptables 系统的优点
netfilter/iptables 的最大优点是它可以配置有状态的防火墙,这是 ipfwadm 和 ipchains
等以前的工具都无法提供的一种重要功能。有状态的防火墙能够指定并记住为发送或接收
信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新
的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。有 4 种有效状态,
名称分别为 NEW、ESTABLISHED、RELATED和 INVALID。
1、NEW状态:说明这个数据包是收到的第一个数据包。比如收到一个SYN数据包,它是连接的第一个数据包,就会匹配NEW状态。为保障网络安全,可以丢弃NEW状态的数据包。
2、ESTABLISHED状态:只要发送并接到应答,一个数据连接就从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后继数据包。ICMP的错误和重定向等信息包也被看作ESTABLISHED,只要数据包是所发出的信息的应答。
3、RELATED状态:当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为RELATED,也就是说一个连接要想是RELATED,首先要有一个ESTABLISHED的连接,这个ESTABLISHED连接再产生一个主连接之外的连接,即RELATED。比如ftp.
4、INVALID状态:说明数据包不能被识别属于哪个连接或没有任何状态。比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应DROP这个状态的任何数据。
5、iptables语法
iptables 语法
iptables -t 表格名称 指令 选项 参数
nat --->POSTRPOUTING
PREROUTING
OUTPUT
filter --->INPUT
OUTPUT
FORWARD
指令:
-A --append
-D --delete 链的名称 规则编号
-I --insert 名名 链的名称 规则编号
-R --replace 链的名称 规则编号
-N --new自定义链名称(要引用后才能生效)
-X -- 删除空的,自定义的链
-F --flush 清空链规则
-P --policy 默认策略
-Z --zero 将规则表计数器清零,即已经匹配的数据包清零