firewalldが原因でSSH接続できない場合|接続拒否の原因調査と対処方法を解説

firewalldが原因でSSH接続できない場合

firewalldが原因でSSH接続できない場合の確認方法を理解しよう

LinuxサーバへSSH接続できない場合、多くの人はまずsshdの設定を確認します。

しかし実際の現場では、SSHサービス自体は正常に動作しているにもかかわらず、firewalldが通信を遮断しているケースが少なくありません。

特にAlmaLinux、Rocky Linux、RHELなどのRed Hat系Linuxではfirewalldが標準で有効になっています。

そのためSSH接続トラブルでは必ず確認すべきポイントの一つです。

本記事ではfirewalldが原因でSSH接続できない場合の調査方法や対処方法について解説します。

firewalldとは何か

firewalldはLinuxで利用されるファイアウォール管理ツールです。

通信の許可・拒否を制御する役割を持っています。

現在のRed Hat系Linuxでは標準採用されています。

SSH接続に与える影響

SSHサーバ(sshd)が正常に起動していても、firewalldが22番ポートへの通信を拒否していれば接続できません。

つまり以下の状態です。


sshd → 起動中
firewalld → 通信拒否

この場合SSH接続は失敗します。

よくある症状

  • SSH接続できない
  • Connection timed out
  • 接続が応答しない
  • ポートスキャンで22番が閉じている

firewalldが原因の可能性があります。

まずsshdを確認する

最初にSSHサービスの状態を確認します。

# systemctl status sshd

active (running)であればSSHサービスは起動しています。

ポート待受確認

SSHが待受中か確認します。

# ss -antlp | grep sshd

例です。
LISTEN 0 128 *:22

表示されれば待受しています。

firewalld状態確認

現在の状態を確認します。

# systemctl status firewalld

または
# firewall-cmd --state

runningなら有効です。

現在許可されているサービス確認

# firewall-cmd --list-services

例です。
dhcpv6-client ssh

sshが表示されていれば許可されています。

SSHが許可されていない例

dhcpv6-client

sshがありません。

この場合は接続できません。

SSHサービスを許可する

最も基本的な対処方法です。

# firewall-cmd --permanent  --add-service=ssh

設定反映します。
# firewall-cmd --reload

ポート番号変更時の確認

SSHポートを変更した場合です。

Port 2222

sshd_configだけ変更しても接続できません。

変更後ポートを許可する

# firewall-cmd --permanent  --add-port=2222/tcp

反映します。
# firewall-cmd --reload

現在のポート許可状況確認

# firewall-cmd --list-ports

開放ポートが表示されます。

ゾーン設定確認

firewalldにはゾーンという概念があります。

現在のゾーンを確認します。

# firewall-cmd --get-active-zones

どのゾーンへルールが適用されているか確認できます。

全体設定確認

設定をまとめて確認します。

# firewall-cmd --list-all

トラブル時によく利用します。

接続元制限の確認

Rich Ruleによる制限がある場合です。

# firewall-cmd --list-rich-rules

接続元IP制限を確認できます。

許可IPが限定されている例

source address="192.168.1.10"
service name="ssh"
accept

指定IP以外は接続できません。

実際の通信確認

クライアントから確認します。

# nc -zv server 22

ポート到達性を確認できます。

nmapで確認する

# nmap -p 22 server

SSHポートの状態を確認できます。

タイムアウトする場合

以下のような場合です。

Connection timed out

firewalldやネットワーク機器が通信を遮断している可能性があります。

Connection refusedの場合

Connection refused

こちらはsshd停止やポート待受なしの可能性が高いです。

原因が異なります。

一時的にfirewalldを停止する

切り分け目的で実施します。

# systemctl stop firewalld

これで接続できればfirewalldが原因です。

注意事項

本番環境で長時間停止することは推奨されません。

原因調査後は再度有効化しましょう。

# systemctl start firewalld

クラウド環境の注意点

AWSやAzureではOS側だけではありません。

クラウド側の設定も確認します。

  • AWS Security Group
  • Azure NSG
  • GCP Firewall Rule

非常に多いトラブルです。

AWSでよくあるケース

firewalldは許可済みでも、Security Groupが22番を拒否している場合があります。

両方を確認しましょう。

ログ確認方法

firewalldのログを確認します。

# journalctl -u firewalld

起動状況や設定変更履歴が確認できます。

実務で最も多い原因

  • sshサービス未許可
  • ポート変更後の設定忘れ
  • Rich Rule制限
  • クラウドFW設定ミス
  • ゾーン設定ミス

まずここを確認しましょう。

実務での切り分け手順

  1. sshd起動確認
  2. ss確認
  3. firewalld状態確認
  4. list-services確認
  5. list-all確認
  6. ncで通信確認
  7. 一時停止で切り分け

ほとんどの問題はこの流れで解決できます。

SSH接続できない場合の確認順序

効率的な確認順序です。

  1. ネットワーク疎通
  2. sshd起動確認
  3. ポート待受確認
  4. firewalld確認
  5. SELinux確認
  6. SSHログ確認

実務ではこの順番が効率的です。

まとめ

firewalldはSSH接続トラブルの代表的な原因の一つです。

sshdが正常でもfirewalldが通信を遮断していればSSH接続はできません。

特にポート変更後やクラウド環境では設定漏れが発生しやすいため注意が必要です。

トラブル発生時はsshd、firewalld、クラウド側ファイアウォールを順番に確認し、効率よく切り分けを行いましょう。