之前一直用l7-filter封堵P2P软件,近日突然发现对emule没有作用了,经过google发现是emule自0.47c开始使用了一种叫“协议迷惑”的技术,加密了包头。下边这段引用自网上的翻译:
[协议迷惑是一个使电骡在于其他客户端或服务器通讯时迷惑或“隐藏”自身协议的特性!没有使用协议迷惑时,每一通电骡连接通讯都有一个固定的格
式,该格式可以让任何服务器辨别此讯息是来自一个电骡发出的数据包。如果本特性被打开后,整个电骡通讯产生的包都会以随机数据的面目出现从而使得自动辨别
很难实现。这将帮助应付目前电骡协议受到的不公待遇甚或被某些网络通过辨别其数据包对其进行的完全封锁。
需重视协议迷惑并不打算做到以下几点:它并不增加你的隐藏性,它既不能使你隐身也无法对付嗅探器。同时如果你的网管拥有合法理由封锁电骡(比如在一个严格的公司网络里),打开本特性可能会给你带来其他不想要的结果。
协议迷惑目前可用于ED2k TCP 和 UDP, Server TCP 和 UDP 还有 Kad TCP 通讯. Kad UDP的迷惑尚未被支持。]
那么如何才能再次封住它呢?可能不久会有高人写出了更好的l7-filter的pattern,但暂时还没有。因此我查了emule的原理,想了一个土办法来封住emule。emule下载的具体原理见http://board.verycd.com/t262133.html。
根据该网页上说emule需要与emule服务器联系上以后才能开始下载,因此只要我们封住了emule服务器的地址,阻止emule客户端与服务器联系就能阻止住。但是emule的服务器有那么多怎么才能封能?嘿嘿,有个老外的网站,专么发布emule的服务器,虽然不可能完全包括,但封了他
的列表以后至少能封住九成。因此我写了个小脚本,自动到http://ed2k.2x4u.de/list.html这个地方取list.html这个网页,然后用shell脚本进行处理,得到那里发布的emule服务器的ip地址列表,然后呢?还用我说吗?当然使用iptables封了!嗬嗬!!!!
下载回来的list.html在linux下看到的是如下的格式:new
SI(0x6d253348,15932,"DonkeyServer No2","www.First-Load.de / quad
opteron 32gb / germany",1225631,305182119,0x3867625,0xfffc5418,0),
其中的0x6d253348就是DonkeyServer No2这个服务器的ip地址的16进制格式,不过是倒的,需要处理一下。
该网站的ip从网页上看是72.51.37.109,而0x6d253348对应的是:
0x6d=109
0x25=37
0x33=51
0x48=72
正好是相反的顺序,而且有这种0x335f13e少了一位的需要在前边补上一个0,变成0x0335f13e形式。
下边是我写的一个处理的脚本,所作的工作是
1、用wget下载list.html
2、用awk和sed提出0x0335f13e这段ip地址的部分
3、然后判断长度,如果是0x335f13e这种形式的需要在前边补0
4、用echo ${string:0:4} 的方式每两位一截,存入变量中
5、用echo $(($digi4))进行16进制-〉10进制转换
6、按照正常ip地址顺序输出到一个临时文件中
7、用sort进行排序
8、最后生成serverlist文件就是得到的ip地址列表。
脚本的代码如下:(水平有限,写得很土,让高人见笑了)
#!/bin/bash
wget http://ed2k.2x4u.de/list.html
if [ "$?" -ne "0" ];then
echo "Get server list fail!"
exit
fi
cat list.html |grep SI|awk ´ { print $2 } ´|sed -e ´s/SI(//g´|awk -F ´,´ ´ { print $1 } ´ > iplist
for string in $( (cat iplist|sort -u) )
do
length=$(expr length $string)
if [ "$length" == "9" ];then
string=$(echo $string|sed -e ´s/0x/0x0/g´)
fi
digi4=$( echo ${string:0:4} )
digi3=$( echo ${string:4:2} )
digi2=$( echo ${string:6:2} )
digi1=$( echo ${string:8:2} )
B104=$( echo $(($digi4)) )
B103=$( echo $((0x$digi3)) )
B102=$( echo $((0x$digi2)) )
B101=$( echo $((0x$digi1)) )
echo $B101´.´$B102´.´$B103´.´$B104 >> ipdddddd
done
sort -n ipdddddd > tmpfile
rm -f ipdddddd
mv tmpfile serverlist
echo "List convert success!"
这个是用上边的serverlist生成iptables命令的脚本:
#!/bin/bash
#Destination: insert user who is allowed to use qq,bt
#Usage: ip2rule ip_file
#Version: 0.1
if [ "$#" == "0" ];then
echo "Usage: $0 ip_file_name"
exit 0
fi
if [ "$1" == "-h" ];then
echo "Usage: $0 ip_file_name"
echo "It will create a new file \"rule\""
exit 0
fi
if [ -e "$1" ];then
cat $1 > tmpfile
cat tmpfile|sed -e ´s/^/iptables -A FORWARD -s /g´ > tmpfile1
cat tmpfile1|sed -e ´s/$/ -j DROP/g´ > tmpfile2
if [ -e rule ];then
rm -f rule
rm -f tmpfile
rm -f tmpfile1
mv tmpfile2 rule
else
rm -f tmpfile
rm -f tmpfile1
mv tmpfile2 rule
fi
else
echo "The ip file $1 is not exist!"
fi