前回の記事「MacBookから自宅サーバーへSSH接続する!公開鍵認証の設定から~/.ssh/config活用まで完全ガイド」では、自宅LAN内からのSSH接続を設定しました。
本記事では、その続きとして外出先のカフェや職場からも自宅サーバーにSSH接続できる環境を構築します。
自宅のネットワーク環境はHGW(ホームゲートウェイ)→ Deco XE75 という二重NAT構成のため、2段階のポート転送設定が必要です。さらに、インターネットに公開するSSHポートをデフォルトの22番から変更することで、ブルートフォース攻撃などの標的になりにくくします。
「ポート転送設定」→「Nginx/SSL設定」→「UFWファイアウォール設定」→「外部SSHアクセス(本記事)」と続くシリーズの完結編です。
なぜこの機能を作ったのか?
自宅サーバーを運用していると、外出先から急いで設定を変更したいことがあります。
たとえば「Pythonスクリプトでバグを見つけたのでその場で修正したい」「サービスが落ちたのでリモートで再起動したい」といった状況です。
LAN内からのSSH接続は前回記事で設定済みでしたが、外出先からアクセスできないと結局サーバーの前に戻らなければなりません。
また、自宅サーバーをインターネットに公開する以上、SSHのセキュリティ対策も欠かせません。デフォルトの22番ポートのまま公開すると、世界中の自動スキャンツールから常に攻撃を受け続けます。
そこで、外部公開ポートを非標準番号に変更し、公開鍵認証のみを許可することで、安全なリモートアクセス環境を実現しました。

