我也直播点东西,跟上形式----服务器抗并发XXX攻击之研究。

由 doooom 在 05-18-2003 15:01 发表:

我也直播点东西,跟上形式----服务器抗并发XXX攻击之研究。

首先说说这个现在的无聊小黑客用的ddos软件。小黑客啥都不懂,不知到啥叫root也可以搞的你服务器瘫痪,就是用这样的xx软件。攻击的方式大概就是给你服务器无数的数据包,直到服务器噎死。但是小黑客们往往没有比服务器还宽的带宽(他们还不能去黑些肉鸡),没等服务器噎死,自己先噎死了。这样他们就用另外一种方式,他们和服务器通信,然后喊你一声就不理你了,你就不断的试着喊他。这样和服务器建立无数的半链接,拖垮服务器。也就是syn攻击。

(这个是我so far的理解,可能还不对,将在今后的直播里面纠正。)

首先怎么对付这样的攻击,打开内核里面的syncookie就可以了具体方法是

当然你的内核要有这个支持,支持了还不行默认是关闭的。

echo "1" > /proc/sys/net/ipv4/tcp_syncookies

这样就打开了支持了,这个syncookie的主要功能就是对付这样的syn flood。

打开这个链接之后,当然还不止,一般的说服务器都跑apache,还要给它加一个抗ddos的补丁

在这里: http://www.networkdweebs.com/stuff/security.html

PS:刚刚开始琢磨这些东西,说的不对的大家不吝指出。


发行版再好,不如自己做的lfs好。


由 doooom 在 05-18-2003 15:08 发表:


这样设置狠解决问题,有了这个东西之后用攻击软件再攻击,服务器受的影响小很多。

当然还是要加防火墙,具体全部的就不写上了就把input的一部分写上。

#################################################3

echo " Set Policies"

$IPT -P INPUT DROP

$IPT -P OUTPUT DROP

$IPT -P FORWARD DROP

###############################################################

echo " User-Specified Chains"

$IPT -N bad_packets

$IPT -N bad_tcp_packets

$IPT -N tcp_inbound

$IPT -N tcp_outbound

##########################################

echo " bad_packets chain"

$IPT -A bad_packets -p ALL -m state --state INVALID -j LOG \

--log-prefix "Invalid packet:"

$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP

$IPT -A bad_packets -p tcp -j bad_tcp_packets

$IPT -A bad_packets -p ALL -j RETURN

#####################################################

echo " bad tcp package"

$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \

--log-prefix "New not syn:"

这句很有意思

$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

$IPT -A bad_tcp_packets -p tcp -j RETURN

#########################################################33

echo " tcp_inbound chain"

HTTP

$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT

HTTPS (Secure Web Server)

$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 443 -j ACCEPT

Email Server (SMTP)

$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 25 \

-m limit --limit 1/second --limit-burst 2 -j ACCEPT

Email Server (POP3)

$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 110 \

-m limit --limit 1/second --limit-burst 2 -j ACCEPT

Email Server (IMAP4)

#$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 143 \

-m limit --limit 1/second --limit-burst 5 -j ACCEPT

sshd

$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT

Not matched, so return so it will be logged

$IPT -A tcp_inbound -p TCP -j RETURN

###############################################################################

INPUT Chain

$IPT -A INPUT -p ALL -i $LO_IFACE -j ACCEPT

$IPT -A INPUT -p ALL -i lo -s 127.0.0.1 -j ACCEPT

$IPT -A INPUT -p ALL -s 192.168.0.0/16 -j DROP

$IPT -A INPUT -p ALL -s 10.0.0.0/8 -j DROP

$IPT -A INPUT -p ALL -s 172.16.0.0/12 -j DROP

$IPT -A INPUT -p ALL -s 127.0.0.0/8 -j DROP

$IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP

$IPT -A INPUT -p UDP -i $INET_IFACE -j DROP

$IPT -A INPUT -p ICMP -i $INET_IFACE -m limit --limit 3/minute \

--limit-burst 5 -j ACCEPT

$IPT -A INPUT -p ICMP -i $INET_IFACE -j DROP

$IPT -A INPUT -p ALL -j bad_packets

$IPT -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED \

-j ACCEPT

$IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound

$IPT -A INPUT -p ALL -d 255.255.255.255 -j DROP

$IPT -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \

--log-prefix "INPUT packet died:"


发行版再好,不如自己做的lfs好。


由 doooom 在 05-18-2003 15:18 发表:


但是问题又来了,这个syncookie有一些安全漏洞, 再开启syncookie的机器上面黑客可以猜测cookie并链接到一个开启没有保护的网路界面上面。( Systems that have syncookies enabled are vulnerable to this attack if an attacker guesses the cookie and can connect to an open, unprotected TCP socket. )

所以这个cookie是最好别用了。

防火墙的脚本看起来挺长但是对上面说到的攻击没有保护。如果一个攻击者开启了一个1000个并发的攻击软件,很快就可以建立无数的established和time_wait和syn链接,服务器很快就不响应了。

( 如果观察链接情况可以用 netstat -n, 不要在开了X的时候看,不然。。。。反正服务器是不用X的。)

