我们使用 Apache 2.4 运行CentOS Linux 7.4 版LAMP 堆栈。在监控仪表板上,我跟踪各种性能指标,其中之一是虚拟主机与我们的服务器不匹配的“错误主机请求”。
手动,我使用 arin.net 来查找错误的主机请求。因为我们业务的性质是美国,仅限国内,我们阻止访问我们的外国 IP 范围没有正确的虚拟主机名称。我们使用 iptables 来做到这一点;以下是其中的一个示例,fwiw。
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 187.0.0.0/8 anywhere /* montevideo uruguay */
DROP all -- 177.0.0.0/8 anywhere /* vmontevideo uraguay */
DROP all -- 164.77.0.0/16 anywhere /* montevideo uraguay */
DROP all -- 78-0-0-0.adsl.net.t-com.hr/8 anywhere /* amsterdam */
这对于减缓来自海外的所有“嗅探器”流量非常有效。.
几乎突然间,在过去的两周里,我们开始每天收到 3-6 个请求,这些请求来自伊利诺伊州芝加哥、亚马逊 AWS(华盛顿州西雅图)、弗里蒙特 CA 等。
以下是 apache 的 access_log 中的一些日志条目:
./myurl.com-access.log:23.20.12.111 - - [16/Jan/2018:00:16:21 -0600] "HEAD / HTTP/1.1" 200 - "-" "Cloud mapping experiment. Contact [email protected]"
./myurl.com-access.log:23.20.54.152 - - [16/Jan/2018:08:10:03 -0600] "HEAD / HTTP/1.1" 200 - "-" "Cloud mapping experiment. Contact [email protected]"
./myurl.com-access.log-20180114:23.20.12.111 - - [13/Jan/2018:08:07:44 -0600] "HEAD / HTTP/1.1" 200 - "-" "Cloud mapping experiment. Contact [email protected]"
./myurl.com-ssl-access.log:74.82.47.3 - - [14/Jan/2018:07:20:31 -0600] "GET / HTTP/1.1" 200 21 "-" "-"
./myurl.com-ssl-access.log:108.178.61.58 - - [15/Jan/2018:06:40:17 -0600] "GET / HTTP/1.1" 200 20 "-" "Mozilla/5.0 zgrab/0.x"
./myurl.com-ssl-access.log:184.154.189.90 - - [15/Jan/2018:07:54:29 -0600] "GET / HTTP/1.1" 200 21 "-" "Mozilla/5.0 zgrab/0.x"
./myurl.com-ssl-access.log:108.178.61.58 - - [16/Jan/2018:06:16:45 -0600] "GET / HTTP/1.1" 200 21 "-" "Mozilla/5.0 zgrab/0.x"
./myurl.com-ssl-access.log:184.154.189.90 - - [16/Jan/2018:06:51:18 -0600] "GET / HTTP/1.1" 200 21 "-" "Mozilla/5.0 zgrab/0.x"
./myurl.com-ssl-access.log:74.82.47.3 - - [16/Jan/2018:07:28:43 -0600] "GET / HTTP/1.1" 200 20 "-" "-"
./myurl.com-ssl-access.log-20180114:74.82.47.3 - - [08/Jan/2018:06:25:14 -0600] "GET / HTTP/1.1" 302 - "-" "-"
有哪些方法可以防止(尽可能早地完全阻止)对没有单个正确虚拟主机的服务器的请求?
为了响应fail2ban
可能有帮助的解决方案,我检查了 fail2ban 正在运行:
$ ps aux | grep fail2ban
root 2824 0.0 0.0 368832 53632 ? Sl 2017 17:44 /usr/bin/python2 -s /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid -x -b
我会考虑为它写一条规则——我不能阻止合法的流量——假设没有虚拟主机没有有效的流量会请求主机是否安全(当然,网络应用程序的编写方式需要这个说实话)。
更新
fail2ban 将不起作用,因为它们只使用每个 IP 地址访问服务器一次 - 它们不会重复使用它们。让我声明,我已经有效地识别了网络应用程序第 2 行的流量。现在,我正在向他们发送一个带有随机数的状态 200,非常小,非常快。但我需要一种“隐藏”服务器的方法,以某种方式简单地不以不会给服务器带来任何实际负载的方式进行响应。
好的,fail2ban 不起作用,因为有问题的请求每次都使用不同的 IP 地址。200、403、404响应都需要apache请求占用服务器资源。
意识到我只想“挂断电话”并让 apache 停止与请求者交谈,我发现安装mod_security允许将 apache 配置为丢弃与服务器 ip 的虚拟主机匹配的所有请求。在 centos 7 上安装 mod_security 轻而易举:
然后我将这些行放在虚拟主机指令中,其中 ServerName 是主机 IP 地址:
在 Firefox 中,通过 ip 访问服务器现在看起来像这样:
...祝你好运再试一次!
在服务器日志中,正在记录丢弃:
换句话说,要么你知道我的主机名,要么你可以与禁令交谈
fail2ban有几个规则用于阻止扫描或尝试对服务器做坏事的 IP 地址,
apache
您可以编写自己的规则(例如,匹配 apache 错误日志中的“坏主机请求”)或添加到现有规则中。fail2ban
可用于大多数 Linux 发行版的预打包。我会设置一个新的、全新的、包罗万象的虚拟主机(即,任何与您的真实/配置名称不匹配的名称的默认值)。将自定义 404 错误设置为重定向到 google 或类似的,并且正如其他人在此处提到的那样,设置
fail2ban
为监视该包罗万象的主机的日志。