服务器封IP段

垃圾留言 – SQL注入

最近公司的网站一直收到来自俄罗斯圣彼得堡的垃圾留言,该留言是在公司的询盘表单页面通过写入代码而试图以SQL注入的方式攻击我们的服务器。

实际上询盘页面的表单在存储到数据库之前是经过验证和纯文本化处理的,所以SQL注入是不会奏效的,让我们忍无可忍的是这种骚扰方式。

因为询盘页面的留言,会以邮件的形式发送到公司领导的邮箱里,进而由领导来统筹安排业务工作。也就是说每一条垃圾留言都会发送到领导邮箱,这种类型的垃圾留言不仅会占用正常的工作时间,很多时候也会影响一个人的情绪。因此对此类不怀好意的访客,就必须作针对性的处理。

Apache 封IP

Apache本身可以通过相关的设置项来封锁特定IP的访问,需要添加deny from ip-address规则,在使用了一段时间以后,发现这种封锁方式缺乏灵活性,因为很多时候攻击者都不是固定IP,而是ADSL动态拨号,每播一次号,他就会的获得一个新的IP地址。而且这种封锁方式只针对apache的web服务进行封锁,如果一个不坏好意的黑客盯上了你,而只封锁web服务,显然是不够的。

由于不可知的原因,我在使用apache配置项封锁垃圾用户时,有些时候这些规则不起作用,不知道是什么原因,由于没有特别多的时间来研究这一块,所以就改用iptables,即系统自带的防火墙来封锁这类用户。

Iptables

iptables是linux自带的防火墙,可以通过定义规则来对来自于某些ip地址的访问来做到封锁和放行,iptables是运行在TCP/IP层的应用,所以针对这类操作效率特别高,而且可以针对端口来定制化封锁,也就是说,不仅可以用来封锁ip对apache服务的访问,也可以用来封锁对sshd,ftp等,这也就是防火墙的强大之处。

连续ip地址到ip段CIDR

这个黑客IP地址来自于俄罗斯圣彼得堡,运营商为Petersburg Internet Network ltd,本着最小化误伤原则,所以我选择对该运行商的整个IP段进行封锁。话说,他应该是比较菜的,一个有经验的黑客至少会选择使用proxy代理来攻击,他要是用了代理,就要增加我的工作量了。

网上搜索了该电信运行商的ip段,大概有十几万个。

通过划分,基本分布在以下IP段。

5.8.0.0/18
5.8.64.0/20
5.8.80.0/21
5.8.88.0/22
5.8.92.0/23
5.8.94.0/24
5.8.95.0/25
5.8.95.128/26
5.8.95.192/27
5.8.95.224/28
5.8.95.240/29
5.8.95.248/30
5.8.95.252/31
5.8.95.254/32
5.101.0.0/16
5.188.0.0/16
5.189.192.0/18
31.44.176.0/20
31.184.192.0/18
37.139.32.0/19
46.161.0.0/18
146.185.192.0/18
188.143.128.0/17

由多个连续的IP地址计算IP段的表示方法,比较复杂,我看了两遍都没有完全理解,所以就找了一个连续ip地址到IP段CIDR的转换工具,可以比较方便的快速转换IP段。