外出先のどこからでも自宅サーバーに安全にアクセスして、リモートでサーバー管理できるようにしたい!
実現したいこと
- 外出先のネットワーク(カフェ・職場・モバイル回線)から自宅サーバーにSSH接続できる
- HGW(二重NAT)→ Deco → サーバーの2段階ポート転送を正しく設定する
- 外部公開するSSHポートを非標準番号(52341)にして自動スキャン攻撃を受けにくくする
- UFWでSSHポート22番はLAN内のみに制限し、外部からの直接アクセスをブロックする
- ~/.ssh/config に外部接続用の設定を追加して
ssh nucbox-extで接続できる
この記事でわかること
- 二重NAT環境(HGW + Deco)でSSH外部公開するための2段階ポート転送の設定方法
- DecoアプリでSSHのポート転送ルールを作成する方法
- 外部公開ポートを非標準番号にする「ポート偽装」のセキュリティ効果と限界
- UFWでSSH(ポート22)をLAN内のみに制限する方法
- ~/.ssh/config に内部接続・外部接続の両方を登録して使い分ける方法
- CMMANを使って外部からSSHポートの疎通を確認する方法
必要な準備と用意するもの
- 自宅サーバー(本記事はNUCBox G3 Plus、IP: 192.168.68.89)
- Deco XE75(内部ルーター。ポート転送設定を行う)
- HGW-BL1500HM(外部ルーター。追加のポートマッピング設定を行う)
- MacBook(SSH接続元、外出先のPCやスマートフォン)
- TP-Link Decoアプリ(iOS/Android)
- TP-Link DDNSサービス(xxxx.tplinkdns.com)
- UFW(Ubuntu/Debianのファイアウォール)
- OpenSSH Server(サーバー側)/ OpenSSH Client(Mac側、標準搭載)
- 前提条件:前回記事の「LAN内SSH公開鍵認証」設定が完了していること
- Mac側にSSH鍵ペアが生成済み(~/.ssh/id_ed25519)
- サーバーの ~/.ssh/authorized_keys に公開鍵が登録済み
- sshd_configで PasswordAuthentication no 設定済み
完成イメージ
設定完了後は、外出先のターミナルから以下のコマンドで自宅サーバーに接続できます。
# ~/.ssh/config に外部接続設定済みなら1コマンドで接続
$ ssh nucbox-ext
# 接続後はサーバーのターミナルが使える
user@nucbox-g3-plus:~$
[外出先のMac]
ssh -p 52341 xxxx.tplinkdns.com
↓ DDNS名前解決
[インターネット(グローバルIP)]
↓ TCP:52341
[HGW-BL1500HM] ポートマッピング: 52341 → 192.168.0.2:52341
↓ TCP:52341
[Deco XE75] NAT転送: 52341 → 192.168.68.89:22
↓ TCP:22
[NUCBox G3 Plus] SSH Server (sshd) が受信
↓ 公開鍵認証で検証
[接続完了]
システムの仕組み
二重NAT環境でのSSH通信経路
本記事の環境では、インターネットからサーバーまでに2台のルーター(HGWとDeco)を経由します。それぞれのルーターで「ポートの引き渡し」設定(NAT転送)が必要です。
ポートの引き渡し(NAT転送)とは
外部から届いたパケットを「どの内部IPの、どのポートへ渡すか」をルーターが変換する仕組みです。
HGW:外部の52341番ポート → Deco(192.168.0.2)の52341番ポートへ転送
Deco:52341番ポート → サーバー(192.168.68.89)の22番ポートへ転送
このようにポート番号を「変換」しながら最終的にサーバーのSSH(22番)まで届けます。
なぜ外部ポートを22番以外にするのか
ポート偽装でスキャン攻撃を大幅に減らせる
インターネット上の自動スキャンツールは、まずSSHのデフォルトポートである22番を片っ端から試してきます。外部公開ポートを52341のような非標準番号にするだけで、これらの自動スキャンの大部分をシャットアウトできます。Nginxアクセスログで実際に22番へのブルートフォース試行が激減するのが確認できます。
ポート偽装は「セキュリティの根本解決」ではない
ポート番号の変更は「Security through obscurity(隠蔽によるセキュリティ)」であり、根本的な解決策ではありません。本記事では必ず公開鍵認証のみを許可(パスワード認証無効)することと組み合わせてセキュリティを確保します。
UFWとDecoポート転送の連携
一見矛盾しているように見えますが、UFWで「SSHポート22をLAN内のみ許可」しながら、Decoが外部からの52341番ポートを22番に変換して転送することで、外部からのSSH接続も可能になります。
外部のMac: 52341番ポートで接続
↓
Deco: 52341 → 192.168.68.89:22 に変換して転送
↓
サーバーのNIC: 送信元IPは 192.168.68.x(Decoのローカルアドレス)として見える
↓
UFW: 送信元が 192.168.68.0/24(LAN)からの22番 → 許可 ✓
↓
SSH daemon: 公開鍵認証で接続を検証 → 接続OK
ポイント
DecoがNAT変換を行うため、サーバーから見るとSSH接続の送信元IPはDeco内のIPアドレス(192.168.68.x)になります。つまり「LAN内からのアクセス」として扱われ、UFWのLAN制限ルールに適合します。
実装のポイント
外部ポート番号は1024〜65535の範囲で任意に選ぶ
52341のような番号を使うことで、自動スキャンに引っかかりにくくなります。他のサービスと被らない番号を選びましょう(本記事では52341を使用)。
公開鍵認証は必須
外部公開するSSHでは、必ず公開鍵認証のみを使用し PasswordAuthentication no を設定してください。これが最も重要なセキュリティ対策です。前回記事(ローカルSSH設定)で実施済みであることを確認してから本記事の設定を進めてください。
注意:HGWとDecoの両方にポート設定が必要
二重NAT環境では、HGWとDecoの両方にポート転送設定を追加しないと接続できません。片方だけ設定しても外部からは到達しません。
事前準備
前提条件の確認
本記事の設定を始める前に、以下がすべて完了していることを確認してください。
# 1. 公開鍵認証が設定済みか確認
$ sudo sshd -T | grep -E "pubkeyauthentication|passwordauthentication"
pubkeyauthentication yes
passwordauthentication no ← PasswordAuthentication が no になっていること
# 2. authorized_keys に公開鍵が登録されているか確認
$ cat ~/.ssh/authorized_keys | wc -l
1 ← 1件以上あればOK
# 3. UFW が有効になっているか確認
$ sudo ufw status | head -3
Status: active
DDNSドメインと外部IPの確認
外部からSSH接続するために使うDDNSドメインを確認します。Decoアプリの「詳細」→「TP-Link DDNS」でドメイン名を確認してください(ドメイン名は個人情報のため記事では xxxx.tplinkdns.com と表記します)。
# DDNSドメインが正しく解決されるか確認
$ nslookup xxxx.tplinkdns.com
Server: ...
Address: ...
Name: xxxx.tplinkdns.com
Address: XXX.XXX.XXX.XXX ← 自宅のグローバルIPが返ればOK
実装方法
① UFWでSSH(ポート22)をLAN内のみに制限する
UFWファイアウォール記事で設定済みの場合はスキップできます。未設定の場合は以下を実行します。
# SSHをLAN内(192.168.68.0/24)からのみ許可する
$ sudo ufw allow from 192.168.68.0/24 to any port 22 proto tcp comment 'SSH LAN only'
# 確認
$ sudo ufw status | grep 22
22/tcp ALLOW 192.168.68.0/24
22番ポートを全外部に開けてはいけない理由
Decoを経由した外部SSH接続は、サーバーから見るとLAN(192.168.68.x)からのアクセスとして見えるため、上記のLAN制限ルールでも外部SSH接続が可能です。直接22番を外部に開放する必要はありません。
② DecoのNAT転送にSSHルールを追加する
Decoアプリを開き、「詳細」→「NAT転送」→「ポート転送」に進みます(設定方法の詳細は「自宅サーバーをネットに公開する!HGW&Decoによる二重NAT環境のポート転送設定ガイド」を参照)。
「+」ボタンで新しいルールを追加し、以下のように設定します。
| 項目 | 設定値 | 説明 |
|---|---|---|
| サービスタイプ | カスタム | リストにSSHがないためカスタムで作成 |
| サービス名 | ssh | わかりやすい名前(任意) |
| 内部IP | 192.168.68.89 | NUCBox G3 Plus のIPアドレス |
| 内部ポート | 22 | サーバーのSSHポート(デフォルト) |
| 外部ポート | 52341 | 外部に公開するポート番号(非標準番号) |
| プロトコル | TCP | SSHはTCPを使用 |
設定後、Decoのポート転送リストにSSHルールが追加されたことを確認します。

