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

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

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



リバースプロキシサーバーの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のインストールですが、こちらのブログを参考にさせていただきました。
ググるとたくさん出てくるのでここでは割愛します。
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より、
HostName | Type | Content | Target ID |
_acme-challenge | TXT | 取得したキー | 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
以下のブログを参考にしました。


クライアント証明書の作成(必要に応じて)
今回は、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のインストールですが、こちらの記事を参考にさせていただきました。

ここでは、コマンドラインを簡単にまとめておきます。
必要なパッケージをインストール。
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
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_pass | http://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
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_pass | http://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
listen | 3333 ssl 4444 ssl | 外部からアクセスできるポート番号 上:TVRemotePlus 下:Jellyfin |
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_pass | http://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が販売中です。
コメント