Posted in

Nginx 反向代理 (Reverse proxy),讓外網訪問更方便

當你的伺服器跑上各種服務後,你又想從外網存取,最土砲的方式就是在路由器的NAT設定Port Forwardding,從映射外部的連接埠到內網伺服器IP的連接埠,但是這樣你還是得記下埠號,像是10000, 8080,這麼做的話會有幾個問題:

  1. 你要死記下這些無特別意義的數字
  2. 別人從外網就能輕易掃描你路由器開放的連接埠,有安全上的風險

想要解決這些困擾,就可以使用反向代理,先來說說他的原理。

原理

當你使用子域名(例如 app.example.com)訪問你的服務時,這個子域名的 DNS 記錄會指向你的主機(通常是同一個 IP)。但不同的是,你的主機上會有一個反向代理服務(例如 Nginx 或 Caddy),它會根據請求中的 Host 標頭(也就是訪問的子域名)來判斷該將流量轉發到哪個內網服務。

也就是說,你其實是連到主機上的反向代理服務,由它幫你把請求轉給內網的服務,這樣內網的服務就不會直接暴露在外網上,比較安全。而你只要記住設定的子域名(像是 app.example.com),就能直接訪問,不用再記那些奇怪的埠號。

示例,從外網訪問兩種不同服務

未使用反向代理,在路由器轉發port 8080, port 5000 :

https://example.com:8080
https://example.com:5000

使用反向代理,只要在路由器轉發443(https預設port 443) :

https://web.example.com
https://blog.example.com

簡潔又安全

在Linux上實作

先安裝Nginx

sudo apt update
sudo apt install nginx

用 Certbot 申請免費 SSL(Let’s Encrypt)

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your.domain.com -d domain.com  #使用-d 可以繼續增加申請的域名(或子域名)

用自己的域名申請,沒有域名可以到dynu申請免費的DDNS域名
https://www.dynu.com/zh-CN/

憑證申請完後,開始配置Nginx設定檔

新建設定檔,我這邊命名vaultwarden

sudo vi /etc/nginx/sites-available/vaultwarden
#監聽80埠並重新導向https加密連線
server {
    listen 80;
    server_name your.domain.com; #設定剛才申請的子網域
    return 301 https://$host$request_uri;
}

#監聽443埠進行反向代理
server {
    listen 443 ssl;
    listen [::]:443; #同時監聽ipv6流量(沒ipv6也無妨)
    server_name your.domain.com; #設定剛才申請的子網域

    ssl_certificate /etc/letsencrypt/live/your.domain.com/fullchain.pem; #憑證預設位置
    ssl_certificate_key /etc/letsencrypt/live/your.domain.com/privkey.pem;

    location / {
        proxy_pass http://localhost:10000; #你的服務的內網IP,不一定是本機
        proxy_set_header Host $host; # 傳遞原始 Host 標頭給後端,讓後端知道訪問的是哪個子域名
        proxy_set_header X-Real-IP $remote_addr; #設定標頭,讓服務主機知道來源的真實IP,而不是反代服務的IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

準備運行Nginx

刪除/etc/nginx/sites-enabled/default這個symlink(類似捷徑)

所有的可運行服務都放在/etc/nginx/sites-available/這個目錄下
裡面有Nginx預設的歡迎頁,但他和我們的80, 443 port衝突,所以我們先停用/etc/nginx/sites-enabled/default

sudo rm /etc/nginx/sites-enabled/default

然後啟用我們的反代服務(從sites-avaiable使用symlink到sites-enables目錄)

sudo ln -s /etc/nginx/sites-available/vaultwarden /etc/nginx/sites-enabled/

接著測試Nginx是否能正常運作

sudo nginx -t

沒出錯的話就重新載入Nginx

sudo systemctl reload nginx

一切正常的話就可以訪問看看

可以正常訪問vaultwarden了🎉🎉🎉

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *