浅谈iptables防SYN Flood攻击和CC攻击

————————本文为自己实践所总结,概念性的东西不全,这里粗劣提下而已,网上很多,本文主要说下目前较流行的syn洪水攻击和cc攻击————————————-

何为syn flood攻击:

SYN Flood是一种广为人知的DoS(拒绝服务攻击)是DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式(TCP协议的缺陷,所以没办法根除,除非重做TCP协议,目前不可能)。

正常原理是:

  1. TCP三次握手,客户端向服务器端发起连接的时候发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号

  2. 服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgment),夹带也发送一个SYN包给客户端,并且服务器分配资源给该连接。

  3. 客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。

syn flood攻击利用TCP三次握手的缺陷,在TCP连接的第三次握手中,当服务器收到客户端的SYN包后并且返回客户端ACK+SYN包,由于客户端是假冒IP,对方永远收不到包且不会回应第三个握手包。导致被攻击服务器保持大量SYN_RECV状态的“半连接”,并且会有重试默认5次回应第二个握手 包,塞满TCP等待连接队列,资源耗尽(CPU满负荷或内存不足),让正常的业务请求连接不进来。通常SYN Flood会和ARP欺骗一起使用,这样就造成了SYN攻击。

何为CC攻击:

CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡(被黑客黑的电脑)向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。CC主要是用来攻击页面的,每个人都有这样的体验:当一个网页访问的人数特别多的时候,打开网页就慢了,CC就是模拟多个用户(多少线程就是多少用户)不停地进行访问那些需要大量数据操作(就是需要大量CPU时间)的页面,造成服务器资源的浪费,CPU长时间处于100%,永远都有处理不完的连接直至就网络拥塞,正常的访问被中止。

攻击检测:

当你发现发服务器很卡,web访问很慢 甚至连SSH操作都开始有点卡的时候,你就要非常注意了。

检测可以这样做:

top 查看CPU使用率和CPU负载情况

负载一般小于CPU核数*0.7算正常,负载内等于或者稍大于核数。说明CPU负载开始严重了,如果超过,说明有问题。

看看哪些程序CPU使用率较高,是否为正常占用,可以使用 pidof 进程名 查看该进程名的所有进程号,然后ll /proc/进程号/exe、fd查看是否为正常信息。

netstat查看端口状态

netstat -n | grep "^tcp" | awk '{print $6}' | sort  | uniq -c | sort -n

1 SYN_RECV

13 FIN_WAIT1

64 TIME_WAIT
149 ESTABLISHED

     
可以查看当前连接状态的数量,从而进行判断。

还有vmstat、sar、等检测命令,网上有使用方法!

Syn Flood 一般的防御:
    
第一种:缩短SYN Timeout时间,由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数,这个值=SYN攻击的频度 x SYN Timeout,所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃改连接的时间。

第二种:设置SYN Cookie,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被丢弃。

(缺陷:缩短SYN Timeout时间仅在对方攻击频度不高的情况下生效,SYN Cookie更依赖于对方使用真实的IP地址,如果攻击者以数万/秒的速度发送SYN报文,同时利用ARP欺骗随机改写IP报文中的源地址,以上的方法将毫无用武之地。)

vim /etc/sysctl.conf

    
增加或者修改如下:(修改保存后记得sysctl -p 使之生效)

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_fin_timeout = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_max_tw_buckets = 6000

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_max_syn_backlog = 262144

net.core.netdev_max_backlog = 262144

net.ipv4.tcp_max_orphans = 262144

net.ipv4.tcp_keepalive_time = 30

iptables性质防御:

限制syn的请求速度(这个方式需要调节一个合理的速度值,不然会影响正常用户的请求)

iptables -N syn-flood   (新建一条链)

iptables -A INPUT -p tcp --syn -j syn-flood 

iptables -A syn-flood  -p tcp -m limit --limit 2/s --limit-burst 50 -j RETURN

iptables -A syn-flood -j DROP

  
Tips:攻击这东西只能防御不能完全根除!只能缓解,降低到最低的风险。有钱可以上第三方公司的产品服务!嘿嘿。

CC攻击一般防御:

  1. 一般而言,CC攻击都是真实的IP,所以一般的做法通俗点就是封IP

  2. 更改web端口,默认CC攻击都是攻击服务器的80端口  

  3. 域名欺骗,我们可以使用cdn等加速工具代理我们的服务器,从而实现防御,(网上有人说把域名解析到127.0.0.1 让攻击者自己攻击自己,不知道有没有用,没试过。而且正式业务,你怎么可能去做这样的解析,那业务怎么办?)

