如何在 Iptables 中拒绝域名?

如何在 Iptables 中拒绝域名?

我希望我的 Web 服务器拒绝回答对域名的查询。在 Iptables 中,我在 iptables 文件中添加了以下内容:

-A INPUT -p tcp --dport 80 -m string --string "Host: mydomain.example" --algo bm -j REJECT

但是,没有收到拒绝数据包。我从客户端收到超时信息。我希望另一端知道 Web 服务器阻止了此域。

在客户端,现在我得到:

MacBook-Pro-de-nicolas:~ nicolasguerinet$ curl mydomain.example
curl: (56) Recv failure: Operation timed out

我想要一个“连接被拒绝”错误。

答案1

发布 netfilter (“iptables”) 孤立的防火墙规则使得分析问题变得困难,因为防火墙按照规则列出的特定顺序检查流量,而有效行为在很大程度上取决于该顺序。

我想我明白你想要达到的目的,而且我还认为你的方法从根本上是有缺陷的,抱歉。

  1. 大多数Linux防火墙配置有状态的一旦允许连接,该连接上的所有后续流量也将被允许,无需进一步检查。由于 Web 浏览器仅Host:在建立 TCP/IP 连接后才发送 HTTP 协议标头,因此您的规则将永远不适用。

  2. 如果你确实成功地用报头阻止了 TCP 数据包 Host:,那么这就是唯一发生的事情。这对于“另一端需要注意的是,网络服务器会阻止此域名,只是建立的连接突然被终止了。

我认为一个更好的解决方案是为您想要阻止的域名设置一个虚拟主机(或者设置一个默认虚拟主机来处理任何和所有未明确配置的域名的请求)并设置该虚拟主机以生成 Web 浏览器可以理解的 HTTP 错误。这个答案解释了如何使用 Apache 执行此操作,但您可以在 nginx 或其他 Web 服务器中执行类似操作。

相关内容