SSHのポート変更が反映されない:Ubuntu 24.04のssh.socket

公開日: 2026-11-06 / 運用・復元 #SSH #Ubuntu #systemd #セキュリティ #パケットフィルター

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)を入れて、コマンドごとにどのポートで待ち受けるかと、実際に接続できるかを確かめた。

  1. パケットフィルターを開けるVPSの管理画面で新しいポートを許可する。22番の許可はまだ外さない
  2. 22と2222を両方書くsshd_config.d/00-local.conf に Port を2行書き、sshd -t で書き間違いを見る
  3. daemon-reload と restart ssh.socketrestart ssh だけでは22番のまま。ss -ltn で2つのポートを見る
  4. 入れたら22番を閉じる別の端末から2222番で入れたら、Port 22 の行とパケットフィルターの22番を外す
SSHのポートを変える順番(2026年11月6日、Ubuntu 24.04のopenssh-server 9.6p1とsystemd 255で確認)

確かめた環境と方法

  • コンテナは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日)

  1. VPSの管理画面のパケットフィルター(使っていればOSのufwも)で、新しいポートを許可する
  2. systemctl is-enabled ssh.socket で、ソケットで待ち受けているかを見る
  3. /etc/ssh/sshd_config.d/00-local.conf に Port 22 と Port 2222 の2行を書き、sudo sshd -t で書き間違いを見る
  4. sudo systemctl daemon-reload と sudo systemctl restart ssh.socket を打ち、ss -ltn で2つのポートを見る
  5. 今のセッションを残したまま、別の端末から ssh -p 2222 で入れることを確かめる
  6. Port 22 の行を消して同じ2つのコマンドを打ち、パケットフィルターの22番の許可を外す