用iptables作桥接防火墙阻截BT流量_自强不息厚德载物_百度空间
在学校信息中心做运维的时候弄的,想当年还靠它挣了几百块零花钱(给一个网吧做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 是电驴)




  • 郑重声明:资讯 【用iptables作桥接防火墙阻截BT流量_自强不息厚德载物_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
    —— 相关资讯 ——