.htaccess 在 HTTP_HOST 为 IP 时阻止访问(安全)

.htaccess 在 HTTP_HOST 为 IP 时阻止访问(安全)

我的服务器遭受过很多攻击。大多数攻击都是从漏洞扫描开始,然后是一波波 POST 请求。

我很快就会实施 Cloudflare(WAF 和 DDos)。这意味着在我的域上进行 DNS 查找将显示 Cloudflare 的 IP 地址,而不是我的服务器。因此,在这方面我的服务器的 IP 地址将被隐藏。

但是,攻击仍然可以通过逐个遍历世界上所有可能的 IP 来发起。当我查看我的服务器日志时,我发现这种情况经常发生。(我的 1 台服务器上绑定了 3 个 IP,完全相同的攻击发生在 XXX.XXX.XXX.XX1、XXX.XXX.XXX.XX2 和 XXX.XXX.XXX.XX3 上)

我的顶级 .htaccess 如下所示:

# deny all POST requests
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_METHOD} POST
    RewriteRule .* - [F,L]
</IfModule>


# deny unused request types
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_METHOD} ^(delete|head|trace|track) [NC]
    RewriteRule .* - [F,L]
</IfModule>


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

问题:

  1. 我应该添加什么以便[如果 HTTP_HOST=XXX.XXX.XXX.XX1 或 HTTP_HOST=XXX.XXX.XXX.XX2 或 HTTP_HOST=XXX.XXX.XXX.XX3]那么交通会立即被阻断吗?

  2. 我可以将此新代码放在 .htaccess 的顶部吗?这会破坏现有的内容吗?

答案1

您无需检查Host标头中是否有特定的 IP,只需检查Host以数字开头的任何 IP。例如,在文件顶部.htaccess

RewriteCond %{HTTP_HOST} ^\d
RewriteRule .* - [F]

您不需要L带有标志F-它是隐含的。

您也不需要额外的<IfModule mod_rewrite.c>包装器。只需保留 WordPress 包装器即可。(尽管这也不是严格要求的。)

但是,这些类型的阻止最好在服务器/虚拟主机级别执行,而不是在.htaccess。配置一个默认值<VirtualHost>来捕获这些不需要的 IP 请求。

例如,假设您只使用基于名称的 VirtualHosts,那么您可以配置一个默认虚拟主机(必须出现在所有其他 VirtualHosts 之前)的形式:

# Catch all other requests for non-specific hosts. eg IP address access
<VirtualHost _default_>
  ServerName default.example.com
  <Location />
  Require all denied
  </Location>
</VirtualHost>

这将捕获所有未映射到任何其他“命名”虚拟主机的请求。_default_只是 的别名*。如上所述,此<VirtualHost>容器必须在服务器配置中,所有其他容器都先于它出现<VirtualHost>。事实上,它被定义为第一的才是它成为“默认”的原因。

ServerName指令应该被定义为除了真实之外的任何东西服务器名称在您的系统上。可以省略,但服务器只会尝试计算它,这可能会不可靠。

这样可以防止您的实际虚拟主机(为您的网站提供服务)处理这些问题其他要求。


# deny all POST requests

这似乎有点极端!我很惊讶你的网站还能用?

相关内容