新世代レンタルサーバーをいち早く体験!
Oneレンタルサーバーβ版が【1年間無料】詳細へ

モバイル回線利用の自宅WEB監視カメラ公開方法

User Note

モバイル回線利用の自宅WEB監視カメラ公開方法

はじめに

一般的な固定回線をプロバイダー契約した場合、IPアドレスは動的であっても DDNS(Dynamic DNS) を利用すれば、ユニークなホスト名をDNSに登録できます。これにより外部からアクセスするときには、そのホスト名を利用して家庭用ルーターに到達し、ルーターのポート転送機能を使って自宅のWEB監視カメラへ接続することが可能です。

では、ホームルーターにモバイルSIMを挿して、モバイル回線を利用する場合はどうでしょうか。
この場合、多くのモバイル回線は キャリアグレードNAT(CGNAT) 環境下にあります。CGNATでは、1つのグローバルIPアドレスを多数の利用者で共有しており、外部からアクセスしてもその通信はキャリア網で止まってしまい、家庭内のルーターや監視カメラまで到達できません。そのため、固定回線のように単純にDDNS+ポート転送で解決することはできません。

CGNATの仕組みをイメージするには、「宅配便」と「共用宅配ボックス」を例にとると理解しやすいです。

  • 固定回線の場合
     家庭ごとに専用の「宅配ボックス(=グローバルIPアドレス)」があり、宅配業者(=外部の利用者)は宛先を指定すれば、直接その家の宅配ボックスに荷物(=通信)を届けられます。
  • モバイル回線(CGNAT)の場合
     大きなマンションに「共用宅配ボックス」が1つしかなく、住人全員でそれを利用しているイメージです。宅配業者が荷物を持ってきても、「どの部屋(=どの利用者)に渡すべきか」が分からないため、建物の入り口にある共用ボックスで止まってしまい、各家庭まで荷物を届けることができません。

つまり、モバイル回線では外から「自分のカメラの宅配ボックスを直接指定する」ことができず、そのままでは接続できないわけです。

この制約を回避する仕組みとして、監視カメラ機器にはP2P接続方式が採用される場合があります。これは、メーカーが用意した中継サーバーを経由して、外部からカメラへ接続する方式です。ただし、この方法にはいくつかの課題があります。

  • 中継サーバーがダウンしたり、サービスが終了すると利用できなくなる。
  • 多人数でサーバーを共用するため通信が遅くなりやすい。
  • 初回接続に数十秒かかることもある。最悪タイムアウトして接続が失敗する。

P2P接続図

そこで本記事では、自前で外部サーバーと自宅サーバーを用意する方法を紹介します。
具体的には次の2つのトンネル接続方式です。

  1. autosshを利用したリバースポートフォワーディング
  2. WireGuardを用いたVPN接続

これらの方法を用いることで、キャリアグレードNAT環境下であっても、自宅のWEB監視カメラに安定して外部からアクセスできるようになります。

トンネル接続図

キャリアグレードNAT(CGNAT)とは?

キャリアグレードNAT(CGNAT)は、インターネットサービスプロバイダ(ISP)がIPv4アドレスの枯渇問題に対処するために用いる大規模なネットワークアドレス変換技術です。

自宅ルーターのNATとキャリアグレードNATの違い

自宅のルーターもNAT(Network Address Translation)機能を持っていますが、これはプライベートIPアドレス(例:192.168.1.x)をグローバルIPアドレスに変換し、複数のデバイスが1つのグローバルIPアドレスを共有してインターネットに接続できるようにするものです。この場合、グローバルIPアドレスは通常、ご家庭に1つ割り当てられています。

一方、キャリアグレードNATは、ISP側で複数の契約者少数のグローバルIPアドレスを共有するために使用されます。これにより、ISPは限られたグローバルIPv4アドレスでより多くのユーザーにサービスを提供できます。自宅ルーターのNATが「家庭内」のIPアドレス変換であるのに対し、CGNは「ISPネットワーク内」のIPアドレス変換だと言えます。

外部から直接アクセスできない理由

CGN環境では、1つのグローバルIPアドレスを複数のユーザーで共有しています。そのため、外部から特定のグローバルIPアドレスにアクセスしようとしても、そのアクセスがどの家庭宛てのものかを特定することができません。自宅ルーターのNATでは、ポートフォワーディングを設定することで特定のポートへのアクセスを特定のデバイスに転送できますが、CGN環境ではこれができないため、外部からの直接アクセスは不可能となります。

ホームルーター+SIMが活きる利用ケース

モバイルSIMとホームルーターを組み合わせて、モバイル回線をインターネット回線として使う場面はいくつか考えられます。

  1. 空き家や実家の見守り用途
    普段は空いている建屋にWEB監視カメラを設置し、外部から様子を確認したい時に有効です。
  2. 離れた倉庫や拠点でのIoT活用
    例えば倉庫や農業施設など、固定回線を引くのが難しい場所にセンサーや制御機器を置く場合、モバイル回線は有効です。専用の固定IP契約に比べて月額料金を安く抑えられ、通信量の制約をあまり気にせず運用できます。
  3. コストを重視したインターネット利用
    単純に「固定回線より安い」という理由で、家庭の常用回線として利用するケースもあります。

空き家や実家の見守り用途での動作環境(機器・環境・運用コスト)

筆者のケースですが、実家玄関先の映像確認に使用しています。前述の「使用例1.空き家や実家の見守り用途」に該当します。この動作環境を記載します。

使用機器・環境

トンネル接続方式(autosshまたはVPN)とし、接続方向はローカルサーバー(自宅サーバー)から外部サーバー(VPSサーバー)とします。

トンネル接続方向

今回使用した機器と環境

機器機種スペックなど消費電力(最大)
ホームルーターdocomo home 5G HR0225W
回線楽天モバイルデータ30GB 
ローカルサーバーMiniPC  (NIPOGI製)MEM:8G  SSD:256G CPU:Intel Core N95
OS:AlmaLinux9
15W
外部サーバーConoHa VPS (by GMO)MEM 1GB
OS:AlmaLinux8
WEB監視カメラVIVOTEK IB9369 6.5W

ワンポイントヒントモバイル回線を使うホームルーターはどれがいいか

監視カメラを設置する建屋内でモバイル回線を利用する場合、最も重要なのは、外部の電波をいかに安定して受信できるかです。特に電波状況が強くない環境では、この安定性が通信全体のパフォーマンスを左右します。

今回の検証では、「docomo home 5G HR02」が非常に優れていました。私の環境での実測値は、下り51.6Mbps、上り10.8Mbpsとなり、監視カメラの映像データだけでなく、インターネット回線としても問題なく利用できる速度でした。

楽天モバイル回線での各ホームルーターの使用感は次のとおりです。

メーカー 機種 回線 回線速度
下り/上り
Mbps
アンテナ数
(機器表示)
評価 使用感
TP-link Archer MR400 4G 4.0/ <1.0 1 × 旧機種の為か回線速度が遅い
UQ Speed Wi-Fi HOME L02 4G 4.0/ <1.0 1 電波を安定して捉えられず回線速度が遅い。
ただし「mineo 1.5Mbpsのマイそく(docomo)」では安定して使えた
アイ・オー・データ機器 UD-LT2 4G 34.4/18.6 3~5 下り速度が比較的速く、クライアント側からのデータ量が多い場合は有効です。またオプションで外部アンテナを付けることができ、電波を拾いやすいようにしています。一般家庭向けの新機種UD-LTAが2025/9から発売されます。(外部アンテナは付けられないようです)
ドコモ docomo home 5G HR02

4G/

5G 

51.6/10.8 4~5 本体に4つのアンテナを4方向に配置しており、最も好条件なアンテナを選択し、常に最適なアンテナによる通信がされます。内部には非公開ですが10本以上のアンテナが入っているようです。

運用コストの目安

ワンポイントヒント運用コスト

本記事で紹介する方法は、普段は無人の建屋などで利用されるケースを想定しており、運用コストが気になる方もいらっしゃるかもしれません。

主な運用コストは、以下の3つです。

電気代:機器類トータルの電気代は、環境や機器によって変動しますが、関西電力の料金を参考にすると、1日あたり約30円、年間では約10,950円となります。
外部サーバー代:外部サーバーとして利用するConoHa VPSなどの費用です。
モバイル回線代:監視カメラが接続するモバイル回線(楽天モバイルなど)の費用です。

