スポンサーリンク

ミニPC+Ubuntu+Ngnixでリバースプロキシサーバーを構築してSSL証明書を一元管理する

Ubuntu
スポンサーリンク

現在、我が家にはWebサーバー、NAS、録画サーバー、TV視聴サーバー、メディアサーバーがあり、それぞれがSSLサーバー証明書を管理しており、証明書の管理が煩雑になっています。また、一部のサーバーは自己証明書(オレオレ証明書)をしておりセキュリティー強化も含めてリバースプロキシサーバーを構築して証明書一元管理することにしました。

現状の、構成は以下の図のようになっています。

リバースプロキシサーバーを構築してこのような構成になります。今回はWebサーバー以外をリバースプロキシサーバーを利用します。

リバースプロキシサーバー構築については以下のブログを参考にさせていただきました。ありがとうございます。

Raspberry Pi nginx-wordpressでリバースプロキシを構築 - アラコキからの Raspberry Pi 電子工作
Raspberry Pi Webサーバーの構築 Nginx リバースプロキシ サーバー 1つのグローバルIPで 複数の ドメイン別サーバーに振り分ける   これまで『Raspberry Pi』で、【3つのドメイン別サイト … "Raspbe...
Reverse Proxy SSL証明書の集中管理 - アラコキからの Raspberry Pi 電子工作
Webサーバー サイトの管理 Reverse Proxy サーバーで SSL証明書を集中管理する   リバースプロキシとWebサーバー間も【HTTPS】通信にしていたが、「SSL証明書」の更新に手間がかかるので、リバース … "Revers...
リバプロnginxでクライアント証明書認証

リバースプロキシサーバーのOSとPC選定

サーバーの構築にあたり、選定したOSとPCですが、先ほど参考にしたblogでUbuntu+Ngnixでサーバーを構築していることから同じくUbuntu+Nginxの組み合わせ、PCは現在使用していないGMKtecのミニPC(8GB DDR4+256GB SSD Celeron J4125 最大2.7GHz Mini pc 4K@60Hz)を使用することにしました。

Ubuntuのインストール

Ubuntuのインストールですが、こちらのブログを参考にさせていただきました。

Ubuntu 24.04のインストールガイド
Ubuntu 24.04のインストールでは,公式サイトからメディアを入手し,言語・キーボード設定,ディスクセットアップ,アカウント作成を実施する.インストール完了後,ネットワーク設定とシステム更新で基本環境が完成する.

ググるとたくさん出てくるのでここでは割愛します。

SSLサーバー証明書(Let’s Encrypt)の取得

SSLサーバー証明書(Let’s Encrypt)を取得します。

今回、80ポートと443ポートはWebサーバーで既に使用しているため、DNSチャレンジ認証で取得します。

ドメイン名は、XXXXX.mydns.jp。

certbot certonly --manual -d XXXXX.mydns.jp --preferred-challenges dns 

_acme-challenge キーが表示されます。この時、「Press Enter to Continue

」が表示されるが、Enterを押さないこと。

今回は、MyDNS.Jpでドメインを取得していますので、

MyDNS.Jpのサイトにキーを登録する。

Domain Infoより、

HostNameTypeContentTarget ID
_acme-challengeTXT取得したキーmydnsで始まるID

登録後、反映されているか下記のコマンドで確認する。

nslookup -type=txt _acme-challenge.XXXXX.mydns.jp 8.8.8.8

反映を確認出来たら、Enterキーを押す。

/etc/letsencrypt/live/XXXXX.mydns.jp/ の下に証明書が生成される。(後ほど使用)

証明書の自動更新。cronで自動化。

sudo crontab -e

以下を追加。

# Renew the Let's Encrypt(DNS Authentication) SSL certificates at 3:00 AM on the 1st of every month
00 03 01 * * sudo systemctl stop nginx; sudo certbot renew; sudo systemctl start nginx

以下のブログを参考にしました。

Let’s Encryptを標準外のポートで取得する(DNS)
Ubuntuサーバはローカル内のNASとの兼ね合い上、標準外ポートでアクセスするようになっている。標準外ポート…
UbuntuでLet's Encryptを使用してSSL証明書を作成する方法 - Qiita
Let's EncryptとはLet's Encryptは無料のオープンソースの証明書発行機関で、インターネットセキュリティを強化するために設立されました。ユーザーは簡単にSSL/TLS証明書を取…

クライアント証明書の作成(必要に応じて)

今回は、EMWUI(録画サーバー)とTVRemotePlus(TV視聴サーバー)にクライアント証明書を設定します。これにより証明書を持っていない端末からはアクセスできません。

/etc/nginx/の下に ssh ディレクトリを作成し、ここに証明書を格納します。

cd /etc/nginx
mkkdir ssh
openssl req -new -newkey rsa:2048 -nodes -keyout client.key -out client.crt -x509 -days 3650 -sha256
type client.crt >ssl_peer.pem
openssl pkcs12 -export -inkey client.key -in client.crt -out edcb_key.p12 -name "edcb_key"

ここで生成された「edcb_key.p12」はアクセスするPCで使用します。

※iPhoneへ証明書をインストールするときは、.p12をWindowsへインポートしてから.pfxへエクスポート。

Nginxのインストール

次に、Ngnixのインストールですが、こちらの記事を参考にさせていただきました。

