刚刚把上一篇文章iptables NAT+pptp-VPN发布异地位于内网的服务器写完,正准备收工,临时登录到Demo服务器
上去例行检查了一下,差点被登录日志给吓尿了,这台内网的Demo机
通过我VPS
上的iptables
将3389服务
发布出去才几个小时,现在windows事件日志
里面就已经上千条的登录失败审核日志了;典型的3389暴力破解登录攻击;采用密码字典暴力破我的administrator
帐号密码;不知道哪那么多无聊的人,天天就在那不停的扫端口,然后挂字典不停地暴力破,真实无聊至极;administrator
帐号早就被我禁用了;虽然没什么大的风险,但看到不停疯长的登录日志,还是非常不爽;于是就想怎么来防御;
本想直接在这台windows
的Demo
机上进行阻挡这些尝试暴力探测的IP
地址,但发现有些不太现实,因为iptables
发布的关系,在这台Demo
机上看到的尝试登录的来源IP
地址都变成了iptables
的虚拟IP 192.168.0.1;所有到3389连接请求,包含攻击的和正常客户请求的,都是以192.168.0.1
地址来连接的;所以无法按IP
来屏蔽;那么也只能在VPS
上想办法了屏蔽了,iptables
上是能看到所有真实的请求来源IP
地址的;
经过一番查询和研究,终于让我找到了iptables
的一个新的功能特性,可以实现我的需求;
因为是需要在iptables
上控制从Internet
请求的数据包是否允许转发到Demo
机 192.168.0.102
的数据包,所以需要在 filter
表的FORWARD链
中进置规则,
使用iptables
的limit
模块,可以限制数据包在单位时间内通过的数量,超过设定的阀值,数据包将被丢弃;但因为3389的协议在正常连接成功后,传输桌面图形数据,会在一个TCP连接中持续发送大量的数据包,所以不能简单的限制访问3389端口的所有数据包,这样会影响正常的远程桌面操作;
通常暴力破解行为会持续建立多个tcp
连接,并且不停的进行认证和TCP
连接过程;因此可以限制访问3389
端口的TCP
连接中的第一个握手SYN
数据包,一个SYN
包代表一个新的TCP
连接;所以可以限制访问3389端口
的SYN包
在5分钟内只能建立3个连接 ,超过3个连接则判断为在进行暴力破解攻击,从第4个SYN包
开始丢弃掉后面所有的SYN包,禁止建立新的TCP连接;这样就控制了暴力破解的频率,在5分钟内,最多只能建立3次连接,大大降低探测的次数!
我的iptables FORWARD链规则如下:
//记录每一个与3389端口建立新的连接的SYN数据包,记录级别为7 debug级别
#iptables -A FORWARD -p tcp -m tcp -m state --state NEW -m tcp --dport 3389 -j LOG --log-level 7
//匹配所有访问192.168.0.102的3389端口的新连接SYN数据包,并限制5分钟内,最多只能建立3个有效连接
#iptables -A FORWARD -d 192.168.0.102/32 -p tcp -m state --state NEW -m tcp --dport 3389 -m limit --limit 5/min --limit-burst 3 -j ACCEPT
//最后拒绝所有其它未知的转发数据包
#iptables -A FORWARD -j REJECT
好了,现在不仅可以从/var/log/message
日志文件中看到那些访问192.168.0.102
的3389端口的数据包记录了,而且Demo机
那边的登录日志虽然还是产生登录失败的记录,但已经比之前频率降低了好多,差不多都是3~5分钟才出现一条记录!