busyant
[!已解决!]RHEL5,connlimit模块编译成功,但无法使用(含编译步骤)
RHEL 5 的kernel rpm包并不包含完整的source code,所以按照以前版本的编译方法是不能成功的。根据fedora的release notes的说明,需要增加新的模块的时候,只需要新建一个Makefile,然后make这个模块就好了(RHEL 5的release notes应该也有提到,但我没有查证)(fedora 5的release notes: [url]http://docs.fedoraproject.org/release-notes/fc5/release-notes-ISO/#id3098172[/url])。
但我编译成功connlimit.ko和iptables后,调用这个模块时却一直出错:
[quote]
# iptables -A INPUT -p tcp -s 192.168.10.41 -m connlimit --connlimit-above 3 -j DROP
[b]iptables: Invalid argument[/b]
[/quote]
麻烦各位大侠帮忙看看。感激不尽!
下面是我的编译步骤:
[quote]
#wget [url=ftp://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20080214.tar.bz2]ftp://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20080214.tar.bz2[/url]
#wget [url=ftp://ftp.netfilter.org/pub/iptables/iptables-1.4.0.tar.bz2]ftp://ftp.netfilter.org/pub/iptables/iptables-1.4.0.tar.bz2[/url]
#tar xjf iptables-1.4.0.tar.bz2
#tar xjf patch-o-matic-ng-20080214.tar.bz2
#cd /root/patch-o-matic-ng-20080214
#./runme --download ####下载connlimit模块
#KERNEL_DIR=/usr/src/kernels/2.6.18-8.el5-i686 IPTABLES_DIR=/root/iptables-1.4.0 ./runme connlimit ####应用connlimit补丁
开始编译模块:
#cd /usr/src/kernels/2.6.18-8.el5-i686
#make oldconfig ####提示新加入了connlimit的选项,问是否需要编译进入内核的时候,输入“m”,编译为模块。
#make modules_prepare ####这步是干吗的???我不知道,也没有细究,老实执行了。
#mv net/ipv4/netfilter/Makefile net/ipv4/netfilter/Makefile.orig ####备份原来的Makefile,里面包含了原始的编译信息,直接编译会无法通过。
#vi net/ipv4/netfilter/Makefile ####输入以下内容:
[i]obj-m := ipt_connlimit.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules[/i]
然后编译该模块:
#make M=net/ipv4/netfilter ####成功
#cp net/ipv4/netfilter/ipt_connlimit.ko /lib/modules/2.6.18-8.el5/kernel/net/ipv4/netfilter/
#chmod 744 /lib/modules/2.6.18-8.el5/kernel/net/ipv4/netfilter/ipt_connlimit.ko
到这里,模块编译完成。
安装新版的iptables-1.4.0. ####注意先用yum remove iptables卸载掉自带的iptables-1.3.5
#cd /root/iptables-1.4.0
#make KERNEL_DIR=/usr/src/kernels/2.6.18-8.el5-i686/
#make install KERNEL_DIR=/usr/src/kernels/2.6.18-8.el5-i686/
好啦,iptables也安装完了,默认binary安装路径在:/usr/local/sbin/,lib安装在/usr/local/lib/iptables目录内。
用modprobe测试看connlimit能否被正常加载:
#modprobe ipt_connlimit ####成功
lsmod查看一下:
#lsmod |grep ip
ipt_REJECT 9537 1
iptable_filter 7105 1
ipt_connlimit 7680 0
ip_conntrack 53153 2 xt_state,ipt_connlimit
ip_tables 17029 1 iptable_filter
nfnetlink 10713 1 ip_conntrack
ipv6 251137 12
x_tables 17349 5 ipt_REJECT,xt_state,xt_tcpudp,ipt_connlimit,ip_tables
[/quote]
********
问题来了:
原来的iptables策略都可以应用,但调用connlimit模块就是不行:
# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
DROP all -f 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/8 0.0.0.0/0
DROP all -- 255.255.255.255 0.0.0.0/0
DROP all -- 169.254.0.0/16 0.0.0.0/0
DROP all -- 221.240.102.0 0.0.0.0/0
DROP all -- 203.215.94.193 0.0.0.0/0
DROP all -- 218.71.137.68 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 8
ACCEPT tcp -- 192.168.10.0/24 0.0.0.0/0 tcp flags:0x17/0x02
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x17/0x02
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
REJECT all -- 0.0.0.0/0 0.0.0.0/0 state NEW reject-with icmp-port-unreachable
# iptables -A INPUT -p tcp -s 192.168.10.41 -m connlimit --connlimit-above 3 -j DROP
[b]iptables: Invalid argument[/b]
********
到底是哪里的问题???????
——————————————————————
问题解决后,整理出来的操作手册
——————————————————————————————(2008-2-19更新 开始)
正好有一个RHEL 5.1的机器,发现其内核也是2.6.18的,只是后面的“-8”变成了“-53”,那么?
直接copy了RHEL5上编译出来的ko模块过去,发现也是可以使用的。
另,RHEL3上的编译也完成了,下午更新到服务器上后,把操作手册和对应的模块,以及与RHEL5的区别也更新上来!
——————————————————————————————(2008-2-19更新 结束)
------------------------------------------------------------------------(2008-2-20更新 开始)
上午在正式环境部署了connlimit,主要需要注意:
正式环境使用的kernel版本,比如是否有smp支持,这点常常会与测试环境不同,并被忽视
RHEL 3是2.4的内核,编译方法不太一样,时间也稍微长一点。
正式环境部署前,考虑好应急方案,并做好准备。RHEL3需要重新编译安装iptables,因此如果编译失败,你需要尽快将原版的iptables及对应的策略恢复回去。
其他不说了,请下载附件
------------------------------------------------------------------------(2008-2-20更新 结束)
[[i] 本帖最后由 busyant 于 2008-2-20 16:46 编辑 [/i]]
andywxb
楼主,我用的是centos 5.0,我编译完后测试你给的命令:iptables -A INPUT -p tcp -s 192.168.10.41 -m connlimit --connlimit-above 3 -j DROP 是正常的,应该是你编译和安装的问题!
busyant
[quote]原帖由 [i]andywxb[/i] 于 2008-2-15 10:59 发表 [url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6454629&ptid=920595][img]http://linux.chinaunix.net/bbs/images/common/back.gif[/img][/url]
楼主,我用的是centos 5.0,我编译完后测试你给的命令:iptables -A INPUT -p tcp -s 192.168.10.41 -m connlimit --connlimit-above 3 -j DROP 是正常的,应该是你编译和安装的问题! [/quote]
感谢关注,能分享一下你的编译步骤么?包括使用的iptables版本,patch-o-matic-ng的版本!
我实在想不出来问题出在哪里了!!!
andywxb
我用的是linux-2.6.18-8、l7-protocols-2007-11-22.tar.gz、netfilter-layer7-v2.16.1.tar.gz、iptables-1.3.6.tar.bz2、patch-o-matic-ng-20071208.tar.bz2
(1)内核打补丁
(2)安装netfilter扩展
(3)安装新版本iptables以及layer7协议
(4)编译内核
[[i] 本帖最后由 andywxb 于 2008-2-15 11:08 编辑 [/i]]
andywxb
现在centos 5.1不是出来了吗,我打算有时间用centos 5.1重新安装过!centos 5.0我是很久哪时装的,记得是在这个bbs找的教程!
busyant
(1)内核打补丁
我有做的:
#KERNEL_DIR=/usr/src/kernels/2.6.18-8.el5-i686 IPTABLES_DIR=/root/iptables-1.4.0 ./runme connlimit ####应用connlimit补丁
andywxb 兄加一下我msn吧(已站内信),IM沟通会顺利一点,问题解决后,我再把结果放到这里来。
andywxb
[url]ftp://ftp.netfiter.org/pub/patch-omatic-ng/snapshot[/url]
wget [url]http://downloads.sourceforge.net/l7-filter/l7-protocols-2007-11-22.tar.gz[/url]
wget [url]http://downloads.sourceforge.net/l7-filter/netfilter-layer7-v2.16.1.tar.gz[/url]
(1)内核打layer7补丁
cd /usr/src/linux
patch -p1 < kernel-2.6.18-2.6.19-layer7-2.9.patch
(2)安装netfilter扩展
./runme -download
./runme connlimit
(3)安装新版本iptables以及layer7协议
/etc/init.d/iptables stop
cd /usr/src/iptables
patch -p1 < iptables-1.3-for-kernel-pre2.6.20-layer7-2.16.1.patch
chmod +x ./extensions/.layer7-test
make KERNEL_DIR=/usr/src/linux BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man
make install KERNEL_DIR=/usr/src/linux BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man
cd /usr/src/l7-protocols-2007-11-22/
make install
(4)配置内核选项
cd /usr/src/linux
make menuconfig
<M> Layer 7 match support (EXPERIMENTAL)
[*] Layer 7 debugging output
<M> Connections/IP limit match support
(5)开始编译并安装
make
make modules_install
make install
我用QQ比较多:112830911大家学习交流!
[[i] 本帖最后由 andywxb 于 2008-2-15 11:38 编辑 [/i]]
ssffzz1
要在编译模块前先安装iptables。
从rpmfind可能能够下到RH5的完整的源代码包。
ljhb
modinfo 模块看看版本是否和当前版本一致
centos的kernel 的 Makefile 需要修改,
busyant
下面是modinfo出来的结果:
[QUOTE]
# modinfo /lib/modules/2.6.18-8.el5/kernel/net/ipv4/netfilter/ipt_connlimit.ko
filename: /lib/modules/2.6.18-8.el5/kernel/net/ipv4/netfilter/ipt_connlimit.ko
license: GPL
srcversion: E7354AB22D085D35285E9B6
depends: x_tables,ip_conntrack
vermagic: 2.6.18-8.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
[/QUOTE]
我的直接是RHEL 5的,理论上,centos5应该是一样的。
busyant
我重新编译了一遍模块(iptables1.4.0已经安装),还是一样的,提示
iptables: Invalid argument
busyant
问题已解决,nnd,大家想知道怎么回事吗???
我把iptables 1.4.0删除掉,然后
yum install iptables
就好了!!!
oh,shit!!!!
——————————————————————————————————
不过我还是没有弄清楚什么原因,难道是因为我没有升级内核,只是增加了一个模块吗???
iptables,kernel ,netfilter之间到底是个什么关系??
我的理解是:
kernel内嵌了netfilter,所以他们是包含与被包含。
而iptables只是netfilter在user level的修改(调整)工具,iptables与netfilter应该也是有个版本对应关系的,只有对上号的iptables才能修改netfilter。
在我这次修改过程中:
我的kernel并没有升级,所以netfilter的版本也没有变化,所以
使用系统自带的iptables,可以调整netfilter。
升级iptables后,反而不能用了。
______________________________________________________
以上是我的理解,我把系统重做一遍,然后再重新编一次看看。
[[i] 本帖最后由 busyant 于 2008-2-15 14:38 编辑 [/i]]
ssffzz1
你重新安装iptables时。
原来在/lib/iptables里的模块没有清理好。
busyant
[quote]原帖由 [i]ssffzz1[/i] 于 2008-2-15 14:53 发表 [url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6454751&ptid=920595][img]http://linux.chinaunix.net/bbs/images/common/back.gif[/img][/url]
你重新安装iptables时。
原来在/lib/iptables里的模块没有清理好。 [/quote]
大哥能否稍详细讲一讲?
之前我的确没有注意到这个目录。
——————————————————————————————
刚才看了一下:
# ll /lib/iptables/libipt_connlimit.so
-rwxr-xr-x 1 root root 4728 2007-01-07 /lib/iptables/libipt_connlimit.so
说明这个so是yum install iptables的时候装进来的,rpm -qal iptables也证实了这一点。
再看看我新升级的iptables下的libipt_connlimit.so,有一点区别:
# ll /usr/local/lib/iptables_1.4.0/libipt_connlimit.so
-rwxr-xr-x 1 root root 6214 02-15 10:01 /usr/local/lib/iptables_1.4.0_v2/libipt_connlimit.so
———————————————————————————————
我已经晕了,过一会儿再看!!!!
[[i] 本帖最后由 busyant 于 2008-2-15 15:23 编辑 [/i]]
busyant
重装系统后,重新做了一遍增加connlimit模块的操作。结论是:
如果仅仅是增加connlimit模块,不需要重新编译内核,不需要重新编译iptables,甚至iptables都不需要卸载。直接将模块编译出来后,copy到正确的位置就可以使用。
稍后我会将我的编译过程整理好,加上一些简单的注释放上来!
_____________________________________________________
已完成文档,见顶楼,欢迎各位朋友指正!
[[i] 本帖最后由 busyant 于 2008-2-15 18:39 编辑 [/i]]
xokcn
我按照RHEL5不编译内核增加connlimit模块.zip 的操作,
在
----------------
用depmod –a 测试connlimit模块是否兼容
# depmod –a
加载connlimit模块
#modprobe ipt_connlimit
查看是否加载成功
----------------
depmod –a 出现 WARNING: Can't read module –a: No such file or directory
modprobe ipt_connlimit 出现 FATAL: Module ipt_connlimit not found.
请问是怎么的呢/?
rhe5的
busyant
报歉这两天上网不太方便。
我没有碰到这样的情况,也不知道是什么问题,也许和权限之类的有关系,看你具体的应用环境了
xokcn
没关系。通过了。我都不知是怎么的,谢谢提供文档。