Iptables netstat 防御简单dos攻击
DoS攻击或者DDoS攻击是试图让机器或者网络资源不可用的攻击。这种攻击的攻击目标网站或者服务通常是托管在高防服务器比如银行,信用卡支付网管,甚至根域名服务器,DOS攻击的实施通常迫使目标重启计算机或者消耗资源,使他们不再提供服务或者妨碍用户,访客访问。
在这篇小文章中,你可以知道在受到攻击之后如何在终端中使用netstat命令检查你的服务器。
一些例子和解释
netstat -na
显示所有连接到服务器的活跃的网络连接
netstat -an | grep :80 | sort
只显示连接到80段口的活跃的网络连接,80是http端口,这对于web服务器非常有用,并且对结果排序.对于你从许多的连接中找出单个发动洪水攻击IP非常有用
netstat -n -p|grep SYN_REC | wc -l
这个命令对于在服务器上找出活跃的SYNC_REC非常有用,数量应该很低,最好少于5.
在dos攻击和邮件炸弹,这个数字可能非常高.然而值通常依赖于系统,所以高的值可能平分给另外的服务器.
netstat -n -p | grep SYN_REC | sort -u
列出所有包含的IP地址而不仅仅是计数.
netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'
列出所有不同的IP地址节点发送SYN_REC的连接状态
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
使用netstat命令来计算每个IP地址对服务器的连接数量
netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
列出使用tcp和udp连接到服务器的数目
netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
检查ESTABLISHED连接而不是所有连接,这可以每个ip的连接数
netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
显示并且列出连接到80端口IP地址和连接数.80被用来作为HTTP
如何缓解DDoS攻击
当你发现攻击你服务器的IP你可以使用下面的命令来关闭他们的连接:
iptables -A INPUT 1 -s $IPADRESS -j DROP/REJECT
请注意你必须用你使用netstat命令找到的IP数替换$IPADRESS
在完成以上的命令,使用下面的命令杀掉所有httpd连接,清除你的系统,然后重启httpd服务。
这个链接是iptables的基础用法
以下是iptables的一些扩展应用,主要用于防御各种网络攻击。
1. iptables -m connlimit (连接数量限制)
(注:2.6.23以前的内核版本默认不支持 connlimit)
--connlimit-above n #限制数 >n 时触发规则
--connlimit-upto n #限制数在 n 范围内触发规则
--connlimit-mask n #这组主机的掩码,默认是connlimit-mask 32 ,
对服务器而言就是限制每个ip发起的连接数
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
#允许单个IP对80端口最大连接数为 50,超过即拒绝
或者这样 iptables -I INPUT -p tcp --syn --dport 80 -m connlimit ! --connlimit-above 50 -j ACCEPT
#不超过50个就接受
iptables -A INPUT -p tcp -m multiport --dport 80,443 -m connlimit --connlimit-above 50 -j DROP
#允许单个IP对80、443端口最大连接数为 50,超过即丢弃
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 --connlimit-mask 24 -j REJECT
#允许一段IP 对80端口的新连接最大为100,超过即拒绝
#允许某个ip 222……对服务器最大连接为100,超过拒绝
iptables -I FORWARD -p tcp -s !XXX.XXX.XXX.XXX -m connlimit --connlimit-above 50 -j REJECT
#除xxx外,其它ip最大连接数为50
iptables -A INPUT -s 192.186.1.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#此ip tcp状态为 ESTABLISHED和RELATED 允许通过
2.iptables -m recent (时间范围内限制)
--name #设定列表名称,默认DEFAULT。 --rsource #源地址,此为默认。 --rdest #目的地址 --set #将地址添加进列表,并更新信息,包含地址加入的时间戳。 --rcheck #检查地址是否在列表,以第一个匹配开始计算时间。 --update #和rcheck类似,以最后一个匹配计算时间。每次建立连接都更新列表 --seconds #指定时间内 必须与--update同时使用 --hitcount # 命中次数 必须与--update同时使用 --remove #在列表里删除相应地址,后跟列表名称及地址。 iptables -A INPUT -p tcp --dport 5000 --syn -m recent --remove --name webpool --rsource -j REJECT --reject-with tcp-reset --syn 跟 -m state --state NEW 差不多一个意思,三次握手中的第一个包 iptables -A INPUT -p tcp --dport 80 -m recent --name HTTP_ACCESS --update --seconds 60 --hitcount 100 -j REJECT #限制每IP在一定的时间(比如60秒)内允许新建立最多100个http连接数,超过拒绝 iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH001 #记录访问tcp 22端口的新连接,记录名称为SSH001 #--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目 iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP # 指SSH001记录中的IP,300s内发起超过3次连接则拒绝此IP的连接 iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack" # 300秒内访问22端口达到3次的 ip 记录到日志中
Examples:
# allow 2 telnet connections per client host
iptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
# you can also match the other way around:
iptables -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT
# limit the nr of parallel http requests to 16 per class C sized network (24 bit netmask)
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24
-j REJECT
--limit 流量限制
iptables -A INPUT -m limit --limit 3/hour
为limit match设置最大平均匹配速 率,也就是单位时间内limit match可以匹配几个包。它的形式是一个数值加一个时 间单位,可以是/second /minute /hour /day 。默认值是每小时3次(用户角度),即3/hour ,也就是每20分钟一次(iptables角度)。
--limit-burst 触发条件
单位时间超过5个包后,触发 3个/每分钟 的限制