SSHルールの詳細画面では、内部ポート22(サーバーのSSH)→ 外部ポート52341(インターネット側の窓口)のマッピングが確認できます。

③ HGWのポートマッピングにSSHポートを追加する
二重NAT環境では、HGW(ホームゲートウェイ)にも外部ポート52341の転送設定が必要です。HGWの管理画面(192.168.0.1)にアクセスし、「詳細設定」→「NATエントリ設定」→「ポートマッピング設定」に進みます。

HGWのポートマッピングの設定方法の詳細は「自宅サーバーをネットに公開する!HGW&Decoによる二重NAT環境のポート転送設定ガイド」を参照してください。
本記事の環境では、SSHポート(52341)を含む範囲をまとめてポート範囲指定で転送しています。「追加 +」ボタンから以下のように設定します。
| 項目 | 設定値 | 備考 |
|---|---|---|
| プロトコル | TCP | SSHはTCP |
| 公開ポート(外部) | 52340-52349 | 52341を含むポート範囲。単一ポートで登録する場合は 52341-52341 でも可 |
| 変換後のIPアドレス | 192.168.0.2 | DecoのHGW側IPアドレス |
| 変換後のポート | 52340-52349 | DecoへそのままのポートでTCPを転送 |
設定後、ポートマッピングの一覧に優先度1のルール(TCP 52340-52349)が追加されていることを確認します。