使用抓包命令,抓取访问服务器80的IP数

tcpdump -tnn dst port 80 -c 100 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -n -r |head -20

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
100 packets captured
101 packets received by filter
  0 packets dropped by kernel
78 IP 221.239.28.142
17 IP 124.65.101.82
13 IP 14.123.162.69
 7 IP 183.238.49.188
 7 IP 120.234.19.186

可以看到221.239.28.142的包最多,所以我们进行封IP处理。

iptables -I INPUT -s 221.239.28.142 -j REJECT 

iptabes 其他限制规则:

防御太多DOS攻击连接,可以允许外网每个IP最多15个初始连接,超过的丢弃,第二条是在第一条的基础上允许已经建立的连接和子连接允许

iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP  (--connlimit-mask 32为主机掩码,32即为一个主机ip,也可以是网段)
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

抵御DDOS ,允许外网最多24个初始连接,然后服务器每秒新增12个,访问太多超过的丢弃,第二条是允许服务器内部每秒1个初始连接进行转发

iptables -A INPUT  -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

允许单个IP访问服务器的80端口的最大连接数为 20

iptables -I INPUT -p tcp --dport 80 -m connlimit  --connlimit-above 20 -j REJECT 

对访问本机的22端口进行限制,每个ip每小时只能连接5次,超过的拒接,1小时候重新计算次数

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT

(上面recent规则只适用于默认规则为DROP中,如果要适用默认ACCEPT的规则,需要–set放前面 并且无-j ACCEPT)

CentOS 7安装fail2ban+Firewalld防止SSH爆破与CC攻击

说明:差不多很多博主都会遇到被CC攻击和SSH爆破的情况,这个时候就需要做下防御措施了,前几天发过一个防CC脚本,参考: https://www.moerats.com/archives/484/ ,不过对于CentOS 7来说,由于防火墙的因素,配置起来还是有点麻烦的,这里争对CentOS 7再分享个简单防CC攻击和SSH爆破的方法。

前言

fail2ban可以监视你的系统日志,然后匹配日志的错误信息执行相应的屏蔽动作。网上大部分教程都是关于fail2ban+iptables组合,考虑到CentOS 7已经自带Firewalld,所以这里我们也可以利用fail2ban+Firewalld来防CC攻击和SSH爆破。

本教程编辑文件使用vi命令,如果不会用的,可以使用比较简单的nano,可以参考: https://www.moerats.com/archives/485/ ,或者使用FTP工具,如WinSCP登录VPS操作。

准备工作

1、检查Firewalld是否启用

#如果您已经安装iptables建议先关闭
service iptables stop
#查看Firewalld状态
firewall-cmd --state
#启动firewalld
systemctl start firewalld
#设置开机启动
systemctl enable firewalld.service

启用Firewalld后会禁止所有端口连接,因此请务必放行常用的端口,以免被阻挡在外,以下是放行SSH端口(22)示例,供参考:

#放行22端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
#重载配置
firewall-cmd --reload
#查看已放行端口
firewall-cmd --zone=public --list-ports

2、安装fail2ban

fail2ban可以监控系统日志,并且根据一定规则匹配异常IP后使用Firewalld将其屏蔽,尤其是针对一些爆破/扫描等非常有效。

#CentOS内置源并未包含fail2ban,需要先安装epel源
yum -y install epel-release
#安装fial2ban
yum -y install fail2ban

安装成功后fail2ban配置文件位于/etc/fail2ban,其中jail.conf为主配置文件,相关的匹配规则位于filter.d目录,其它目录/文件一般很少用到,如果需要详细了解可自行搜索。

3、配置规则

新建jail.local来覆盖fail2ban的一些默认规则:

#新建配置
vi /etc/fail2ban/jail.local
#默认配置
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 86400
findtime = 600
maxretry = 5
#这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写
banaction = firewallcmd-ipset
action = %(action_mwl)s

参数说明:

ignoreip:IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔
bantime:屏蔽时间,单位为秒(s)
findtime:时间范围
maxretry:最大次数
banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽端口

防止SSH爆破

如果您还在使用默认SSH端口(22),可能每天都会被扫描,我们可以修改端口尽量避免被扫,参考: https://www.moerats.com/archives/394/ ,或者可以使用fail2ban将恶意IP屏蔽。

继续修改jail.local这个配置文件,在后面追加如下内容:

