SSHのポート番号を変更する方法|sshd_configの設定からfirewalld・SELinux対応まで


この記事の監修:宮崎智広(Linux教育歴15年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > SSHのポート番号を変更する方法|sshd_configの設定からfirewalld・SELinux対応まで
「デフォルトの22番ポートでSSHを運用しているけど、不正ログイン試行が多くて心配...」
「sshd_configを編集したのに接続できなくなった。SELinuxやfirewalldの設定も必要だったのか...」
SSHのデフォルトポートである22番は攻撃者に最初に狙われるポートです。ポート番号を変更するだけで、ブルートフォース攻撃のほとんどを防ぐことができます。

この記事では、RHELおよびCentOS/AlmaLinux/Rocky Linux環境でのSSHポート番号変更手順を解説します。
sshd_configの編集からSELinuxのポリシー追加、firewalldでの新ポート開放、sshdの再起動と接続確認まで、現場で必要な手順を一通りカバーします。


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を無料で手に入れる 図解60P/登録10秒/解除も3秒

なぜSSHのポート番号を変更するのか

インターネットに公開されたLinuxサーバーでは、22番ポートへのSSH接続試行が常に発生しています。攻撃者はまず22番ポートにアクセスし、よく使われるパスワードを総当たりで試します(ブルートフォース攻撃)。

ポート番号を変更することで得られる主なメリットは次のとおりです。

自動スキャンによる攻撃を回避できる:ほとんどの自動攻撃スクリプトは22番固定でスキャンします。ポートを変えるだけでこの種の攻撃が届かなくなります
ログがクリーンになる:22番ポートへの不正アクセス試行ログが大量に溜まらず、本当のエラーを見つけやすくなります
多層防御の一環として有効:鍵認証と組み合わせることで、セキュリティをより強固にできます

ただし、ポート変更はセキュリティ対策の「補助的な手段」であり、これだけで安全とは言えません。鍵認証の設定、rootログインの禁止、Fail2banによるブロックなどと組み合わせて使うことが重要です。

SSHポート番号の変更手順

手順の全体像は次のとおりです。

1. 現在のSSHポート番号を確認する
2. sshd_configでポート番号を変更する
3. SELinuxのポリシーを追加する(RHEL/CentOS系)
4. firewalldで新しいポートを許可する
5. sshdを再起動して反映する
6. 新しいポートで接続を確認する

順番を守ることが重要です。特に手順3と4を先に済ませてからsshdを再起動しないと、接続できなくなります。必ず既存のSSHセッションを維持したまま作業してください。

1. 現在のSSHポート番号を確認する

まず現在のSSH設定を確認します。sshdが使用中のポート番号は、設定ファイルと実際の待ち受け状態の両方で確認できます。

# 設定ファイルでPortの設定を確認する(#はコメント、つまりデフォルト22番が使用されている) # grep "^Port\|^#Port" /etc/ssh/sshd_config #Port 22 # sshdが実際に待ち受けているポートを確認する # ss -tlnp | grep sshd LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3)) LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1234,fd=4))

#Port 22 の行頭に「#」が付いているのはコメントアウトされた状態で、この場合はデフォルトの22番が使用されています。

2. sshd_configでポート番号を変更する

/etc/ssh/sshd_config をviで開き、ポート番号を変更します。ここでは例として10022番に変更します。

# sshd_configをviで開く # vi /etc/ssh/sshd_config

ファイルを開いたら「Port」の行を探します。/Port でviの検索機能を使うと素早く見つけられます。

変更前(デフォルト状態):

#Port 22

変更後(10022番を使用する場合):

Port 10022

コメントを外して(先頭の「#」を削除して)、ポート番号を変更します。1024番未満はシステムポートと呼ばれ特権ポートのため、通常は1024番以上49151番以下の範囲で未使用の番号を選びます。

変更を保存する前に、次の手順3・4を必ず先に完了させてください。

3. SELinuxのポリシーを変更する(RHEL/CentOS)

RHEL/CentOS/AlmaLinux/Rocky Linuxの環境ではSELinuxが有効になっています。SELinuxはSSHサービスが使えるポートをポリシーで制御しているため、22番以外のポートを使う場合は明示的にポリシーを追加する必要があります。

まず現在SSHに許可されているポートを確認します。

# SELinuxでSSHに許可されているポートを確認する # semanage port -l | grep ssh ssh_port_t tcp 22

デフォルトでは22番のみが許可されています。新しいポート(10022番)を追加します。

# 10022番をSSH許可ポートとしてSELinuxポリシーに追加する # semanage port -a -t ssh_port_t -p tcp 10022

追加後、設定が反映されていることを確認します。

# 追加後の確認 # semanage port -l | grep ssh ssh_port_t tcp 10022, 22

semanage コマンドが見つからない場合は、policycoreutils-python-utils パッケージをインストールしてください。

# semanageコマンドのインストール # dnf install -y policycoreutils-python-utils

4. firewalldで新しいポートを許可する

SELinuxの設定が完了したら、今度はfirewalldで新しいポートのトラフィックを許可します。

# 現在のfirewalld設定を確認する # firewall-cmd --list-all public (active) target: default interfaces: eth0 services: cockpit dhcpv6-client ssh ports: ... # 10022番(TCP)を永続的に許可する # firewall-cmd --add-port=10022/tcp --permanent success # 設定を即時反映させる # firewall-cmd --reload success # 開放済みポートを確認する # firewall-cmd --list-ports 10022/tcp

注意:この段階では22番ポートをまだ削除しないでください。接続確認が完了するまで、22番のSSH接続を維持しておく必要があります。

5. sshdを再起動して反映する

sshd_config、SELinux、firewalldの設定がすべて完了したら、sshdを再起動してポート変更を反映します。

# sshdを再起動する # systemctl restart sshd # sshdの状態を確認する(active (running)であればOK) # systemctl status sshd * sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled) Active: active (running) since ... # 新しいポートで待ち受けていることを確認する # ss -tlnp | grep sshd LISTEN 0 128 0.0.0.0:10022 0.0.0.0:* users:(("sshd",pid=5678,fd=3)) LISTEN 0 128 [::]:10022 [::]:* users:(("sshd",pid=5678,fd=4))

6. 新しいポートで接続を確認する

既存のセッションは切断しないまま、別のターミナルウィンドウを開いて新しいポートで接続テストを行います。

# 新しいポート(10022番)でSSH接続する(-pオプションでポート指定) $ ssh -p 10022 user@サーバーIPアドレス

新しいポートで問題なくログインできたことを確認してから、22番ポートをfirewalldから削除します。

# 22番のSSHサービスをfirewalldから削除する(永続的) # firewall-cmd --remove-service=ssh --permanent success # 設定を反映する # firewall-cmd --reload success # 最終確認(sshサービスが消え、10022/tcpだけ残っていればOK) # firewall-cmd --list-all public (active) target: default interfaces: eth0 services: cockpit dhcpv6-client ports: 10022/tcp

実務で役立つSSHポート変更のTips

Tipsその1:~/.ssh/configにポートを書いておく
毎回 -p 10022 を付けるのは面倒です。クライアント側の ~/.ssh/config に設定を書いておくと楽になります。

# ~/.ssh/config の設定例 Host myserver HostName 203.0.113.10 User admin Port 10022 IdentityFile ~/.ssh/id_rsa

この設定を書いておけば、ssh myserver だけで接続できるようになります。

Tipsその2:複数ポートで待ち受ける
移行期間中など、一時的に複数のポートでSSHを待ち受けさせることができます。sshd_configに複数のPort行を書くだけです。

# sshd_configで複数ポートを指定する例 Port 22 Port 10022

Tipsその3:/etc/services への記載は不要
/etc/services はサービスとポート番号の対応をまとめたファイルですが、sshdの待ち受けポートを変更する際は編集不要です。sshd_configの設定のみで動作します。

Tipsその4:古いRHEL/CentOS 6以前はiptablesで設定する
RHEL/CentOS 6以前ではfirewalldではなくiptablesを使用します。

# CentOS 6以前でiptablesに10022番を許可する例 # iptables -A INPUT -p tcp --dport 10022 -j ACCEPT # service iptables save

SSHポート変更でよくあるトラブルと対処法

「Connection refused」で接続できない

新しいポートで接続しようとして「Connection refused」が出る場合、以下の順で確認します。

sshdが新ポートで待ち受けているか確認する:

# sshdが新ポートで待ち受けているか確認する # ss -tlnp | grep sshd

待ち受けていない場合、sshd_configの記述ミスか、sshdの再起動が必要です。

firewalldで新ポートが許可されているか確認する:

# firewalldの許可ポートを確認する # firewall-cmd --list-ports

許可されていない場合は手順4に戻り、--permanent--reload を忘れずに実行します。

sshdのエラーログを確認する:

# sshdのエラーログを確認する # journalctl -u sshd -n 50

SELinuxが原因で接続できない

firewalldの設定は正しいのに接続できない、または journalctl -u sshd に「Permission denied」のエラーが出る場合は、SELinuxによるブロックが疑われます。

SELinuxのauditログを確認します。

# SELinuxのauditログでsshd関連の拒否を確認する # grep sshd /var/log/audit/audit.log | grep denied | tail -5 type=AVC msg=audit(...): avc: denied { name_bind } for pid=5678 comm="sshd" ...

「denied」の行が出ていればSELinuxによるブロックです。手順3の semanage port -a コマンドを実行してポリシーを追加してください。

SELinuxのステータスを確認する方法:

# SELinuxのステータスを確認する # getenforce Enforcing

Enforcing の場合はSELinuxが有効です。Permissive であれば警告のみでブロックしないため、SELinux以外の原因を調査します。

本記事のまとめ

やりたいこと コマンド/設定
現在のSSHポートを確認する ss -tlnp | grep sshd
sshd_configでポート番号を変更する vi /etc/ssh/sshd_config → Port 10022
SELinuxに新ポートを許可する semanage port -a -t ssh_port_t -p tcp 10022
SELinuxの許可ポートを確認する semanage port -l | grep ssh
firewalldで新ポートを永続的に許可する firewall-cmd --add-port=10022/tcp --permanent
firewalldの設定を即時反映する firewall-cmd --reload
sshdを再起動して変更を反映する systemctl restart sshd
新ポートでSSH接続する ssh -p 10022 user@サーバーIPアドレス
22番のSSHサービスをfirewalldから削除する firewall-cmd --remove-service=ssh --permanent
SELinuxのブロックを確認する grep sshd /var/log/audit/audit.log | grep denied


暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

※登録30秒/合わなければ解除3秒


宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが最近の悩み。ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る