HGWはDecoに向けてポートを「そのまま」転送する
HGWは受け取った52341番パケットをDecoのIPアドレス(192.168.0.2)の52341番に転送します。ポート番号の変換(22番への書き換え)はDecoが担当するため、HGW側は52341→52341のストレート転送で構いません。ポート範囲(52340-52349)で登録することで、将来的に同じ番号帯に別のサービスを追加する際もHGW設定を変更せずに済みます。
④ Mac側の ~/.ssh/config に外部接続設定を追加する
前回記事でLAN内接続用の設定(Host nucbox)を作成済みの場合は、外部接続用の設定を追加します。
$ nano ~/.ssh/config
# ===== LAN内接続(自宅ネットワーク内から) =====
Host nucbox
HostName 192.168.68.89
User user
IdentityFile ~/.ssh/id_ed25519
AddKeysToAgent yes
UseKeychain yes
# ===== 外部接続(外出先から) =====
Host nucbox-ext
HostName xxxx.tplinkdns.com # 自分のDDNSドメイン名に変更
Port 52341 # Decoで設定した外部ポート
User user
IdentityFile ~/.ssh/id_ed25519
AddKeysToAgent yes
UseKeychain yes
# 共通設定
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
LAN内と外部で自動切り替えするTips
ProxyJump や条件分岐を使えば、自宅LAN内では直接接続、外出先では外部経由で接続するように自動切り替えも可能ですが、本記事では明示的に ssh nucbox(LAN内)と ssh nucbox-ext(外部)を使い分けるシンプルな構成を採用します。
動作確認
① CMMANで外部からのポート開放を確認する
外部からポート52341が到達可能かを確認します。CMAN(https://www.cman.jp/network/support/port.html)にアクセスして、ポート番号に 52341 を入力して確認します。
「開いています」と表示されればOK
HGWとDecoのポート転送が正しく設定されていれば「ポート 52341 は開いています」と表示されます。
「閉じています」と表示された場合
① HGWのポートマッピング(52341→Deco)が設定されているか確認
② DecoのNAT転送(52341→192.168.68.89:22)が設定されているか確認
③ サーバーのSSHサービスが起動しているか確認(sudo systemctl status ssh)
④ UFWがSSHをLAN内から許可しているか確認(sudo ufw status)
② 外部ネットワークから実際に接続テストする
スマートフォンのモバイル回線(Wi-Fiをオフにして4G/5G接続)から接続テストするのが最も手軽です。
# ~/.ssh/config のエイリアスで接続
$ ssh nucbox-ext
# または明示的にポートとDDNSドメインを指定
$ ssh -p 52341 user@xxxx.tplinkdns.com
# 接続成功すればサーバーのターミナルが表示される
user@nucbox-g3-plus:~$
# 接続確認コマンドを実行してみる
user@nucbox-g3-plus:~$ hostname && whoami && ip route
nucbox-g3-plus
user
default via 192.168.68.1 dev eth0 ...
③ SSH接続ログをサーバー側で確認する
サーバー側のSSH認証ログを確認することで、接続の履歴とセキュリティ状況を把握できます。
# SSH認証ログの最新10件を確認
$ sudo journalctl -u ssh --since "1 hour ago" | tail -20
# 正常な接続例
May 30 XX:XX:XX nucbox-g3-plus sshd[XXXX]: Accepted publickey for user from 192.168.68.1 port XXXXX ssh2
# 不正アクセスの試み(公開鍵認証のため弾かれる)
May 30 XX:XX:XX nucbox-g3-plus sshd[XXXX]: Connection closed by invalid user admin from XXX.XXX.XXX.XXX
ログの見方
正常な接続では Accepted publickey for user from 192.168.68.x と表示されます(送信元がDecoのLAN側IPになっています)。外部からの不正アクセス試行はポート番号を変えてもゼロにはなりませんが、22番公開時に比べて大幅に減少します。
④ VS Code Remote SSH での外部接続確認
VS Code Remote SSH も同様に外出先から使えます。左下「><」→「Connect to Host…」で nucbox-ext を選択するだけです。~/.ssh/config に設定済みのエイリアスが自動的に表示されます。
トラブルシューティング
Q: LAN内では接続できるが、外部から接続できない
A: HGWかDecoのポート転送設定に問題がある可能性が高いです。
① CMMANでポート52341が開いているか確認する
② HGWのポートマッピング設定を再確認する(プロトコルがTCPか、転送先IPがDecoのIPか)
③ Decoのポート転送設定を再確認する(外部ポート52341、内部ポート22、内部IP 192.168.68.89)
④ DDNSドメインが現在のグローバルIPに解決されているか確認する(nslookup xxxx.tplinkdns.com)
Q: ssh: connect to host xxxx.tplinkdns.com port 52341: Connection refused
A: サーバーのSSHサービスが停止しているか、Decoの転送先ポートが誤っている可能性があります。
① sudo systemctl status ssh でSSHが起動中か確認
② DecoのNAT転送で内部ポートが 22(Sshのデフォルトポート)になっているか確認
Q: Permission denied (publickey) と表示されて接続できない
A: 公開鍵認証に問題があります。
① 自宅LAN内から ssh nucbox で接続できるか確認する(LAN内接続が先に正常動作する必要があります)
② ~/.ssh/config の Host nucbox-ext で IdentityFile が正しい秘密鍵を指しているか確認する
③ ssh -vvv -p 52341 user@xxxx.tplinkdns.com で詳細ログを確認する
まとめ
本記事では、二重NAT環境(HGW + Deco)で外出先から自宅サーバーにSSH接続するための設定を解説しました。
- HGW(52341→Deco)→ Deco(52341→サーバー:22)の2段階ポート転送が必要
- 外部公開ポートを非標準番号(52341)にすることで自動スキャン攻撃を大幅に減らせる
- UFWのLAN制限(port 22を192.168.68.0/24のみ許可)はDecoのNAT経由でも有効
- ~/.ssh/config に
nucbox(LAN内)とnucbox-ext(外部)を両方登録して使い分ける - 公開鍵認証(PasswordAuthentication no)との組み合わせが最重要セキュリティ対策
これで、ポート転送 → Nginx/SSL → UFWファイアウォール → SSHセキュア外部接続と続く4記事シリーズが完成しました。外出先のどこからでも自宅サーバーを安全に管理できる環境が整いました。