[sshd]
enabled = true
filter  = sshd
port    = 22
action = %(action_mwl)s
logpath = /var/log/secure

参数说明:

[sshd]:名称,可以随便填写
filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则
port:对应的端口
action:采取的行动
logpath:需要监视的日志路径

到这一步,我们jail.local的规则看起来可能像下面这样子:

[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s

[sshd]
enabled = true
filter  = sshd
port    = 22
action = %(action_mwl)s
logpath = /var/log/secure

上面的配置意思是如果同一个IP,在10分钟内,如果连续超过5次错误,则使用Firewalld将他IP ban了。输入systemctl start fail2ban启动fail2ban来试试效果。

使用另一台服务器不断尝试连接SSH,并且不断的将密码输入错误,你会发现连续超过5次后直接连不上,说明IP被ban了,可以输入:fail2ban-client status sshd查看被ban的IP,如下截图。

未分类

防止CC攻击

这里仅以Nginx为例,使用fail2ban来监视nginx日志,匹配短时间内频繁请求的IP,并使用firewalld将其IP屏蔽,达到CC防护的作用。

#需要先新建一个nginx日志匹配规则
vi /etc/fail2ban/filter.d/nginx-cc.conf
#填写如下内容
[Definition]
failregex =  -.*- .*HTTP/1.* .* .*$
ignoreregex =

继续修改jail.local追加如下内容:

[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log

上面的配置意思是如果在60s内,同一IP达到20次请求,则将其IP ban 1小时,上面只是为了测试,请根据自己的实际情况修改。logpath为nginx日志路径。

防止Wordpress爆破

如果您经常分析日志会发现有大量机器人在扫描wordpress登录页面wp-login.php,虽然对方可能没成功,但是为了避免万一还是将他IP干掉为好。

#需要先新建一个nginx日志匹配规则
vi /etc/fail2ban/filter.d/wordpress.conf
#填写如下内容
[Definition]
failregex = ^ -.* /wp-login.php.* HTTP/1.."
ignoreregex =

继续修改jail.local追加如下内容:

[wordpress]
enabled = true
port = http,https
filter = wordpress
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log

当然,别忘记输入systemctl restart fail2ban重启fail2ban使其生效。

常用命令

#启动
systemctl start fail2ban
#停止
systemctl stop fail2ban
#开机启动
systemctl enable fail2ban
#查看被ban IP,其中sshd为名称,比如上面的[wordpress]
fail2ban-client status sshd
#删除被ban IP
fail2ban-client set sshd delignoreip 192.168.111.111
#查看日志
tail /var/log/fail2ban.log

总结

fail2ban已经内置很多匹配规则,位于filter.d目录下,包含了常见的SSH/FTP/Nginx/Apache等日志匹配,如果都还无法满足您的需求,您也可以自行新建规则来匹配异常IP。使用fail2ban+Firewalld来阻止恶意IP是行之有效的办法,可极大提高服务器安全。

提示:搬瓦工年付$18可换CN2机房的套餐已补货,7机房随意切换,支持支付宝,优惠码:BWH1ZBPVK,购买: https://bwh1.net/cart.php?a=confproduct&i=0

Centos 6设置iptables防火墙,简单防护DDOS和CC攻击

这个教程将向您展示如何在Centos内设置一个简单的防火墙。您可以自定义那个端口开放,那个端口关闭。同时还会展示如何防御一些较为简单的攻击。
当然这个教程只是简单的向您展示防火墙的基本用法 比如 开放Apache,SSH,Email的使用端口
iptables 是一个简单的防火墙,它被安装在大多数的Linux发行版上。iptables官方手册说它仅仅是个ipv4的封包过滤,NAT工具

防御攻击

我们添加几个简单的防御规则来阻止比较简单的攻击,如果我们的服务器收到大规模的攻击,这个防御规则也可以减少大部分的垃圾数据。

iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

这条代码就是如果收到的数据包没有tcp标示的那么就丢弃它们。

iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

这条代码就是如果收到的SYN数据包长时间占用服务器资源,就会自动结束掉他。

iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

同样,添加一个XMAS数据包。

开放端口

仅需开放我们需要开放的端口即可(一定要开放SSH连接端口,否则修改完成之后可能无法连接你的linux)

iptables -A INPUT -p tcp -m tcp --dport 需要开放的端口 -j ACCEPT

完成之后,我们仅需输入命令保存即可

iptables -L -n
iptables-save | sudo tee /etc/sysconfig/iptables

然后再输入命令启动服务即可

service iptables restart