像大多数服务器一样(我猜),有人试图全天候暴力破解我们的服务。我已将他们的 IP 列入 cpHulk 黑名单,但似乎最好一开始就不要这么做。我和我的主机是唯一通过 80 以外的端口连接到服务器的人,因此我想阻止来自美国以外所有国家/地区的连接,端口 80 除外。我联系了我的主机以进行设置,但他们犹豫不决,因为他们说这会造成异常高的服务器负载。这是一台专用的 Xeon 1230 服务器,配备 32GB RAM,运行 CentOS 6.6 和 iptables。
首先,有什么理由不这样做?其次,我的主机告诉我的是否正确?第三,有没有办法在不影响性能的情况下实现这一点?
答案1
设置特定规则来阻止每个 IP 范围(通过列出每个范围)是错误的方法。
在 iptables 中设置默认规则以丢弃到管理端口的所有流量。然后添加规则以仅允许来自您信任的 IP(您和您的主机)的访问。
默认阻止所有内容,仅允许批准的流量通常称为“明确拒绝所有”,被认为是最佳实践。在这种情况下,也有助于避免主机担心的性能影响。
答案2
为了做到这一点,你必须添加成千上万防火墙规则,每个网络块一条,一个国家可能有与之相关的一到几千个网络块。
当请求到达时,必须进行检查每一条规则,对于几十甚至几百条规则来说,这只需要很少的时间,但是对于您需要使用的规则很多时,(1) 每个请求都会显著变慢,并且 (2) 它会使用大量的 CPU。
实现此目的且不对性能产生重大影响的方法是执行您已经在做的事情:仅阻止那些有问题的特定地址。
答案3
你需要的是一个名为 ipsets 的工具
IP 集是 Linux 内核中的一个框架,可以通过 ipset 实用程序进行管理。根据类型,当前 IP 集可能以某种方式存储 IP 地址、(TCP/UDP) 端口号或 IP 地址与 MAC 地址,从而确保在将条目与集进行匹配时速度极快。
这里要注意的重要一点是它的速度非常快!这是因为大量的 IP 网络可以用一个哈希来表示,而不是数百或数千行 iptables 规则。
对于封锁国家,请参阅此例子:
答案4
如果你希望保留从任何地方连接的能力,而无需维护地理位置黑名单/白名单,你可以实施端口敲击。它会阻止大多数自动尝试,同时允许您从任何地址进行连接。
注意:不要把要敲的端口放在要打开的端口旁边,否则连续的端口扫描将会激活你的规则。