在学校信息中心做运维的时候弄的,想当年还靠它挣了几百块零花钱(给一个网吧做bt过滤),算是有一定实用价值吧
学校的公网出口近来一直跑满10M,出入都是。抓了一下包,发现BT的包很多(特征码 “BitTorrent protocolex”,peer互连时三握手后{dy}个包数据头),由此判断是BT等点对点通讯占据了流量。于是想架一个软
防火墙,看看能否实现针对点对点流量的过滤。
对freebsd稍微熟悉一些,最初想用ipfw做,但发现特征码过滤它实现不了。或者做流控也能部分地
解决此问题,但想放到以后再做。于是转向linux下的
iptables,它的模块较多,其中的string模块能实现在数据包中搜索匹配指定字符串,应该能实现上述特征码过滤。studyboy跟我说还有一个模块是ipp2p,直接针对p2p流量做七层过滤,更为强大。
拓扑上我是想做成透明二层桥接模式的防火墙,因为这样就不需要更改原
网络设备的配置,直接把防火墙串进出口就好了,出了问题直接撤下来用网线短路回去,也容易恢复。linux 2.6的
内核直接支持桥接模式的iptables,所以我先用了2.6的内核来做,装了FC4。配置好之后,ipp2p的模块可以用,但 string的模块用不起,它好像目前只支持2.4的内核,晕。于是再从装2.4的linux,用的RH9。
装起并
编译内核后,发现桥接
功能跟 iptables各自独立工作都没问题,但就是配合不起来。也就是说,貌似桥接的流量不经过iptables的链。网上查了一下,说果然,2.4的内核做 桥接防火墙要打补丁。于是再下补丁重新编译、配置,完了之后就能正常工作了。单独用iptables的string模块,好像匹配的精度要大一些,流量马 上从跑满的10M降到之前的正常值3、4M,入流量也大于出流量,应该是正常了。就是怕string匹配容易“误杀”,比如哪个
web网 页有上述特征码的内容,就无法显示出来了。当然这种情况应该是绝少。我想,要是string模块要是能再扩展一下,实现包中指定字节偏移量处的匹配就更好 了。再测试 ipp2p模块,我用的{zx1}版本,发现能把流量降到一半,但貌似有漏网之鱼,有些bt连接还是能出去。可能此模块的稳定性还需要再观察。
下面我把linux 2.4内核下的桥接iptables防火墙配置简单说一下,大部分内容是从网上查得拼凑起来,恕不一一标明出处。下面得配置在我的机子上能工作,大家实际用的时候可能要有些许修改,这里只是提供一个步骤:
1.安装linux,不废话了。
2.
下载 linux 2.4内核并打桥接的补丁。我用的是内核2.4.31。
cd /usr/src
wget -nd ::URL::
tar -jxvf linux-2.4.31.tar.bz2
mkdir /opt/down
cd /opt/down
wget -nd ::URL::
gzip -d ebtables-brnf-10_vs_2.4.31.diff.gz
cd /usr/src/linux-2.4.31
patch -p1 < /opt/down/ebtables-brnf-10_vs_2.4.31.diff
3. 下载iptables和POM,打补丁。我用的1.3.1的版本:
cd /opt/down
wget -nd ::URL::
tar -jxvf iptables-1.3.1.tar.bz2
wget -nd ::URL::
tar -jxvf patch-o-matic-ng-20050504.tar.bz2
cd patch-o-matic-ng-20050504
KERNEL_DIR=/usr/src/linux-2.4.31 IPTABLES_DIR=/opt/down/iptables-1.3.1 ./runme base
然后一路y过去,碰到不能打的补丁就n。完了再把string打上:
KERNEL_DIR=/usr/src/linux-2.4.31 IPTABLES_DIR=/opt/down/iptables-1.3.1 ./runme string
ipp2p 的补丁我在这里打上后内核配置里看不到,所以后边另外下载ipp2p的补丁。
4.编译内核。
cd /usr/src/linux-2.4.31
make menuconfig
确认
Prompt for development and/or incomplete code/drivers要选中。然后进入 Networking options,选中802.1d bridge跟下面的ebridge。再进入 IP:Netfilter Configuration,会看到增加很多模块,把你想要的选中“<M>”。保存退出。
make dep
make bzImage
make modules
(我的机子是IBM的Eserver345,用的scsi硬盘,编译内核之后还需要mkinitrd,并在上面内核配置时需要把scsi和mptbase的相关模块编译进来。编译系统是个新手,这里整了好久,郁闷)
5.安装启用新内核。这个不敷述,网上参考资料较多,自己去查。大约是拷贝新内核跟相关文件到/boot下,修改/etc/lilo.conf文件,{zh1}运行lilo更新mbr。
6.重启后安装iptables和 ipp2p模块。
cd /opt/down/iptables-1.3.1
export IPTABLES_DIR=/opt/down/iptables-1.3.1
export KERNEL_DIR=/usr/src/linux-2.4.31
make BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man install
cd /opt/down
wget -nd ::URL::
tar -zxvf ipp2p-0.8.0_rc3.tar.gz
cd ipp2p-0.8.0_rc3
vi Makefile 这里把“IPTABLES_SRC = ”改成iptables所在目录。
make
cp libipt_ipp2p.so /lib/iptables
insmod ipt_ipp2p.o
到这里,测试一下,用“iptables -m ipp2p --help”,如果出现ipp2p模块的正常帮助信息,说明iptables跟ipp2p安装成功。
7.下载安装桥接软件brctl。这个软件是用来在用户空间配置桥接用的。
cd /opt/down
wget -nd ::URL::
tar -zxvf bridge-utils-1.0.6.tar.gz
make install
8. 现在剩下的就是配置了。
A.先配置网桥,我用的eth1和eth0做桥接。
首先建立网桥虚拟接口:
brctl addbr br0
然后向网桥接口中添加物理接口:
ifconfig eth0 0.0.0.0 /*去掉物理接口的IP配置*/
ifconfig eth1 0.0.0.0 /* 去掉物理接口的IP配置*/
ifconfig eth0 up
ifconfig eth1 up
brctl addif br0 eth0
brctl addif br0 eth1
启动网桥接口:
ifconfig br0 up
为了可以远程控制服务器,可以给网桥接口配置IP地址,这里还需要配置返回路由
ifconfig br0 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255
route add default gw x.x.x.x
这时网桥配置搞定,检验一下:
ifconfig br0
br0 Link encap:Ethernet HWaddr 00:0F:20:98:83D
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:826141 errors:0 dropped:0 overruns:0 frame:0
TX packets:9218 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:342118398 (326.2 Mb) TX bytes:1105659 (1.0 Mb)
再 PING一下,确定网桥接口启动。
B.再配置iptables:
先把内核转发打开:
echo 1>/proc /sys/net/ipv4/ip_forward (经测试这一步是多余的,3x daemeon ~)
再启动iptables。注意可能需要把/etc下相关的原iptables的规则去掉,如果有的话。
service iptables start
再加规则就是了。针对string和ipp2p模块的测试很简单的:
iptables -A FORWARD -m string --string "t protocolex" -j REJECT
(我用“BitTorrent protocolex”的字串做特征码,iptables返回说数据包太大,匹配失败,于是改短。不要用 “BitTorrent” 的特征码,这个词组太常见了,容易误杀)
iptables -A FORWARD -m ipp2p --bit --edk -j REJECT
(edk 是电驴)
|