【问题标题】:iptables drop host domain not in listiptables 删除主机域不在列表中
【发布时间】:2017-08-05 13:05:27
【问题描述】:

我想阻止任何不来自我的 VPC 上托管的网站的流量。

我的服务器的 IP 地址是 1.2.3.4,它托管了 3 个网站。

应允许以下请求:

  • http://example1.com 或 https://www.example1.com
  • http://example2.com/ 或 https://www.example2.com
  • http://example3.com/ 或 https://www.example3.com

应阻止以下请求(包括服务器的 IP 地址):

  • http://1.2.3.4/ 或 https://1.2.3.4/
  • http://anyotherdomain.com/ 或 https://anyotherdomain.com/

可以从文本文件中读取允许的主机名列表,我可以在需要时对其进行更新。

这可行吗?如果是,有什么优点和缺点。如果没有,感谢您提供的信息。

干杯

【问题讨论】:

标签: linux debian iptables


【解决方案1】:

您无法在 iptables 中按照您的意愿执行此操作。 您拥有的不是 3 台真正不同的主机,而是 3 台虚拟主机:正如您已经知道的,主要区别在于它们共享相同的 IP 地址。

由于它们共享相同的 IP,内核的 netfilter 无法区分来自其层的不同请求:它是您的 Web 服务器应用程序本身,通过查看 “主机”将不同的请求“路由”到其正确的网站: " 传入 HTTP 数据包中的标头,并通过确定应由哪个虚拟主机回复它。

对于您想要做的事情,一个很好的折衷方案(拒绝而不是丢弃)是在您的网络服务器中设置一个配置,以使其捕获并拒绝任何不属于您的虚拟主机的连接。此外,无需以这种方式创建不同的列表,因为您的 Web 服务器可以动态地确定请求的主机是否存在。

这是一个示例,假设您正在运行 Apache,将 catchall 语句添加到顶部将使您的服务器以 403 消息响应任何不会被您的示例覆盖的连接。 com 网站:

<VirtualHost *:80>
    ServerName catchall
    <Location />
        Order allow,deny
        Deny from all
    </Location>
</VirtualHost>

<VirtualHost *:80>
    ServerName example1.com
    DocumentRoot /var/www/example1
    <Directory /var/www/example1>
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

...

VirtualHost for example2.com (allowing all as above)

VirtualHost for example3.com (allowing all as above)

这当然与直接从内核中删除不同,但它也会停止与您的服务器的任何进一步交互。

【讨论】:

  • 我目前正在使用 mod_security 进行阻止,并且想知道是否可以更早地阻止它。我明白,这是不可能的。感谢碎片整理和 ceving。
  • 你可以做到,这不是不可能的,它只需要一些编程技能和时间来花费(据我所知,我不知道有这样的程序)而且可能没有不值得一战...您可以尝试使中间件守护进程充当防火墙并在netfilter 之后在端口80上捕获数据包。然后它必须丢弃它们或将它们传递给Apache基于标题中的“主机:”值。
  • 无论如何,这没有多大意义......你可以简单地使用 mod_security 做同样的事情。如果您需要这些安全功能并且不希望 Apache 处理,最好的方法仍然是为不同的主机使用不同的 IP,然后在 IP 层高效工作。
  • 欢呼碎片整理。我现在会坚持使用 mod_security。
猜你喜欢
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 2016-08-25
  • 2022-01-07
相关资源
最近更新 更多