所以比较彻底的解决办法就是限制每个IP的链接数量。如果我限制在5个链接,在攻击者不改变IP的情况下就可以有一定效果的遏制攻击了。

( 其实如果它改变IP,实在想不出什么好办法对付so far。)


发行版再好,不如自己做的lfs好。


由 doooom 在 05-18-2003 15:33 发表:


如果想要限制每个IP的并发链接数量,呵呵这个iptables居然不支持。。。。ft。

当然要自己打补丁了,也难乖gentoo上面一个说这个补丁的文章提到:THE #¥@!# LINUX KERNEL IS MISSING。

到iptables的老家netfilter去下载一个叫做patch-o-matric的TARBALL,这个是一套针对内核的netfilter补丁( iptables当然要内核的支持了哦),解开之后执行

XXX# KERNEL_DIR=xxx ./runme pending

这个是增加一套即将增加到内核上面的补丁,可以说是最置顶信赖的。

比如多端口match ( --mport 23:25,54)

然后把 pending 换成 base再打一些补丁,这里的补丁就不都是很知道信赖了。。。。有些还处于开发阶段。但是里面有我们需要的iplimit补丁

其他的都不选就选一个iplimit。这个补丁还是working for the author的呵呵。

暂且相信它了。有了这个补丁之后配和最新的iptables (这个要注意阿,老的不work。)就可以使用 iplimit match了。

比如:

iptables -p tcp --syn --dport 23 -m iplimit --iplimit-above 2 -j DROP

就是限制一个ip只有俩telnet链接。

呵呵有了这个东西之后就好很多了。我给它设置成一个ip连一个,其他都drop。。。


发行版再好,不如自己做的lfs好。


由 doooom 在 05-18-2003 15:45 发表:


但是,我太喜欢但是了,我们的服务器上面很多都是跑http服务阿。

如果我打开了一个网页,再打开一个,两个同时下载,如果我限制一个ip连一个可就。。。。

还有很多人有恶习就是一下子打开无数的文章,然后一个一个看。对这样的人谴责一下。但是即使是在同一个窗口里面浏览也会出现链接两个链接的情况,具体是这样的。

如果我链接一个网页,当然首先是和服务器建立一个链接了然后开始传输,这个时候在服务器上面NETSTAT -N 看到的就是ESTABLISHED的一个链接。

传输完了之后服务器开始断开链接状态变为FIN_WAIT_2,这个时候服务器发给你一个syn包,然后等待回应,如果回应了就断开,但是很多的时候不是这样,而是没有,服务器上面的这个链接变为TIME_WAIT,早期的网路协议里面好象是180秒,那个时候网路比较慢了,多等一回,现在是60秒。

也就是你这个链接在你通信结束之后还要在服务器上面保留60秒至少。这样如果你在这个期间又浏览了网页,服务器上面链接就变成两个了,一个是新的established,一个是老链接的尸体time_wait。

这样限制一个ip链接数量比较小就可能不大方便了,但是如果把链接数开大,又和没有限制一样了。这个时候需要作的就是减小time_wait的时间。


发行版再好,不如自己做的lfs好。


由 doooom 在 05-18-2003 15:58 发表:


要改这个wait的时间可不容易,本来想在/proc目录里面调整一些参数就好了吧,但是没有的调。。。。。看来还要打补丁。

这个时候找到了一个叫ipvs的东西,从gentoo来的,有了这个就可以在/proc/SYS/NET/IPV4/里面多一个VS目录,里面有设置timeout时间的文件。这个东西据说是work,however(我不“但是”了),我试了一下不行,这个说是virtual server用的,也就是cluster里面的东西。我们运气不好里面的timeout_TIMEWAT不是我们要的timeout设置(可能,并不确定是什么)。

这下没有补丁好下载了,看来只好自己作补丁了。卡卡。

仔细研究一下这个google里面的各种文章,最后找到了在内核的 tcp.h 定义了这个timeout值。

用vi打开 linux-2.4.20/include/net/tcp.h

找到 TCP_TIMEWAIT_LEN 这个值,将里面的60改到你想要的东西就好了,我改成了15.。。。哈哈,恐怕太小了,不复合国际标准了。

这个是我改完的代码,出了那个值还改了几个reties的值,这些也可以减小服务器被攻击时候的负担。

> > 源码: >
> * * * >
>
> > > #define TCP_RETR1 3 /*
> > > * This is how many retries it does before it
> > > * tries to figure out if the gateway is
> > > * down. Minimal RFC value is 3; it corresponds
> > > * to ~3sec-8min depending on RTO.
> > > /
> > >
> > > #define TCP_RETR2 10 /

> > > * This should take at least
> > > * 90 minutes to time out.
> > > * RFC1122 says that the limit is 100 sec.
> > > * 15 is ~13-30min depending on RTO.
> > > /
> > >
> > > #define TCP_SYN_RETRIES 3 /
number of times to retry active opening a
> > > * connection: ~180sec is RFC minumum /
> > >
> > > #define TCP_SYNACK_RETRIES 5 /
number of times to retry passive opening a
> > > * connection: ~180sec is RF

Published At
Categories with 服务器类
Tagged with
comments powered by Disqus