Ubuntu22.04 nginx最新の安定版をインストールする - Qiita
概要2022/08/11現在最新の安定版のバージョンは1.22.0ですが、リポジトリ追加していないUbuntu22.04でsudo apt install nginxを実行すると1.18.0がイン…

ここでは、コマンドラインを簡単にまとめておきます。

必要なパッケージをインストール。

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

リポジトリの追加。

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

Nginxのインストール。

sudo apt update
sudo apt install nginx

起動。

sudo systemctl start nginx
sudo systemctl status nginx

nginxの.confファイルを作成する

リバースプロキシの設定ファイルを作成します。

/etc/nginx/conf.d の下に設定ファイルを作成します。

QNAP NASの設定ファイル(Webdavで使用)。nas.conf

listen1111 ssl外部からアクセスできるポート番号
server_nameXXXXX.mydns.jpドメイン名
ssl_certificate/etc/letsencrypt/live/XXXXX.mydns.jp/fullchain.pemサーバー証明書
ssl_certificate_key/etc/letsencrypt/live/XXXXX.mydns.jp/privkey.pemサーバー証明書
proxy_passhttp://192.168.100.11:1111接続先のIPアドレスとポート番号
server{
listen 1111 ssl;
server_name XXXXX.mydns.jp;
ssl_certificate /etc/letsencrypt/live/XXXXX.mydns.jp/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/XXXXX.mydns.jp/privkey.pem;


proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;



location / {

proxy_pass http://192.168.100.11:1111;
}
}

EMWUI(録画サーバー)の設定ファイル。emwui.conf

listen2222 ssl外部からアクセスできるポート番号
server_nameXXXXX.mydns.jpドメイン名
ssl_certificate/etc/letsencrypt/live/XXXXX.mydns.jp/fullchain.pemサーバー証明書
ssl_certificate_key/etc/letsencrypt/live/XXXXX.mydns.jp/privkey.pemサーバー証明書
ssl_client_certificate /etc/nginx/ssl/ssl_peer.pemクライアント証明書
proxy_passhttp://192.168.100.22:2222接続先のIPアドレスとポート番号
server{
listen 2222 ssl;
server_name XXXXX.mydns.jp;
ssl_certificate /etc/letsencrypt/live/XXXXX.mydns.jp/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/XXXXX.mydns.jp/privkey.pem;
ssl_client_certificate /etc/nginx/ssl/ssl_peer.pem;


proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

ssl_verify_client optional;

location / {
if ($ssl_client_verify != SUCCESS) {
return 403;
}
proxy_pass http://192.168.100.22:2222/;
}
}

TVRemotePlus(TV視聴サーバー)とJellyfin(メディアサーバー)の設定ファイル。jellyfin.conf

listen3333 ssl
4444 ssl
外部からアクセスできるポート番号
上:TVRemotePlus
下:Jellyfin
server_nameXXXXX.mydns.jpドメイン名
ssl_certificate/etc/letsencrypt/live/XXXXX.mydns.jp/fullchain.pemサーバー証明書
ssl_certificate_key/etc/letsencrypt/live/XXXXX.mydns.jp/privkey.pemサーバー証明書
ssl_client_certificate /etc/nginx/ssl/ssl_peer.pemクライアント証明書
proxy_passhttp://192.168.100.33:3333
http://192.168.100.33:4444
接続先のIPアドレスとポート番号
上:TVRemotePlus
下:Jellyfin
server{
#TVRemotePlus設定
listen 3333 ssl;
server_name XXXXX.mydns.jp;
ssl_certificate /etc/letsencrypt/live/XXXXX.mydns.jp/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/XXXXX.mydns.jp/privkey.pem;
ssl_client_certificate /etc/nginx/ssl/ssl_peer.pem;


proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

ssl_verify_client optional;

location / {
if ($ssl_client_verify != SUCCESS) {
return 403;
}
proxy_pass http://192.168.100.33:3333/;
}

#Jellyfinの設定
listen 4444 ssl;
server_name XXXXX.mydns.jp;
ssl_certificate /etc/letsencrypt/live/XXXXX.mydns.jp/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/XXXXX.mydns.jp/privkey.pem;


proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;



location / {

proxy_pass http://192.168.100.33:4444;
}
}

※TVRemotePlusでリバースプロキシを使用する場合は、

「設定」の「リバースプロキシからのアクセス時のみ利用されます」欄にリバースプロキシ元のアドレスを設定してください。ここでは、「https://XXXXX.mydns.jp:3333」

.confファイルの作成が終了たら、nginixのチェック。

 sudo nginx -t

エラーがなくなるまで修正する。

エラーがなくなったらngnixを再起動。

sudo systemctl start nginx

立ち上がっているか確認。

sudo systemctl status nginx

ActiveになっていればOK。

2024/03/29現在、J412は在庫切れ、N150が販売中です。

第12世代インテルTwin Lake-N150 mini pc GMKtec G3 Plusミニpc 最大周波数3.6GHz 4コア/4スレッド DDR4 8GB+256GB SSD /高速2.5G有線LA/WIFI6/BT5.2 TDP 6W 小型pc M.2 2280 NVMe(PCIe3.0)ミニパソコン VESA対応 4K静音性 2画面同時出力 Windows 11 Pro

コメント

タイトルとURLをコピーしました