使用 iptables 阻止默认 IP 上的直接端口 80 访问?

使用 iptables 阻止默认 IP 上的直接端口 80 访问?

我在网站前面使用 nginx 和 cloudflare 来保护它们免受第 7 层攻击,但现在一些攻击者找到了这种新方法,他们每天都直接用第 7 层攻击我的默认 IP,而不是攻击网站。当他们在直接 IP 地址上打开默认页面时,我会向他们返回 444 响应,但攻击仍然太大,所以他们让所有网站/服务器几分钟内不可用,有时甚至更长的时间,具体取决于攻击是否让 Nginx 繁忙。

所以我想问一下,是否有可能在不影响我的其他网站和服务的情况下禁用默认 IP 上的 80 端口访问?这些攻击太大了,以至于我的默认虚拟主机的日志文件在不到 1 小时内就变成了 1GB,所以即使返回 444 也不起作用,这就是为什么我认为在防火墙级别阻止它会更好?

有什么建议可以使用 iptables 来实现这一点吗?

我正在使用带有 Ngiinx 1.13 的 CentOS 6.9。

还有其他想法吗?仍在等待!

答案1

您可以设置 iptables 规则,仅允许 CloudFlare IP 通过端口 80 等访问您的 Nginx 实例。这可以通过首先创建一个ipsetCloudFlare 的 IPv4 范围列表(可从以下网址获取)来实现https://www.cloudflare.com/ips-v4),然后应用适当的 iptables 规则来利用该集合。

类似下面的方法应该可以工作:

ipset -N cloudflare nethash

ipset -q -A cloudflare A.B.C.D/M
... [ repeat above for each entry in CF ips-v4 file ]

iptables -A INPUT -p tcp --dport 80 -m set --match-set cloudflare src -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP

使用 CloudFlare Ray-ID 标头的更多 Nginx 技巧

对于每个前面有 CloudFlare 的站点,您也可以将此技巧应用于 Nginx。它会有效地检查 CloudFlareCF-Ray标头是否存在(采用预期格式)。如果不存在,则返回 444(立即丢弃请求)。

server {
    listen A.B.C.D:80;
    server_name _;
    if ($http_cf_ray !~ '^[0-9a-f]{16}-[A-Z]{3}$') { return 444; }
...

我想您也可以在此时禁用日志记录以进一步减轻任何过多的日志噪音(未经测试):

    if ($http_cf_ray !~ '^[0-9a-f]{16}-[A-Z]{3}$') { access_log off; error_log off; return 444; }

相关内容