筆者の場合は、モバイル回線は以前はmineo 1.5Mbpsのマイそく(月990円、年間11,880円)を使っていました。主に映像のデータ通信だけですので回線速度1.5Mbpsでも十分使用できます。
現在は、楽天グループの株主優待を利用して楽天モバイルを使っており、利用は0円です。外部サーバー(ConoHa VPS)も同様にGMOインターネットグループの株主優待で利用はほぼ0円で運用しています。(※2025/2 GMOインターネットグループの持株会社体制移行に伴い、株主優待制度内容が変更になりました。2025年下期株主優待ではVPSサーバーの優待サービスはなくなりました

トンネル接続方式によるWEB監視カメラ公開方法

方法1:autosshによるリバースポートフォワーディング

ローカルサーバーから外部サーバーのレンタルVPSサーバーにautosshで接続し、そのトンネル接続を利用してWEB監視カメラにアクセスします。今回利用したローカルサーバー、外部サーバーのOSはそれぞれLinux系のAlmalinux9 とAlmalinux8です。

autossh接続図

公開鍵認証によるSSH接続

最初に、ローカルサーバーから外部サーバー(レンタルVPSサーバー)にSSH接続するにあたって公開鍵認証によってパスワードを要求せずに接続を確立するようにします。

鍵ペアの生成:
ローカルサーバー(autosshを実行するマシン)で、SSH鍵ペアを生成します。

# ssh-keygen -t rsa

パスフレーズの入力を求められますが、autosshを自動で動かすには空のままEnterを押してください。これにより、/root/.ssh/id_rsa(秘密鍵)と/root/.ssh/id_rsa.pub(公開鍵)が生成されます。

公開鍵のコピー:
生成した公開鍵(id_rsa.pub)を外部サーバー(www.example.jp)のログインユーザーのauthorized_keysファイルにコピーします。
例はuserになります。

# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

このコマンドを実行すると、一度だけパスワードの入力を求められます。パスワードを入力すると、公開鍵がサーバーに安全にコピーされます。

ローカルサーバーの設定

# sudo autossh -i /home/user/id_rsa -M 0 -o "ExitOnForwardFailure=yes" -o "ServerAliveInterval=60" -C -N -f -R 10000:192.168.10.3:80 [email protected]

オプションパラメータ説明

 -o "ExitOnForwardFailure=yes":

リモートポートフォワーディングの確立に失敗した場合、sshプロセスを終了させます。これにより、autosshが問題を検知して再試行できます。

-o "ServerAliveInterval=60":

SSHセッションがアクティブであるか確認するために、60秒ごとにキープアライブメッセージをサーバーに送信します。これにより、NATやファイアウォールによる接続タイムアウトを防ぎ、接続が切れたことをより早く検知できます。

-R 10000:192.168.10.3:80
リモートポートフォワーディングの設定です。ローカルサーバーから外部サーバーにSSH(port 22)接続後に、外部サーバーはポート10000で待ち受けるように指示されます。

外部サーバー (www.example.jp) の 10000 ポートにアクセスすると、その通信は autossh が確立したSSHトンネルを通って、ローカルネットワークにある 192.168.10.3 の80番ポートにデータ転送されます。

-i /home/proxysv/id_rsa

   公開鍵認証によってパスワード要求せず自動的に接続を確立します。

autosshの自動起動設定

autosshを自動起動するように起動用のファイルssh-tunnel.serviceを作成します。

/etc/systemd/system/ssh-tunnel.service


[Unit]
Description=AutoSSH Tunnel Service
After=network.target

[Service]
User=root
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh \
  -M 0 \
  -N \
  -o "ExitOnForwardFailure=yes" \
  -o "ServerAliveInterval=60" \
  -i /home/user/.ssh/id_rsa  \
  -R 10000:192.168.10.3:80 \
  [email protected]
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

ファイルが生成できたらサービスのリロードと登録を行います。

# sudo systemctl daemon-reload
# sudo systemctl enable --now ssh-tunnel

外部サーバーの設定

WEBサーバーとリバースプロキシを設置します。今回はapacheで実装します。Nginxでも同様に利用できます。

※WEBサーバー apacheはすでに稼働状態である前提とします。

/etc/httpd/conf.d/ssl.conf


<VirtualHost *:443>

  ServerName    www.example.jp

  SSLEngine on
  SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
  SSLCipherSuite EDH+HIGH:HIGH:MEDIUM:!3DES:!ADH:!RC4:!MD5:!aNULL:!eNULL:!LOW:!EXP:!PSK:!SRP:!DSS:!KRB5:!EDH-RSA-DES-CBC3-SHA:!DES-CBC3-SHA:!ECDHE-RSA-WITH-3DES-EDE-CBC-SHA


  SSLCertificateFile      /opt/certs/www.example.jp/cert.pem
  SSLCertificateKeyFile   /opt/certs/www.example.jp/privkey.pem
  SSLCertificateChainFile /opt/certs/www.example.jp/chain.pem

  DocumentRoot /var/www/public_html/www.example.jp/

  <Directory "/var/www/public_html/www.example.jp/">
    Options Includes FollowSymLinks ExecCGI
    AllowOverride All
    Require all granted
  </Directory>

  <Location "/camera1">
     #SSH経由
     ProxyPreserveHost On
     ProxyPass "http://localhost:10000/" timeout=3600 keepalive=On
     ProxyPassReverse "http://localhost:10000/"

     # ストリーミング用設定
     SetEnv proxy-nokeepalive 0
     SetEnv proxy-sendchunked 1

     # ヘッダー設定
     RequestHeader set X-Forwarded-Proto "http"
     RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"

     # Basic認証
     RequestHeader set Authorization "Basic %{ENV:BASIC_AUTH_CREDENTIALS}e"
     #VIVOTEKカメラはデフォルトDigest認証なのでBasic認証に変更すること。
  </Location>
</VirtualHost>

使用したWEB監視カメラ VIVOTEK IB9369はBasic認証がかかっています。
RequestHeader set Authorization "Basic %{ENV:BASIC_AUTH_CREDENTIALS}e"でユーザー、パスワードを自動で渡します。この行がない場合はWEBアクセス時にユーザー、パスワードの入力ダイアログが表示されます。

認証情報であるユーザー:パスワードのBASE64変換を行います。

# echo -n "user:password" | base64
# XXXXXXXXXXXXXX=

systemdサービスファイルbasic-auth.confで環境変数BASIC_AUTH_CREDENTIALSを設定します。/etc/systemd/system/配下にディレクトリhttpd.service.dがない場合は作成してください。
/etc/systemd/system/httpd.service.d/basic-auth.conf

[Service]
Environment="BASIC_AUTH_CREDENTIALS=XXXXXXXXXXXXXX="

ファイルが作成できたらサービスの再起動を行います。

# sudo systemctl restart httpd

これにより、https://www.example.jp は通常のホームページアクセスで、https://www.example.jp/camera1 のアクセスは内部でポート10000にアクセスされ、データはポート10000のトンネルを通って自宅のローカルサーバーへと渡されます。使用したWEB監視カメラ VIVOTEK IB9369は/video1s1.mjpgにアクセスすると動画が参照できます。利用するWEBカメラで動画を参照できるURLはご自分で確認してください。

https://www.example.jp/camera-1/video1s1.mjpgをブラウザーアクセスし動画が表示すればautossh方式でアクセスできています。
外部公開されているURLのhttps://www.example.jp/camera-1/video1s1.mjpgにアクセスすると、実際は自宅(ここでは実家)のローカルサーバーのhttp://192.168.10.3/video1s1.mjpgを参照した結果と同じ表示を得ることができます。

リバースプロキシの良いところのひとつとして、ローカルサーバーのWEBはhttpで公開されていてもそれをデータ暗号化されたhttpsで運用できるところです。

ワンポイントヒントBasic認証とDigest認証について

Basic認証とDigest認証は、ウェブサーバーへのアクセスを保護するためのHTTP認証の方式です。どちらもユーザー名とパスワードをサーバーに送信しますが、その方法に違いがあります。

特徴Basic認証Digest認証
方式Base64エンコードハッシュ(ダイジェスト)化
セキュリティ低い(盗聴リスクあり)Basic認証より高い(パスワードは送信されない)
実装容易複雑
通信HTTP環境では非推奨、HTTPS推奨HTTP環境でもBasic認証よりは安全
パフォーマンス高いハッシュ計算のオーバーヘッドあり

カメラ機器へのWEBアクセスはHTTP認証が施されているのが通常です。ブラウザーでアクセスする場合、ユーザー側はBasic認証とDigest認証の違いは気にすることなくユーザー、パスワード入力画面が表示されてログイン後に画像が参照できます。

リバースプロキシでHTTP認証を自動にする場合は、通常はBasic認証でしか設定できません。Digest認証の場合は失敗します。従ってカメラ機器側でHTTP認証はBasic認証を選択設定しておくことが必要です。

この方法のメリット・デメリット

  • メリット:構築が比較的シンプル、特定のサービス(監視カメラ)のみを公開できる。
  • デメリット:TCPプロトコルに限定される。SSHの設定ミスでセキュリティリスクが発生する可能性がある。

方法2:VPN(WireGuard)による接続

WireGuard VPN接続図

autosshの代わりにWireGuard(VPN)を使うやり方です。ローカルサーバーと外部サーバーでVPN接続するもので、VPN接続が確立されれば外部サーバーとローカルサーバーのみならずローカルのネットワークに接続されている機器も外部サーバーから直接アクセスが可能になります。
両サーバーにWireGuardと必要なネットワークツールをインストールします。

WireGuardモジュールの確認とインストール

モジュールの有無確認

# lsmod | grep wireguard
wireguard 118784 0
ip6_udp_tunnel 16384 1 wireguard
udp_tunnel 36864 1 wireguard
curve25519_x86_64 36864 1 wireguard
libcurve25519_generic 45056 2 curve25519_x86_64,wireguard

wireguardの文字列が表示されればモジュールはすでにインストールされロード済みです。この場合はwireguard-toolsのみインストールします。

modprobeコマンド (ロードされていない場合)

なにも表示されない場合は、モジュールのロードを行います。

# sudo modprobe wireguard

成功した場合は何も表示されずコマンドに戻ります。再度lsmod | grep wireguardを実行し確認してください。
(このコマンドでロードに成功するとサーバーを再起動しても自動的にロードされます。)エラーした場合はkmod-wireguardをインストールします。

WireGuardのインストール

wireguardのモジュールが既に入っている場合

# sudo dnf install wireguard-tools

入っていない場合

# sudo dnf install kmod-wireguard wireguard-tools

ネットワークツールのインストール

# sudo dnf install iproute iptables net-tools

インストールは以上です。次に設定を行います。

鍵の作成(privatekey / publickey)

/etc/wireguard/にwgコマンドでprivatekeyとpublickeyを作成します。

# sudo umask 077
# cd /etc/wireguard/
# sudo wg genkey | sudo tee privatekey
# sudo wg pubkey < privatekey > publickey

WireGuard設定ファイル(wg0.conf)の作成

【外部サーバー側】
/etc/wireguard/に以下の内容のwg0.confを作成します。


[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
#自身の秘密鍵内容
PrivateKey = xxxxxxxxxxxxHCBLSNXMpp+lc=

# パケット転送、MASQUERADEを有効化、ネットワークインターフェース例enp1s0
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE

[Peer]
# 自宅サーバーの公開鍵内容
PublicKey = XXXXXXXXXXXXXXXXXXXXXg8/u+/eq1KxdDRi4=
#自宅サーバーのVPN IPとローカルネットワーク
AllowedIPs = 10.0.0.2/32, 192.168.10.0/24
PersistentKeepalive = 25

【自宅サーバー側】
/etc/wireguard/に自宅サーバー用として以下の内容のwg0.confを作成します。


[Interface]

Address = 10.0.0.2/24
#自身の秘密鍵内容
PrivateKey = XXXXXXXXXXXXXXXe0zyn0wTiLmJZlNtUnLFs=
# パケット転送、MASQUERADEを有効化、ネットワークインターフェース例eno1
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eno1 -j MASQUERADE

[Peer]

# 外部サーバーの公開鍵内容
PublicKey = XXXXXXXXXXXXXXXO0TMkTm3IDZVk8=
Endpoint = 58.12.XXX.XXX:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25

ファイアウォール設定(外部サーバー側)

外部サーバーでWireGuard用ポート開放します。

# sudo firewall-cmd --permanent --add-port=51820/udp
# sudo firewall-cmd --reload

接続方向は常にローカルサーバーから外部サーバーです。ファイアウォールはVPNで使用するUDPポート 51820を開けますが、開けるのは外部サーバーだけです。    

WireGuardの起動と動作確認

両サーバーでサービスを登録して起動させます。

# systemctl enable wg-quick@wg0
# systemctl start wg-quick@wg0

状態確認して動作しているかwgコマンドで確認します。

# systemctl status wg-quick@wg0

# wg show
interface: wg0
public key:XXXXXXXXXXXXXX0TMkTm3IDZVk8=
private key: (hidden)
listening port: 51820

peer: XXXXXXXXXXXXg8/u+/eq1KxdDRi4=
endpoint: 58.12.xx.xxx:57243
allowed ips: 10.0.0.2/32, 192.168.10.0/24
latest handshake: 1 minute, 20 seconds ago
transfer: 147.48 KiB received, 1.39 MiB sent
persistent keepalive: every 25 seconds

interface: wg0
  public key:XXXXXXXXXXXXXX0TMkTm3IDZVk8=
  private key: (hidden)
  listening port: 51820

peer: XXXXXXXXXXXXg8/u+/eq1KxdDRi4=
  endpoint: 58.12.xx.xxx:57243
  allowed ips: 10.0.0.2/32, 192.168.10.0/24
  latest handshake: 1 minute, 20 seconds ago
  transfer: 147.48 KiB received, 1.39 MiB sent
  persistent keepalive: every 25 seconds

WireGuardの動作ログ取得

このままだと動作内容が不明ですので、Dynamic debugを有効化してsyslogでログを取得できるようにします。
WireGuardのログ出力は本番では冗長になりがちなので、検証後はDynamic debugを無効化推奨します。

# echo 'module wireguard +p' | sudo tee /sys/kernel/debug/dynamic_debug/control
# echo 'kern.debug /var/log/kernel' | sudo tee /etc/rsyslog.d/50-kernel.conf
# sudo systemctl restart rsyslog  

ログ出力内容の確認

# tail /var/log/kernel
Sep 9 14:53:29 sx kernel: wireguard: wg0: Sending handshake initiation to peer 2 (58.12.xx.xx:51820)
Sep 9 14:53:29 sx kernel: wireguard: wg0: Receiving handshake response from peer 2 (58.12.xx.xx:51820)
Sep 9 14:53:29 sx kernel: wireguard: wg0: Keypair 8894 destroyed for peer 2
Sep 9 14:53:29 sx kernel: wireguard: wg0: Keypair 8896 created for peer 2
.
.

以上で外部サーバーとローカルサーバーはVPNの設定と接続が完了しました。試しに、外部サーバーからローカルサーバーのカメラにpingを打ってみましょう。応答があれば正しくルーティングができています。

ルーティング設定の確認

# ip route show
default via 58.12.xxx.xxx dev eth0
10.0.0.0/24 dev wg0 proto kernel scope link src 10.0.0.1
58.12.XXX.0/22 dev eth0 proto kernel scope link src 58.12.XXX.XXX
192.168.10.0/24 dev wg0 scope link


ローカルサーバーのルーティング状況

# ip route show
default via 192.168.10.1 dev eno1 proto static metric 100
10.0.0.0/24 dev wg0 proto kernel scope link src 10.0.0.2
192.168.10.0/24 dev eno1 proto kernel scope link src 192.168.10.73 metric 10

ルーティングおよびSNAT (Source NAT) に必要なMASQUERADE設定はWireGuardの設定ファイル中に書きましたのでWireGuardが起動時自動的にルーティング設定などをします。

外部サーバーのWebサーバー設定

VPN接続が完了して外部サーバーからローカルサーバーおよび監視カメラにアクセスできるようになりましたが、外部からWEBアクセスで参照できるようにautosshと同様にWEBサーバーとリバースプロキシを設置します。

autosshの方式も比較して使えるように  VPN接続では<Location "/camera2">を追加します。

/etc/httpd/conf.d/ssl.conf


<VirtualHost *:443>

  ServerName    www.example.jp

  SSLEngine on
  SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
  SSLCipherSuite EDH+HIGH:HIGH:MEDIUM:!3DES:!ADH:!RC4:!MD5:!aNULL:!eNULL:!LOW:!EXP:!PSK:!SRP:!DSS:!KRB5:!EDH-RSA-DES-CBC3-SHA:!DES-CBC3-SHA:!ECDHE-RSA-WITH-3DES-EDE-CBC-SHA


  SSLCertificateFile      /opt/certs/www.example.jp/cert.pem
  SSLCertificateKeyFile   /opt/certs/www.example.jp/privkey.pem
  SSLCertificateChainFile /opt/certs/www.example.jp/chain.pem

  DocumentRoot  /var/www/public_html/www.example.jp/

  <Directory "/var/www/public_html/www.example.jp/">
    Options Includes FollowSymLinks ExecCGI
    AllowOverride All
    Require all granted
  </Directory>

  <Location "/camera1">
     #SSH経由
     ProxyPreserveHost On
     ProxyPass "http://localhost:10000/" timeout=3600 keepalive=On
     ProxyPassReverse "http://localhost:10000/"

     # ストリーミング用設定
     SetEnv proxy-nokeepalive 0
     SetEnv proxy-sendchunked 1

     # ヘッダー設定
     RequestHeader set X-Forwarded-Proto "http"
     RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"

     # Basic認証
     RequestHeader set Authorization "Basic %{ENV:BASIC_AUTH_CREDENTIALS}e"
     #VIVOTEKカメラはデフォルトDigest認証なのでBasic認証に変更すること。
  </Location>
  <Location "/camera2">
     #VPN経由
     ProxyPreserveHost On
     ProxyPass "http://192.168.10.3/" timeout=3600 keepalive=On
     ProxyPassReverse "http://192.168.10.3/"

     # ストリーミング用設定
     SetEnv proxy-nokeepalive 0
     SetEnv proxy-sendchunked 1

     # ヘッダー設定
     RequestHeader set X-Forwarded-Proto "http"
     RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"

     # Basic認証
     RequestHeader set Authorization "Basic %{ENV:BASIC_AUTH_CREDENTIALS}e"

  </Location>
</VirtualHost>

 VPN接続では外部サーバーから直接自宅のWEBカメラにアクセスが可能なので、ProxyPass, ProxyPassReverseは自宅WEBカメラのローカルIPアドレスを指定します。

https://www.example.jp/camera-2/video1s1.mjpgをブラウザーアクセスし、動画が表示すればVPN接続方式でアクセスできています。

メリット・デメリット

  • メリット:通信の全体を暗号化できるため高セキュリティ、高速かつ安定した接続が可能。
  • デメリット:autosshに比べて設定が複雑になりがち。

両方のアクセス比較

実際どちらかの方法で外部からアクセスして監視することになりますが、ここでは比較のために両方同時にWEBアクセスしてみたいと思います。ブラウザーを2枚立ち上げればいいのですが、サーバー側で2方式のURLを表示するhtmlを作成して表示してみます。https://www.example.jp/video2.html

video2.html


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>NAT Traversal Camera Monitor</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            min-height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
        }
        h1 {
            color: #333;
        }
        .video-container {
            display: flex;
            flex-wrap: wrap;
            justify-content: center;
            gap: 20px;
            padding: 20px;
        }
        .video-wrapper {
            position: relative;
            border: 2px solid #333;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
            width: 640px;
            height: auto;
        }
        .video-feed {
            display: block;
            width: 100%;
            height: auto;
        }
        .overlay-text {
            position: absolute;
            top: 20px;
            left: 10px;
            background-color: rgba(0, 0, 0, 0.6);
            color: white;
            padding: 5px 10px;
            font-size: 1.1em;
            font-weight: bold;
            border-radius: 5px;
            z-index: 10;
        }
        .blur-overlay {
            position: absolute;
            top: 125px;
            left: 55px;
            width: 220px;
            height: 180px;
            background-color: rgba(0, 0, 0, 0.5); 
            z-index: 5;
        }
    </style>
</head>
<body>

    <h1>NAT Traversal Camera Monitor</h1>
    <div class="video-container">
        <div class="video-wrapper">
            <img id="camera1" class="video-feed" src="https://www.example.jp/camera1/video1s1.mjpg" alt="カメラ1" width="640">
            <div class="overlay-text">ssh(autossh)</div>
            <div class="blur-overlay"></div>
        </div>
        <div class="video-wrapper">
            <img id="camera2" class="video-feed" src="https://www.example.jp/camera2/video1s1.mjpg" alt="カメラ2" width="640">
            <div class="overlay-text">vpn(wireguard)</div>
            <div class="blur-overlay"></div>
        </div>
    </div>

</body>
</html>

性能比較:autosshとWireGuard

解像度によるパフォーマンスの差異

カメラの動画サイズが640 x 320pxのような低解像度では、autosshとWireGuardの両方式で、体感上のパフォーマンスに大きな差は見られませんでした。どちらの方式でも、スムーズな映像を確認できます。
カメラ映像

しかし、1920 x 1080pxの高解像度では、両者の特性が顕著に現れました。

autossh(TCP): カメラが映像に表示する時計が、遅延と回復を繰り返す現象が見られました。これは、TCP接続がデータの一貫性を保証するために、パケットが欠損した場合に再送処理を行う特性によるものです。その結果、Webサーバー側でキャッシュが一時的に溜まり、映像の遅延が発生していると考えられます。

WireGuard(UDP): UDP接続はパケットの再送を行わないため、映像中の時計はリアルタイムに追従しました。

フレームレートと動きの滑らかさ
興味深いことに、車両などの移動物体を撮影した場合、autosshの方がWireGuardよりもフレーム抜けが少ないという結果になりました。これは、TCPが確実にパケットを届ける特性が、映像の滑らかさを保つ上で有効に働いたためと考えられます。

結論:どちらを選ぶべきか

高解像度で短い時間だけ映像を確認する場合や、フレーム抜けを極力避けたい場合は、autosshが適しています。高解像度で長時間の連続視聴を想定し、リアルタイム性を重視するなら、WireGuardのVPN方式がおすすめです。
補足として、VPNの種類にはTCPを利用するものも存在し、その場合は本記事で述べたUDP接続とは異なる結果となる可能性があることを付け加えておきます。

ワンポイントヒントキャリアグレードNAT環境下でセッションが維持される理由

キャリアグレードNAT(CGNAT)環境下では、複数のユーザーがグローバルIPアドレスを共有しているため、外部から直接自宅の監視カメラにアクセスすることはできません。しかし、一度確立された通信セッションは維持されることがあります。これは、NAT(Network Address Translation)の動的マッピング機能によるものです。

通信が開始されると、NATデバイス(この場合はISP側のCGN機器)は、送信元IPアドレスとポート番号のペア割り当てられたグローバルIPアドレスとポート番号のペアに一時的に関連付けます。この関連付け情報はNATテーブルとして記録されます。

通信が順調に進んでいる間、このNATテーブルの情報は保持されます。外部からの応答パケットが戻ってくると、NATデバイスはこのテーブルを参照し、どのローカルデバイス(監視カメラ)にパケットを転送すべきかを判断します。

たとえ、接続のたびにグローバルIPアドレスやポート番号が変わったとしても、既存のセッションがアクティブである限り、NATテーブルに対応する情報が残っているため、通信は継続されます。

しかし、新たに外部から接続を開始しようとする場合は、その時点のNATテーブルに該当するエントリが存在しないため、接続を確立できません。これが、CGNAT環境下で外部からの直接アクセスができない根本的な理由となります。トンネル接続方式は、この「後から接続を開始できない」という制約を回避し、自宅側から外部サーバーへ「常に接続を維持しておく」ことで、外部からのアクセスを可能にしています。

まとめ

本記事では、キャリアグレードNAT(CGNAT)環境下という制約があるモバイル回線で、自宅のウェブ監視カメラを外部に公開するための具体的な方法を解説しました。

固定回線とは異なり、CGNAT環境では外部からの直接的なアクセスが不可能なため、「トンネル接続」という手法が不可欠となります。今回は、この課題を解決するために「autosshによるリバースポートフォワーディング」と「WireGuardによるVPN接続」という2つの実用的な方法を紹介しました。

両方式を比較した結果、以下の特性が明らかになりました。

  • 低解像度での利用:どちらの方式でも大きな差はなく、安定して利用できます。
  • 高解像度での利用
    • autossh(TCP)は、データ再送の仕組みにより、映像のフレーム抜けが少ないというメリットがあります。
    • WireGuard(UDP)は、リアルタイム性を重視する高速通信に適しており、映像内の時刻表示などが正確に追従するというメリットがあります。

また、運用コストについても触れ、サーバーや回線費用は少し特殊ですが株主優待で抑えるといった現実的な運用方法も紹介しました。

今回の記事を通じて、CGNAT環境という一見難しそうな課題も、適切な技術と工夫によって解決できることをご理解いただけたかと思います。自身の用途や求めるパフォーマンスに合わせて最適な方式を選び、安心してウェブ監視カメラを運用するためのヒントとして、本記事が役立てば幸いです。

▽キャンペーン開催中!
バリュードメインでは、
【 .com1個目 790 】のドメインセール、
ドメイン・サーバー同時契約でドメイン費用永久無料(年間最大3,124円お得)
などお得な特典やキャンペーンが盛りだくさん!
是非、お得なこの機会にご利用ください。最新のキャンペーンはこちらから

ドメイン取得ならValue Domain

ユーザーノートの記事は、弊社サービスをご利用のお客様に執筆いただいております。

執筆者:苗場 翔様

医療メーカーで新素材研究開発後、電機メーカーで制御器系システム開発を経てIT系マルチエンジニアをしています。またデザイン思考を実践し、アート思考などのいろんな思考方法に興味があります。

Posted by digirockvn


おすすめ関連記事

service

Value Domain
ドメイン取得&レンタルサーバーなら
Value Domain
ドメイン登録実績600万件を誇るドメイン取得・管理サービスと、高速・高機能・高品質なレンタルサーバーや、SSL証明書などを提供するドメイン・ホスティング総合サービスです。
目次へ目次へ