在Nginx中进行自签名,并在应用层(L7)拒绝发往原始IP的HTTP/HTTPS通信

3 min

language: ja bn en es hi pt ru zh-cn zh-tw

你好,我是无能。
在边缘计算服务普及的今天,特意为某些域名配置unbound等DNS服务器可能不是必需的,但对某些人来说,它仍然是必要的。
例如,对于像我这样自托管可收发邮件服务器的人来说,OpenDKIM等依赖项可能会引入unbound
因此,公开的原始IP地址有可能成为DDoS攻击的漏洞,而且直接通过原始IP访问会影响心理健康,所以决定将其阻止。

虽然Fail2ban也能阻止DDoS攻击,但它似乎是通过查看日志并将目标IP地址放入数据库中进行管理的,这容易造成负载。如果使用Fail2ban,最好按域名进行处理。对于平时不使用的原始IP,这次我们将采用另一种方法,在Nginx端保护HTTP/HTTPS通信。

仅阻止HTTP通信的情况

就我而言,全球公开IP地址如下,所以配置如下。

# HTTP通信
server {
    listen 80;
    listen [::]:80;

    server_name 167.179.75.206;

    return 444;
}

然而,对于SSL通信,Nginx需要通过显式指定listen 443 ssl;来表明是SSL通信,从而监听HTTPS。

然后,如果将此配置放入http部分并执行nginx -t,会发生什么呢?

# HTTPS通信
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name 167.179.75.206;

    # 拒绝访问IP地址
    return 444;
}

会发生什么?

# nginx -t
nginx: [emerg] no "ssl_certificate" is defined for the "listen ... ssl" directive in /usr/local/etc/nginx/nginx.conf:90
nginx: configuration file /usr/local/etc/nginx/nginx.conf test failed

没错,因为是SSL通信,所以会因为缺少密钥而报错。
在这种情况下,需要进行自签名……。就像说“是我!是我!”然后说“这是我的证书哦w”一样。我在这里证明我自己……。

那么OpenSSL,能帮上忙吗?

让我们借助OpenSSL的力量,进行这个“自称”的……自签名。
虽然将下一个时代托付给从OpenBSD分支出来的LibreSSL的感觉是不可否认的,但要普及开来还需要相当长的时间。
总之,因为只有我自己使用,所以有效期设为3年。

openssl req -x509 -nodes -days 1095 -newkey rsa:2048 -keyout /usr/local/etc/nginx/selfsigned.key -out /usr/local/etc/nginx/selfsigned.crt

然后,在提示时直接按Enter键不输入任何内容,密钥就会在指定的导出路径生成。

Nginx,现在就来配置

在Nginx中指定这个密钥。

# HTTPS通信
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name 167.179.75.206;

    # 指定自签名证书和私钥
    ssl_certificate /usr/local/etc/nginx/selfsigned.crt;
    ssl_certificate_key /usr/local/etc/nginx/selfsigned.key;

    return 444;
}

这样就搞定了。
结束。

Related Posts