「sshd_configを編集したのに接続できなくなった。SELinuxやfirewalldの設定も必要だったのか...」
SSHのデフォルトポートである22番は攻撃者に最初に狙われるポートです。ポート番号を変更するだけで、ブルートフォース攻撃のほとんどを防ぐことができます。
この記事では、RHELおよびCentOS/AlmaLinux/Rocky Linux環境でのSSHポート番号変更手順を解説します。
sshd_configの編集からSELinuxのポリシー追加、firewalldでの新ポート開放、sshdの再起動と接続確認まで、現場で必要な手順を一通りカバーします。
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ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 でviの検索機能を使うと素早く見つけられます。変更前(デフォルト状態):
#Port 22
Port 10022
変更を保存する前に、次の手順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
# 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
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番の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
/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
・firewalldで新ポートが許可されているか確認する:
# firewalldの許可ポートを確認する # firewall-cmd --list-ports
--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" ...
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 |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
※登録30秒/合わなければ解除3秒
