SSH ポートの変更方法|デフォルト22番から変更する手順と接続・確認方法

コマンドリファレンス

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 / Debiansudo systemctl restart ssh
RHEL / CentOS / AlmaLinuxsudo 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_configPort 番号を編集)
サーバー側: 設定の文法チェック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 2222policycoreutils-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_configPort 22 行を削除するのが安全です。焦って閉じるとロックアウトのリスクがあります。

関連記事

  • ssh
    ssh接続の基本構文・主要オプション一覧はこちら。
  • SSH configの書き方
    ポート・ユーザー名・鍵をまとめてHostエイリアス化する方法。
  • ufw
    Ubuntu/Debian系のシンプルなファイアウォール操作コマンド。
  • systemctl
    sshdなどサービスの起動・再起動・状態確認コマンド。
  • ポート競合の原因と解消手順
    新ポートが別プロセスに使われている場合の調査・解消方法。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント