LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1288|回复: 26

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

[复制链接]
发表于 2003-5-18 15:01:39 | 显示全部楼层 |阅读模式
首先说说这个现在的无聊小黑客用的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:刚刚开始琢磨这些东西,说的不对的大家不吝指出。
 楼主| 发表于 2003-5-18 15:08:32 | 显示全部楼层
这样设置狠解决问题,有了这个东西之后用攻击软件再攻击,服务器受的影响小很多。

当然还是要加防火墙,具体全部的就不写上了就把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:"
 楼主| 发表于 2003-5-18 15:18:43 | 显示全部楼层
但是问题又来了,这个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。)
 楼主| 发表于 2003-5-18 15:33:57 | 显示全部楼层
如果想要限制每个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。。。
 楼主| 发表于 2003-5-18 15:45:24 | 显示全部楼层
但是,我太喜欢但是了,我们的服务器上面很多都是跑http服务阿。
如果我打开了一个网页,再打开一个,两个同时下载,如果我限制一个ip连一个可就。。。。

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


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

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

这样限制一个ip链接数量比较小就可能不大方便了,但是如果把链接数开大,又和没有限制一样了。这个时候需要作的就是减小time_wait的时间。
 楼主| 发表于 2003-5-18 15:58:28 | 显示全部楼层
要改这个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的值,这些也可以减小服务器被攻击时候的负担。

  1. #define TCP_RETR1       3       /*
  2.                                  * This is how many retries it does before it
  3.                                  * tries to figure out if the gateway is
  4.                                  * down. Minimal RFC value is 3; it corresponds
  5.                                  * to ~3sec-8min depending on RTO.
  6.                                  */

  7. #define TCP_RETR2       10      /*
  8.                                  * This should take at least
  9.                                  * 90 minutes to time out.
  10.                                  * RFC1122 says that the limit is 100 sec.
  11.                                  * 15 is ~13-30min depending on RTO.
  12.                                  */

  13. #define TCP_SYN_RETRIES  3      /* number of times to retry active opening a
  14.                                  * connection: ~180sec is RFC minumum   */

  15. #define TCP_SYNACK_RETRIES 5    /* number of times to retry passive opening a
  16.                                  * connection: ~180sec is RFC minumum   */


  17. #define TCP_ORPHAN_RETRIES 7    /* number of times to retry on an orphaned
  18.                                  * socket. 7 is ~50sec-16min.
  19.                                  */


  20. #define TCP_TIMEWAIT_LEN (15*HZ) /* how long to wait to destroy TIME-WAIT
  21.                                   * state, about 60 seconds     */
  22. #define TCP_FIN_TIMEOUT TCP_TIMEWAIT_LEN
  23.                                  /* BSD style FIN_WAIT2 deadlock breaker.
  24.                                   * It used to be 3min, new value is 60sec,
  25.                                   * to combine FIN-WAIT-2 timeout with
  26.                                   * TIME-WAIT timer.
  27.                                   */
复制代码


好了到此,插播广告,我去编译一下内核先。然后再看看效果。
 楼主| 发表于 2003-5-18 16:46:13 | 显示全部楼层
好了,最后非常成功,iplimit可以有效的限制链接数量,而且time_wait的时间也缩短到了15秒。
发表于 2003-5-18 16:50:29 | 显示全部楼层
我除了最后的TIME——WAIT,都做了
我觉得调TIME WAIT太小了,15秒。
发表于 2003-5-18 16:54:22 | 显示全部楼层
还有,IPLIMIT的连接数,我测试了很久,最后定在8了。我想就算5台一起恶意攻击,也可以撑的住。没必要2吧
还有就是如果是2的话,有些机器就会看不到图片。我想应该是你把连接数限的太少了,个人经验而已,
斑竹多多指教
 楼主| 发表于 2003-5-18 16:55:49 | 显示全部楼层
我想最后设置到30吧。对于一般的http浏览这个值的大小会有多少影响呢。还没有实践过。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表