在Nginx中進行自簽名,並在應用層L7層級拒絕發往原始IP的HTTP/HTTPS通訊

3 min

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

您好,我是無能。
在這種邊緣運算服務普及的情況下,雖然沒有必要特意使用unbound等方式來意識DNS伺服器來處理某些網域,但對某些人來說,這仍然是必需的。
例如,對於像我這樣自行託管可收發郵件伺服器的人來說,unbound可能會因為OpenDKIM等依賴關係而被引入。
因此,公開的原始IP位址有可能成為DDoS攻擊的漏洞,而且如果被原始IP位址存取,對心理健康不利,所以我決定將其封鎖。

雖然DDoS也可以用Fail2ban來封鎖,但從日誌來看,它似乎是將要封鎖的目標IP位址放入資料庫中進行管理,這樣容易造成負載。如果用Fail2ban來做,就應該以網域為單位。對於平時不使用的原始IP,這次我們將採用另一種方法,在Nginx端保護HTTP/HTTPS通訊。

僅封鎖HTTP通訊的情況

在我的情況下,全球公開IP位址如下,所以會變成這樣。

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

    server_name 167.179.75.206;

    return 444;
}

然而,對於SSL通訊,Nginx需要明確指定為SSL通訊,例如listen 443 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