[!已解决!]RHEL5,connlimit模块编译成功,但无法使用(含编译步骤)

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
你都没有给内核打补丁!

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
没关系。通过了。我都不知是怎么的,谢谢提供文档。