如何阻止独立于服务器特定选项的大范围 IP?

如何阻止独立于服务器特定选项的大范围 IP?

我厌倦了被国际用户不断地探测我的 SSH 服务器的边缘,尽管拒绝主机是管理 SSH 访问的一个良好起点,我决定我想要一些略有不同的东西。

毕竟 - 如果您没有运行 SSH 怎么办?如果您有 Web 或 FTP 服务器怎么办?如果您运行公共 Minecraft 服务器怎么办?如果您正在运行所有这些服务器怎么办?如果您不运行它们,而是使用基于 Linux 的路由器怎么办?Apache 用户可能会考虑使用.htaccess规则进行 Web 访问,这也是一个不错的选择,或者配置modsecurity为永久阻止用户代理字符串,同时mod_evasive暂时阻止滥用 IP(对付蜘蛛和机器人农场相当有用),但难道没有更通用的东西,可以应用于所有潜在的配置和情况吗?

答案1

输入iptables巫师工艺。并非每个 Linux 系统都配置了libwrap,并且hosts.deny并不总是得到咨询,或者如果您的配置出现问题,则会出现意外结果。

系统管理员中存在许多支持或反对的争论tcpwrappers。有人说,没有什么比精细调整来/etc/hosts.deny阻止不良分子更壮观的了,而其他人则说它不再是 90 年代的安全典范,尤其是在黑名单方面。

我不想谈这些——这太像星球大战相对星际迷航争论不休。我只是想让你意识到(如果你还不知道的话)不同的观点。你可以得出自己的结论。

因为denyhosts需要将 ssh 服务器配置为tcp_wrappers启用支持选项,这会让一些管理员感到不舒服(不过我个人并不介意)。而且如前所述,denyhosts如果您没有运行 SSH,这甚至没有任何好处。

那么,我的通用解决方案是什么?很简单。我采用了 Wizcrafts 精心维护的所有黑名单(非常值得 - 他的黑名单是极好的!) 并将它们保存到单个文本文件中,然后编写此 shell 脚本以从列表中过滤掉注释并使用 iptables 阻止来自世界各地的已知违规者的 IP 范围:

#/bin/bash
# |-----------------------------------------------------------------------------------------
# | rangeblock.sh - reads a list of IP ranges, filters non-numeric entries, then configures
# | iptables to block what's left
# | 
# | Maybe it's cutting corners to just check the first character, but iptables will throw
# | out anything it doesn't like anyway, and the loop won't break on errors
# | 
# | Hint: runs best as root
# |-----------------------------------------------------------------------------------------

file="wizcrafts.txt" # Change to a command-line option for more flexibility

while read line; do
    echo " "
    echo "Current Entry: $line"
    if [[ ${line:0:1} == [0-9]* ]]; then        
        echo "$line is a valid IP range. Added to iptables block list."
        iptables -I INPUT -s $line -j DROP
    else
        echo "$line was skipped. Not a valid IP or range."
    fi
done <"$file"

现在,大多数有问题的流量在到达我的 SSH 服务器之前就被丢弃了,并且任何通过的流量都由 处理denyhosts

没有什么是永远 100% 的,这并不能取代智能做法(例如不允许 root 通过 ssh 登录),但它使事情变得更容易处理。

或者至少对我来说是这样的。有趣的副作用——实施后,我的系统和网络性能提高了近 30%。

相关内容