SSHの既定のポート番号は22番です。「SSH ポート」で調べている場合、知りたいのは主に「22番から別のポートに変更する手順」と「変更後のポートで接続する方法」の2つです。この記事では、サーバー側でのSSHポート変更手順(sshd_config編集・ファイアウォール開放・再起動)と、クライアント側で新ポートに接続する方法、変更後の疎通確認までを、実際に動作を確認したコマンド例とあわせて解説します。
SSHのデフォルトポートは22番
SSH(Secure Shell)はデフォルトでTCP 22番ポートを使用します。ssh user@host のようにポートを省略して接続すると、自動的に22番ポートへ接続を試みます。IANA(インターネット番号割当機関)にもSSH用として登録されている、いわば「業界標準」のポートです。
標準ポートであるがゆえに、インターネットに公開されたサーバーの22番ポートは常時スキャン・総当たり攻撃(ブルートフォース)の対象になりやすいという弱点があります。これがSSHポートを変更する主な動機です。
SSHポートを変更する理由
- 自動スキャン・ブルートフォース攻撃のノイズを減らす:22番ポート宛のログイン試行は非常に多く、認証ログが埋もれやすい
- 脆弱性スキャナーの初期対象から外れやすくなる:機械的なポートスキャンの多くは22番を優先的に狙う
- 複数サーバーでポートを分けて運用を切り分けたい:踏み台・本番・検証環境などで待受ポートを変えて誤接続を防ぐ
ただし、ポート変更は「隠す」対策であって「防ぐ」対策ではありません。ポートスキャン自体を防げるわけではないため、公開鍵認証の強制やfail2banなどのアクセス制限と併用するのが前提です。
サーバー側でSSHポートを変更する手順
ポートの変更はSSHサーバー(sshd)側の設定ファイル /etc/ssh/sshd_config を編集して行います。
1. sshd_configのPort行を編集する
sudo vi /etc/ssh/sshd_config
#Port 22 をコメントアウトから外し、新しいポート番号に変更します。ウェルノウンポート(0〜1023)は避け、1024〜65535の範囲から他サービスと衝突しない番号を選びます。
# /etc/ssh/sshd_config
Port 2222
2. 旧ポートを残したまま新ポートも待ち受ける(ロックアウト対策)
Port ディレクティブは複数行書くとすべて有効になります。リモート作業中にポートを切り替える場合、いきなり22番を削除すると設定ミスで接続不能(ロックアウト)になるリスクがあるため、まず新旧ポート両方を待ち受ける状態にして動作確認してから、旧ポートの行を削除するのが安全です。
# /etc/ssh/sshd_config(移行期間中)
Port 22
Port 2222
3. 設定ファイルの文法をチェックする
反映前に sshd -t で文法エラーがないか確認します。エラーがあってもこの時点ではサービスに影響しません。
sudo sshd -t
何も表示されなければ文法は正常です。不正な値(例: ポート番号の範囲外指定)があると、次のようにエラー行が表示されます。
/etc/ssh/sshd_config line 1: Badly formatted port number.
4. ファイアウォールで新ポートを許可する
OS側の設定を変えても、ファイアウォールが新ポートを塞いだままだと接続できません。Ubuntu/Debian系でufwを使っている場合の例です。
sudo ufw allow 2222/tcp
sudo ufw status
ufwの詳しい使い方は ufw – Uncomplicated Firewall を参照してください。RHEL/CentOS系でfirewalldを使っている場合は次の通りです。
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
クラウド(AWS/GCP/さくらのVPSなど)を使っている場合は、OS内のファイアウォールに加えてセキュリティグループ・パケットフィルタ側でも新ポートを許可する必要があります。ここを忘れると「OS側は開いているのに繋がらない」状態になりやすいので注意してください。
5. sshdを再起動する
設定を反映させるため、SSHサービスを再起動します。ディストリビューションによってサービス名が異なります。
| ディストリビューション | コマンド |
|---|---|
| Ubuntu / Debian | sudo systemctl restart ssh |
| RHEL / CentOS / AlmaLinux | sudo systemctl restart sshd |
再起動直後は今の接続を切断せず、別のターミナルから新ポートでの接続を確認してください。今のセッションを切ってしまうと、失敗時に再接続できなくなります。systemctlの基本操作は systemctl コマンド|Linuxサービス管理の基本と使い方 で解説しています。
クライアント側で変更後のポートに接続する方法
-p オプションでポートを指定する
ssh -p 2222 user@example.com
-p の後に接続先ポート番号を指定します。scpやsftpでも同様にポート指定が必要ですが、オプション名が異なる点に注意してください。
# scpは大文字の -P
scp -P 2222 file.txt user@example.com:/path/
# sftpは小文字の -P(sshと同じ意味だがオプション文字が異なる)
sftp -P 2222 user@example.com
~/.ssh/config にPortを書いて毎回省略する
毎回 -p を書くのが手間な場合は、~/.ssh/config にホストごとのPortを書いておくと ssh myserver だけで接続できます。
# ~/.ssh/config
Host myserver
HostName example.com
User admin
Port 2222
複数サーバーの使い分けや踏み台サーバー経由の接続など、詳しい書き方は SSH configの書き方|~/.ssh/configで接続設定をまとめる方法 にまとめています。
変更後のポートを確認する
再起動後、sshdが意図したポートで待ち受けているかをサーバー上で確認します。
$ ss -ltnp | grep ssh
LISTEN 0 128 0.0.0.0:2222 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
クライアント側からポートが開いているかを確認するには nc(netcat)を使います。
# 開いている場合
$ nc -zv example.com 2222
Connection to example.com 2222 port [tcp/*] succeeded!
# 塞がっている場合(ファイアウォール未開放・サービス未起動など)
$ nc -zv example.com 2222
nc: connect to example.com port 2222 (tcp) failed: Connection refused
Connection refused はポートまで届いてsshdが応答していないケース、応答がなくタイムアウトする場合はファイアウォールやセキュリティグループでパケット自体が遮断されているケースです。原因の切り分け方が異なるため、この違いは覚えておくと役立ちます。
コマンド早見表
| 用途 | コマンド |
|---|---|
| サーバー側: ポート変更 | sudo vi /etc/ssh/sshd_config(Port 番号を編集) |
| サーバー側: 設定の文法チェック | sudo sshd -t |
| サーバー側: ufwでポート許可 | sudo ufw allow 2222/tcp |
| サーバー側: firewalldでポート許可 | sudo firewall-cmd --permanent --add-port=2222/tcp && sudo firewall-cmd --reload |
| サーバー側: sshd再起動(Ubuntu/Debian) | sudo systemctl restart ssh |
| サーバー側: sshd再起動(RHEL系) | sudo systemctl restart sshd |
| クライアント側: 新ポートで接続 | ssh -p 2222 user@host |
| クライアント側: ポート疎通確認 | nc -zv host 2222 |
| サーバー側: 待受ポート確認 | ss -ltnp | grep ssh |
注意点・よくあるつまずき
- 今のSSHセッションを切る前に新ポートで接続確認する:設定ミスがあってもロールバックできる状態を保つ
- クラウドのセキュリティグループ側も忘れずに開放する:OS内のファイアウォールだけ開けても、AWS/GCPなどのネットワークACLで塞がれていると接続できない
- fail2banなどを導入済みの場合はポート設定も合わせて変更する:監視対象ポートが22番のままだと新ポートへの攻撃を検知できない
- SELinuxが有効なRHEL系では、ポートのコンテキスト追加が必要な場合がある:
semanage port -a -t ssh_port_t -p tcp 2222(policycoreutils-python-utils導入が前提)を行わないと、SELinuxに拒否されて起動・接続に失敗することがある - 1024番未満のポートは避ける:ウェルノウンポートは他サービスと衝突しやすく、一部の環境ではroot権限やCAP_NET_BIND_SERVICEが別途必要になる
ポート変更後も接続できない場合は SSH接続できないときのチェックリスト、ポート自体が別プロセスに使われている疑いがある場合は ポート競合の原因と解消手順 もあわせて確認してください。
よくある質問(FAQ)
Q. SSHのポートを変更するとセキュリティは万全になりますか?
A. いいえ。ポート変更は自動スキャンのノイズを減らす効果はありますが、狙われた場合の防御にはなりません。公開鍵認証の強制(パスワード認証の無効化)、fail2banなどのアクセス制限と併用してください。
Q. どのポート番号を選べばいいですか?
A. 1024〜65535の範囲で、他サービスが使っていない番号を選びます。ss -ltn で使用中のポートを確認してから決めると衝突を避けられます。
Q. ポートを変更したらすぐ元の22番は閉じるべきですか?
A. すぐには閉じず、新ポートでの接続を複数回確認してから sshd_config の Port 22 行を削除するのが安全です。焦って閉じるとロックアウトのリスクがあります。
関連記事
ssh
ssh接続の基本構文・主要オプション一覧はこちら。- SSH configの書き方
ポート・ユーザー名・鍵をまとめてHostエイリアス化する方法。 ufw
Ubuntu/Debian系のシンプルなファイアウォール操作コマンド。systemctl
sshdなどサービスの起動・再起動・状態確認コマンド。- ポート競合の原因と解消手順
新ポートが別プロセスに使われている場合の調査・解消方法。
参考
- sshd_config manページ
https://man7.org/linux/man-pages/man5/sshd_config.5.html - OpenSSH 公式ドキュメント
https://www.openssh.com/

コメント