SSHのポート変更が反映されない:Ubuntu 24.04のssh.socket
Ubuntu 24.04のVPSでPort 2222と書いてsudo systemctl restart sshを打っても、SSHは22番で待ち受けたままになる。24.04の既定では、ポートを開けているのはsshdではなくsystemdのssh.socketで、その待ち受け先はsystemctl daemon-reloadのときに作り直されるためだ。反映させるにはsudo systemctl daemon-reloadの後にsudo systemctl restart ssh.socketを打つ。その前に、VPSの管理画面のパケットフィルターで新しいポートを許可しておく。
2026年11月6日に、Docker Hubのubuntu:24.04でsystemd(255.4-1ubuntu8.18)を動かし、openssh-server(1:9.6p1-3ubuntu13.20)を入れて、コマンドごとにどのポートで待ち受けるかと、実際に接続できるかを確かめた。
- パケットフィルターを開けるVPSの管理画面で新しいポートを許可する。22番の許可はまだ外さない
- 22と2222を両方書くsshd_config.d/00-local.conf に Port を2行書き、sshd -t で書き間違いを見る
- daemon-reload と restart ssh.socketrestart ssh だけでは22番のまま。ss -ltn で2つのポートを見る
- 入れたら22番を閉じる別の端末から2222番で入れたら、Port 22 の行とパケットフィルターの22番を外す
確かめた環境と方法
- コンテナは
ubuntu:24.04。aptでsystemd、openssh-server、sshpass(パスワードでの接続を試すため)を入れ、/sbin/initでsystemdを動かした - 待ち受けているポートは
ss -ltnpで見た。接続は同じコンテナの中から127.0.0.1へ行い、別のマシンからの接続とVPS事業者の実機は試していない - 実行したスクリプトと出力の全文は公開していない。下の表と本文に、確かめた値と表示をそのまま載せた
なぜ restart ssh だけでは変わらないか
入れた直後の状態は、systemctl is-enabledでssh.socketがenabled、ssh.serviceがdisabledだった。ss -ltnpでは22番を持っているのがsystemd(pid 1)で、最初の接続が来たときにssh.serviceが起動し、systemdが開けたポートを受け取る作りになっている。
ssh.socketの待ち受け先は、パッケージに入っているsshd-socket-generatorが、daemon-reloadのときにsshdの設定を読んで/run/systemd/generator/ssh.socket.d/addresses.confに書く。/etc/ssh/sshd_configの先頭にも、ソケットで起動しているとき(既定)はPort・AddressFamily・ListenAddressを変えたらsystemctl daemon-reloadとsystemctl restart ssh.socketを打つように、という注記が入っていた。この注記は、同じ不具合の報告(Launchpad #2069041)を受けて足されたものだ。
/etc/ssh/sshd_config.d/00-local.confにPort 2222と書いてから、コマンドを変えて試した結果は次のとおり。
| 打ったコマンド | 待ち受けたポート | 2222番への接続 |
|---|---|---|
systemctl restart sshだけ |
22番のまま | Connection refused |
systemctl daemon-reloadの後にsystemctl restart ssh.socket |
2222番だけ | 入れた(22番はConnection refused) |
Port 22とPort 2222の2行にして、同じ2つ |
22番と2222番 | どちらも入れた |
ssh.socketを無効、ssh.serviceを有効にしてsystemctl restart ssh |
2222番 | 入れた |
1行目ではsudo sshd -Tがport 2222を表示したのに、実際は22番で待ち受けていた。sshd -Tはsshdが読む設定を表示するだけで、systemdが開けているポートは表示しない。反映したかはss -ltnで見る。
4行目は、ssh.socketを無効にしてssh.serviceを有効にした場合だ。事業者のOSイメージがどちらの形かは確かめていないので、自分のVPSで次のコマンドを打って見る。
systemctl is-enabled ssh.socket
systemctl is-active ssh.service
ssh.socketがenabledなら、daemon-reloadとrestart ssh.socketが要る。disabledでssh.serviceがactiveなら、従来どおりrestart sshで反映された。
先にVPSのパケットフィルターを開ける
OSの中でポートを変えても、VPSの管理画面のパケットフィルターで許可していなければ、外からは届かない。このサイトの比較に載せているサービスのうち、Linuxで使う4サービスの公式マニュアル(2026年11月6日確認)では、次のようになっていた。
| サービス | 管理画面の機能 | 22以外のポートの許可 | SSHで入れないときの入り口 |
|---|---|---|---|
| ABLENET VPS | 管理画面のパケットフィルターは公式で見つからず。FAQはOSの機能(iptables等)で作るよう案内 | OS側で設定する | ABLEパネルの仮想コンソール |
| さくらのVPS | パケットフィルター。初期状態でSSHの設定が用意されている | 初期値以外のポートを指定する(マニュアルの表では「カスタム」、1〜32767) | コントロールパネルのVNCコンソール・シリアルコンソール |
| シンVPS | パケットフィルター設定 | 「手動で設定」でプロトコルとポート番号を入れる | VPSパネルの「コンソール」 |
| XServer VPS | パケットフィルター設定。契約直後はすべての接続を拒否する設定 | 「手動で設定」でプロトコルとポート番号を入れる | VPSパネルのVNCコンソール・シリアルコンソール |
XServer VPSの公式ガイドは、SSHのポートを変えたら新しいポートで入れることを確かめてから、22番の「SSH」の許可を消す流れを書いている。さくらのVPSのマニュアルは、パケットフィルターが対象にするのはIPv4だけで、IPv6はすべて許可になると書いている。OSのファイアウォール(ufw)を有効にしている場合は、そちらでもsudo ufw allow 2222/tcpのように先に許可する。外から届かないときの切り分けはVPSに届かない時の切り分けにまとめた。
ポートを変える手順
最初は22番を残したまま新しいポートを足す。自分の設定はsshd_config.dの00-で始まるファイルに書く(sshd_configより先に読まれる理由はSSHのパスワード認証を止める記事で試した)。
sudo tee /etc/ssh/sshd_config.d/00-local.conf <<'EOF'
Port 22
Port 2222
EOF
sudo sshd -t
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
ss -ltn | grep -E ':22 |:2222 '
00-local.confにパスワード認証を止める行などを書いてあるなら、上のteeで上書きせず、Portの2行だけを足す。sshd -tは書き間違いがあると止まり、何も表示されなければ問題ない。ss -ltnで0.0.0.0:22と0.0.0.0:2222(IPv6の[::]も)の両方が出たら、今のセッションを閉じずに、別の端末から新しいポートで入る。
ssh -p 2222 <ユーザー>@<VPSのIP>
検証では、2222番でつないだセッションでコマンドを動かしたままdaemon-reloadとrestart ssh.socketを打っても、そのセッションは最後まで切れなかった。新しいポートで入れたら、00-local.confからPort 22の行を消し、もう一度daemon-reloadとrestart ssh.socketを打つ。ss -ltnで2222番だけになったのを見てから、パケットフィルターの22番の許可を外す。
入れなかったときは、残しておいたセッションでPort 2222の行を消して同じ2つのコマンドを打てば22番に戻る。セッションも切れていたら、上の表の管理画面のコンソールから入って戻す。
ポートを変えても、パスワードで入れる設定ならその危険は残る。パスワード認証を止める方を先に済ませておく。自動更新でVPSが再起動した後も新しいポートで入れるかは、再起動の時刻をunattended-upgradesの既定値で調べ、その後に一度つないで確かめておく。
参考資料(確認日: 2026年11月6日)
- Launchpad Bug #2069041: Changing Port in sshd_config requires calling systemctl daemon-reload
- Ubuntu 24.04のパッケージ openssh-server 1:9.6p1-3ubuntu13.20 の
/etc/ssh/sshd_configの注記とsshd-socket-generatorが作る/run/systemd/generator/ssh.socket.d/addresses.conf - OpenBSD manual: sshd_config(5)
- XServer VPS マニュアル: パケットフィルター設定・VPS初期設定のセキュリティ対策・コンソール
- シンVPS マニュアル: パケットフィルター設定・コンソール
- さくらのVPS マニュアル: パケットフィルター・コンソール
- ABLENET VPS よくある質問(ファイアーウォール・仮想コンソール)
- VPSの管理画面のパケットフィルター(使っていればOSのufwも)で、新しいポートを許可する
- systemctl is-enabled ssh.socket で、ソケットで待ち受けているかを見る
- /etc/ssh/sshd_config.d/00-local.conf に Port 22 と Port 2222 の2行を書き、sudo sshd -t で書き間違いを見る
- sudo systemctl daemon-reload と sudo systemctl restart ssh.socket を打ち、ss -ltn で2つのポートを見る
- 今のセッションを残したまま、別の端末から ssh -p 2222 で入れることを確かめる
- Port 22 の行を消して同じ2つのコマンドを打ち、パケットフィルターの22番の許可を外す