我厌倦了被国际用户不断地探测我的 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%。