使用ipset来增强你的防火墙

这几天陆续白嫖了几台甲骨文服务器,替你们薅了几把资本主义羊毛。然后就开始着手折腾服务器防火墙的事宜,主要目的是防GWF毕竟访问的人多越容易被察觉。

安装ipset

yum -y install ipset

创建ipset库

ipset create blanklist hash:ip timeout 86400

上面语句表示创建了一个blanklist库,插入到该库的ip将在86400秒后自动删除。

至于更加深入研究需要自行去探索,搜索关键词:iptables ipset 自动过期 解封

创建防火墙规则

iptables -I INPUT -m comment --comment "黑名单" -m set --match-set blanklist src -j DROP
service iptables save
systemctl reload iptables

上面的语句表示入站方向命中黑名单则丢弃数据包,紧跟其后的语句表示持久化当前iptables规则然后重新加载iptables规则。

iptables视乎对规则有着严格的顺序要求,iptables有着非常复杂的语法规则老徐玩的也不是非常溜,目前只在自己的服务器上能保证命中黑名单就阻断。

老徐在自己的国内服务器部署了Hfish蜜罐系统,结合蜜罐系统提供的数据接口使用Python脚本将IP写入ipset黑名单库即可实现自动拦截恶意端口扫描、若口令攻击等简单的安全需求。

当然老徐只建议一般的个人开发者或者小站长自己拿来玩儿的服务器可以这么干,我们大中华局域网IPv4资源有限,封禁一个公网IP也许一个小区都访问不了你的企业网站,如果你是某企业的运维或安全我权当你没来过。

Python脚本

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import datetime
import json
import os
import time

import requests


def main():
    ip_list = get_ip_list()
    # 创建ipset
    shell("ipset create hfish hash:ip timeout %s -exist" % 86400)
    for ip in ip_list:
        # 将IP添加到ipset
        shell("ipset add hfish -exist %s 2>&1" % ip)


def get_ip_list():
    """
    获取外网攻击IP列表

    :return: IP列表
    """
    url = "https://hfish.tool.xuchengen.cn/api/v1/attack/ip?" \
          "api_key=UperCSJpoxLqGvLCFqbbkNUEuwaLAGTdJKHtMtjLchpaxNoJfoYDPpdrUUKyVqni"

    payload = json.dumps({
        "start_time": get_start_time(),
        "end_time": get_end_time(),
        "intranet": 0
    })

    headers = {
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
    obj = json.loads(response.text)

    if obj["response_code"] == 0:
        return obj["data"]["attack_ip"]

    return list()


def shell(cmd: str) -> str:
    """
    执行shell脚本

    :param cmd: 命令字符串
    :return: 命令执行后响应的字符串
    """

    stdout = os.popen(cmd)
    with stdout as stdout_:
        result: str = str().join(stdout_.readlines())

    return result


def get_start_time():
    """
    获取开始时间戳

    :return: 开始时间戳
    """
    today = datetime.date.today()
    return int(time.mktime(time.strptime(str(today), '%Y-%m-%d'))) - 1


def get_end_time():
    """
    获取结束时间戳

    :return: 结束时间戳
    """
    today = datetime.date.today()
    tomorrow = today + datetime.timedelta(days=1)
    return int(time.mktime(time.strptime(str(tomorrow), '%Y-%m-%d'))) - 1


if __name__ == '__main__':
    main()

上面的Python脚本内置了老徐自己搭建的Hfish蜜罐系统接口,如果你跟老徐一样都是腾讯云北京机房恰巧跟我处于同一IP段那不防试一试,也许能防范不少恶意端口扫描以及弱口令攻击。

对了别忘了把Python脚本加入crontable,建议一分钟一次。