防火墙规则

  1. 使用iptables-save保存目前的配置文件到/etc配置目录,方便以后的管理工作
    iptables-save > /etc/iptables.conf
    
  2. 编辑配置文件添加规则
    # Generated by iptables-save v1.4.21 on Fri Sep 15 11:59:48 2017
    *security
    :INPUT ACCEPT [20133319:2135655181]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [19230211:40949012733]
    COMMIT
    # Completed on Fri Sep 15 11:59:48 2017
    # Generated by iptables-save v1.4.21 on Fri Sep 15 11:59:48 2017
    *raw
    :PREROUTING ACCEPT [20169476:2138079977]
    :OUTPUT ACCEPT [19230211:40949012733]
    COMMIT
    # Completed on Fri Sep 15 11:59:48 2017
    # Generated by iptables-save v1.4.21 on Fri Sep 15 11:59:48 2017
    *nat
    :PREROUTING ACCEPT [1133835:64620787]
    :INPUT ACCEPT [1103001:62861375]
    :OUTPUT ACCEPT [16742:1994771]
    :POSTROUTING ACCEPT [16742:1994771]
    COMMIT
    # Completed on Fri Sep 15 11:59:48 2017
    # Generated by iptables-save v1.4.21 on Fri Sep 15 11:59:48 2017
    *mangle
    :PREROUTING ACCEPT [20169476:2138079977]
    :INPUT ACCEPT [20169474:2138079897]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [19230211:40949012733]
    :POSTROUTING ACCEPT [19230211:40949012733]
    COMMIT
    # Completed on Fri Sep 15 11:59:48 2017
    # Generated by iptables-save v1.4.21 on Fri Sep 15 11:59:48 2017
    *filter
    :INPUT ACCEPT [27869:2482139]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [26342:47499744]
    :f2b-sshd - [0:0]
    :f2b-sshd-ddos - [0:0]
    -A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd-ddos
    -A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
    -A f2b-sshd -s 5.101.40.10/32 -j REJECT --reject-with icmp-port-unreachable
    -A f2b-sshd -j RETURN
    -A f2b-sshd-ddos -j RETURN
    
    # Block all ip address from Russia St. Petersburg
    
    -A INPUT -s 5.8.0.0/18 -j DROP
    -A INPUT -s 5.8.64.0/20 -j DROP
    -A INPUT -s 5.8.80.0/21 -j DROP
    -A INPUT -s 5.8.88.0/22 -j DROP
    -A INPUT -s 5.8.92.0/23 -j DROP
    -A INPUT -s 5.8.94.0/24 -j DROP
    -A INPUT -s 5.8.95.0/25 -j DROP
    -A INPUT -s 5.8.95.128/26 -j DROP
    -A INPUT -s 5.8.95.192/27 -j DROP
    -A INPUT -s 5.8.95.224/28 -j DROP
    -A INPUT -s 5.8.95.240/29 -j DROP
    -A INPUT -s 5.8.95.248/30 -j DROP
    -A INPUT -s 5.8.95.252/31 -j DROP
    -A INPUT -s 5.8.95.254/32 -j DROP
    -A INPUT -s 5.101.0.0/16 -j DROP
    -A INPUT -s 5.188.0.0/16 -j DROP
    -A INPUT -s 5.189.192.0/18 -j DROP
    -A INPUT -s 31.44.176.0/20 -j DROP
    -A INPUT -s 31.184.192.0/18 -j DROP
    -A INPUT -s 37.139.32.0/19 -j DROP
    -A INPUT -s 46.161.0.0/18 -j DROP
    -A INPUT -s 146.185.192.0/18 -j DROP
    -A INPUT -s 188.143.128.0/17 -j DROP
    
    
    COMMIT
    
    
  3. 导入配置使iptables启用规则
    iptables-restore < /etc/iptables.conf
    
  4. 配置网络启动项,使网络运行时就加载该设置

    注意这里和系统启动项还是有区别的,debian系统启动项管理一般是借助init.d和update-rc.d,这里我们主要使用的是/etc/network/if-pre-up.d的网络预加载(姑且这么翻译吧)。

    cd /etc/network/if-pre-up.d
    touch iptables.sh
    

    编辑iptables.sh

    vi iptables.sh
    

    加入以下行

    #!/usr/bin/env bash
    /sbin/iptables-restore < /etc/iptables.conf
    

    添加执行权限 (仅root具有执行权限)

    chmod 700 iptables.sh  
    

以下为2018年02月23日更新。

每次添加完新的规则之后,需要重新应用iptables-restore

另外还需要iptables -L -n
查看规则是否被成功应用

到此,长久以来的被骚扰问题应该算是解决了。具体效果怎样,需要进一步的观察。