外出先からEPGStation@ラズパイ4へ安全にアクセス! リバースプロキシ(nginx)+無料ドメイン(Freenom)+無料SSL(Let’s Encrypt)+無料CDN(cloudflare)+ルータのポート開放(80,443)。これで家の外でもブラウザだけで、テレビの予約&視聴&ダウンロードが出来るようになったので、だいぶ使えるようになった!
chan-toru(ブラウザからnasne予約可能)が7月で終了するので、ラズパイ4のメモリ8GBを買って、録画サーバにしてみた
EPGStationをネットからアクセスさせるだけなら、ルータのポート開放(8888)して、ラズパイのIPへポートフォワーディングすれば、http://家のIPアドレス:8888 でOK
でも、これだと誰でもアクセス出来ちゃう!
EPGStationの標準機能でBasic認証できるけど、SSL無しだとパケット丸見えなのでセキュリティ的に問題ある。
1, nginxインストール + ルータのポート開放(80)
EPGStation自体にもWebサーバ機能はあるけど、リバースプロキシとしてnginx経由の方が楽。
1 2 3 4 5 6 7 |
# インストール sudo apt-get install -y nginx # サーバ起動時に自動起動? sudo systemctl is-enabled nginx # disableなら、自動起動に変更 sudo systemctl enable nginx |
これで家のIPでブラウザからアクセス出来ればWebサーバの設置完了。
2, 無料ドメイン(Freenom)で、ドメインのURLアクセス出来るようにする。
https://www.freenom.com/ja/index.html
適当なドメインを取得して、12ヶ月保持にしておいて、家のIPアドレスをFreenomのDNSに登録。TTLは300(5分)くらいにしておく。
これで、http://自分のドメイン名 で家のラズパイにアクセス出来る。
3, 無料SSL(Let’s Encrypt) + ルータのポート開放(443)
Raspberry Pi(Raspbian Stretch)にNginx+Let’s EncryptでSSLウェブサーバ構築
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 無料SSLの取得プログラムcertbotをインストール sudo apt-get install -y certbot # nginxが立ち上がった状態でネットからアクセスできるようにしてから # ssl証明書を取得 sudo certbot certonly --webroot -w /var/www/html/ -d 自分のドメイン名 # nginxの設定ファイルを新規作成して、SSL証明書をWebサーバに登録 # *.confなら、どんな名前でもOK! sudo vi /etc/nginx/conf.d/a.conf server{ server_name 自分のドメイン名; listen 443 ssl; ssl_certificate /etc/letsencrypt/live/自分のドメイン名/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/自分のドメイン名/privkey.pem; } |
ルータのポート開放(443)とnginx再起動すると、https://自分のドメイン名 で家のラズパイのnginxにアクセス出来る。
無料SSL(Let’s Encrypt) は、3ヶ月で有効期限が切れるので、certbotが12時間毎に確認&更新作業をしてくれるんだけど、nginxは再起動しないと新しいSSL証明書を読み込んでくれないので、ついでに再起動処理を入れておく
1 2 3 4 |
sudo vi /etc/cron.d/certbot # 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew # 末尾に&& systemctl restart nginx.serviceを追加。&&は前のコマンドが正常終了したら実行されるので、SSL証明書が更新されなければ再起動しない? 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew && systemctl restart nginx.service |
4, nginx経由でEPGStationにアクセス(リバースプロキシの設定)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# SSLの設定に追記 sudo vi /etc/nginx/conf.d/a.conf server{ server_name 自分のドメイン名; listen 443 ssl; ssl_certificate /etc/letsencrypt/live/自分のドメイン名/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/自分のドメイン名/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 / { # プロキシ先はEPGStation(同じラズパイ上なのでlocalhostでOK) proxy_pass http://localhost:8888; } } |
これで、https://自分のドメイン名 で家のラズパイのEPGStationにアクセス出来る。
1 2 3 4 |
# 設定ファイルを読み込み sudo systemctl reload nginx # 上手く行かなかったら再起動 sudo systemctl restart nginx |
5, SSL上でEPGStationのBasic認証を設定する
1 2 3 4 5 |
vi ~/EPGStation/config/config.json "basicAuth" : { "user":"aaa", "password" : "bbb" }, |
6, 家は固定IPじゃないので、無料CDN(cloudflare)で、すぐにIPアドレスの変更に対応する。SSHは直IPじゃない駄目になる!
https://www.cloudflare.com/ja-jp/
アカウントを作って、自分のドメイン名を登録する(無料プランで!)
SSL/TLS 暗号化モード: FULL
常に HTTPS を使用: ON
Auto Minify: NONE
Brotli: OFF
freenomの設定画面で、freenomのDNSから、cloudflareのDNSへ変更する。
これで、IP変更が秒で反映される!
cloudflareのAPIを使って、IP変更されたら自動的に更新しようと思ったら…。
https://qiita.com/maron2000/items/834aa44d380f0f1312ce
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 最初にDNSレコードIDが取得 curl -s -X GET "https://api.cloudflare.com/client/v4/zones/自分のゾーンIP/dns_records?name=自分のドメイン名" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 自分のAPI_ID" # 戻り値のDNSレコードIDを使ってIPアドレスを更新 curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/自分のゾーンID/dns_records/取得したDNSレコードID" \ -H "Authorization: Bearer 自分のAPI_ID" \ -H "Content-Type: application/json" \ --data "{\"id\":\"自分のゾーンIDの\",\"type\":\"A\",\"proxied\":false,\"name\":\"自分のドメイン名\",\"content\":\"新しいIPアドレス\"}") # 無料ドメインは駄目らしい…。 "error": "You cannot use this API for domains with a .cf, .ga, .gq, .ml, or .tk TLD (top-level domain). To configure the DNS settings for this domain, use the Cloudflare Dashboard." |
自宅IPが変わったらAPI使って自動更新しようとしたら、無料ドメインは駄目らしい。
まあ、色々と悪用されちゃったみたいだから、しょうがないね。
漫画村で一躍有面になったイメージ。株価はきれいな右肩上がりだから買ってみるかな。
しょうがない、手動でIPアドレス更新しよう。まあルータやモデムを再起動しなければ固定IPだから(苦笑)
ラズパイのグローバルIPを取得するのに、cronで1時間毎にチェックして、dropboxアップロードするシェルスクリプトを組んでみた
これで家の外でもブラウザだけで、テレビの予約&視聴&ダウンロードが出来るようになったので、だいぶ使えるようになった!