我正在尝试使用 iptables 阻止对我们服务器的所有 autodiscover.xml 请求。我们的服务器上不存在 autodiscover 文件,但由于该网站没有子域,因此请求会到达我们的服务器。这是我到目前为止输入的内容,但它们不起作用。请参阅以下日志。请求不断涌来。
iptables -I INPUT -p tcp --dport 80 -m string --string "POST /autodiscover" --algo bm -j DROP
iptables -I INPUT -p tcp --dport 443 -m string --string "POST /autodiscover" --algo bm -j DROP
这导致 INPUT 链顶部出现以下情况:
DROP tcp -- anywhere anywhere tcp dpt:http STRING match "POST /autodiscover" ALGO name bm TO 65535
DROP tcp -- anywhere anywhere tcp dpt:https STRING match "POST /autodiscover" ALGO name bm TO 65535
但是,我仍然在 Apache 日志中收到请求。
[09/Jan/2020:17:04:31 -0500] "POST /autodiscover/autodiscover.xml HTTP/1.1" 403 3668 "-" "Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.6701; Pro)"
[09/Jan/2020:17:12:59 -0500] "POST /autodiscover/autodiscover.xml HTTP/1.1" 403 3668 "-" "Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.6701; Pro)"
答案1
iptables
是不适合此任务的工具。您假设在 TCP 级别看到的内容与浏览器发送的内容相同,但事实往往并非如此。
最大的例子就是 HTTPS,还有 HTTP/2......更一般地说,你还会发现压缩编码也会在这里起到作用。
另一件会让您的尝试受挫并可能破坏其他流量的事情是连接保持活动。
由于您使用的是 Apache httpd,因此您实际上应该在 httpd 中执行此操作。下面是一个例子,我使用它来防止将此类请求传递到后端(httpd 被用作反向代理),而是将其重定向到其中一个 Exchange 服务器:
ProxyPass /autodiscover/autodiscover.xml !
Redirect 302 /autodiscover/autodiscover.xml https://autodiscover.example.org/autodiscoverer.xml
其他选项是禁止内容。这里我还展示了如果您不想禁止内部客户端,您可以如何结合使用(尽管实际上您可能仍需要支持网络外部的用户)。
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^10\.
RewriteCond %{REQUEST_URI} ^/autodiscover
RewriteRule .* - [F]
另一个示例是仅对请求执行 404 操作(同样,在反向代理环境中)
#
# Deal with some particularly noisy 404s that we don't want to throw back to the
# backend as they can take a long time to process.
#
ProxyPass /autodiscover/autodiscover.xml !
RewriteRule ^/autodiscover/autodiscover.xml$ - [R=404,L]