LinuxでConnection refusedとConnection timed outが出た時の切り分け手順|ポート・サービス・ファイアウォールを順に確認する

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxトラブルシューティング > LinuxでConnection refusedとConnection timed outが出た時の切り分け手順|ポート・サービス・ファイアウォールを順に確認する
「サーバーへの接続を試みたらConnection refusedと表示された」「Connection timed outが出るのだが、何から調べればいいかわからない」という状況に直面したことはないでしょうか。

この2つのエラーメッセージは、どちらも「つながらない」という結果は同じですが、原因の場所がまったく異なります。エラーの意味を理解せずにむやみに設定を変更しても問題は解消しません。調査の方向性を誤れば、無関係な変更を重ねるばかりで時間を浪費します。

この記事では、RHEL 9系(Rocky Linux 9)およびUbuntu 24.04 LTSを想定環境として、Connection refusedとConnection timed outそれぞれの意味と、ss・systemctl・firewall-cmdを使った3段階の切り分け手順を解説します。

この記事のポイント

・Connection refusedはパケットが届いているがポート/サービス側に問題がある
・Connection timed outはパケット自体が届いていないネットワーク/ファイアウォール側の問題
・ssコマンドでListenポート確認→systemctlでサービス確認→firewall-cmdでルール確認の順で調査
・iptables -nvLのpktsカウンタが増えているルールが遮断箇所の手がかりになる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

「Connection refused」と「Connection timed out」の根本的な違い

2つのエラーメッセージは、TCPの動作レベルで意味が異なります。

Connection refused(接続拒否)は、送ったパケットが相手ホストに届いており、相手のOSがRST(リセット)パケットを返してきた状態です。パケットは相手に着いています。問題はパケットが届いた後の処理にあります。主な原因は次の3つです。
・指定したポートでサービスが起動していない(または指定ポートが間違っている)
・ファイアウォールがREJECTルールで拒否している(DROPと異なりRSTを返す)
・サービスが127.0.0.1などのloopbackアドレスにしかBindしておらず外部接続を受け付けていない

Connection timed out(接続タイムアウト)は、送ったパケットが相手に届かず、一定時間待っても何の応答も返ってこない状態です。パケットが経路のどこかで「消えている」か「止まっている」ことを意味します。主な原因は次の3つです。
・ファイアウォールがDROPルールでパケットを破棄している
・ネットワーク経路に問題がある(ルーティング誤設定・物理断・クラウドVPC設定ミスなど)
・クラウド環境のセキュリティグループやNACLがトラフィックを遮断している

この違いを念頭に置くと、調査の出発点が変わります。Connection refusedはサーバー側(ポート・サービス状態・REJECT設定)から調べ、Connection timed outはネットワーク経路(ping・firewalld)から調べます。

「Connection refused」が出た時の3段階調査

1. ssコマンドでポートがListenしているか確認する

最初に確認すべきは「そのポートでサービスが待ち受けているか」です。Linux ポート確認の全コマンドにまとめているとおり、現在のLinux環境ではssコマンドが標準です。

# ListenしているTCPポートをプロセス名付きで一覧表示する ss -tlnp # 特定ポート(例: 80番)に絞って確認する ss -tlnp | grep ':80' # 出力例(環境により異なります) State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("httpd",pid=1234,fd=4))

LISTEN行が表示されれば、そのポートでプロセスが待ち受けています。出力が空であれば、サービスが起動していないか、想定外のポートでListenしている可能性があります。

また、Local Addressが127.0.0.1:80のようにloopbackアドレスになっている場合、外部からのアクセスは受け付けません。サービスの設定ファイルでListenアドレスを0.0.0.0または::(IPv6全体)に変更する必要があります。

2. systemctl statusでサービスが起動しているか確認する

ssで対象ポートが見つからない場合、次はsystemctlでサービスの状態を確認します。

# HTTPDサービスの状態を確認する(例) systemctl status httpd # 出力例(環境により異なります) * httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled) Active: inactive (dead)

Active: inactive (dead)と表示されていればサービスが停止しています。failedの場合は起動に失敗した状態です。起動するには以下を実行します。

# サービスを起動する systemctl start httpd # OS再起動後も自動起動させる場合 systemctl enable httpd

起動しても再度Connection refusedが出る場合は、ログで起動失敗の理由を確認します。

# サービスのログを直近20行確認する journalctl -u httpd --no-pager | tail -20

設定ファイルの構文エラー、別プロセスによるポート占有など、起動失敗の理由がこのログに記録されています。

3. ファイアウォールがREJECTで拒否していないか確認する

ssでポートがListenしており、サービスも起動しているのにConnection refusedが出る場合、ファイアウォールがREJECTルールで拒否している可能性があります。

# firewalldのアクティブゾーンとルールを確認する firewall-cmd --list-all # 出力例(環境により異なります) public (active) target: default interfaces: eth0 services: ssh dhcpv6-client ports:

許可されているservicesやportsに接続先が含まれていなければ、ファイアウォールが拒否しています。一時的に開放して疎通を確認するには次のコマンドを使います。

# ポートを一時的に開放して確認する(再起動で元に戻る) firewall-cmd --add-port=80/tcp # 疎通が確認できたら永続化する firewall-cmd --add-port=80/tcp --permanent firewall-cmd --reload

iptablesを直接管理している環境ではREJECTルールのパケットカウンタを確認します。

# iptablesのルールとパケットカウンタを確認する iptables -nvL # 出力例(環境により異なります) Chain INPUT (policy ACCEPT) pkts bytes target prot opt in out source destination 37 2220 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080

pktsの値が増加していれば、そのルールにマッチしたパケットが存在します。

「Connection timed out」が出た時の3段階調査

1. pingとtracerouteでネットワーク疎通を確認する

まずネットワーク経路が通っているかを確認します。

# ホストへの到達確認(4パケット送信) ping -c 4 <接続先IPまたはホスト名> # ネットワーク経路を確認する traceroute <接続先IP> # または tracepath <接続先IP>

pingが通るのにConnection timed outが出る場合:ICMPは通るがTCPポートが通らない状態です。ファイアウォールがICMPは許可しつつ特定のTCPポートだけをDROPしていることが多く、次のステップで確認します。

pingも通らない場合:ネットワーク経路そのものに問題があります。ルーティングの設定ミス(ip route showで確認)や、クラウド環境のVPC設定・セキュリティグループを確認します。

2. firewall-cmdのDROPルールとパケットカウンタを確認する

pingが通るがTCPポートへの接続がタイムアウトする場合、DROPルールが疑われます。

# firewalldのルールを確認する firewall-cmd --list-all # iptablesのDROPルールとカウンタのみ抽出する iptables -nvL | grep DROP # 出力例(環境により異なります) 128 7680 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443

pktsが増えているDROPルールがあれば、そこでパケットが破棄されています。

iptablesでどのルールにマッチしているかを動的に確認するには、watch -n 2 'iptables -nvL'でカウンタの変化をリアルタイムで監視しながら接続を試みると、どのルールがヒットしているかがわかります。

3. それでも解消しない場合の追加確認事項

サービスが起動しており、ファイアウォールルールにも問題が見当たらないのにConnection timed outが続く場合は、次を確認します。

SELinuxによる通信制限:SELinuxが有効な環境では、設定済みポート以外へのBindや通信をdeniedにすることがあります。

# SELinuxのアクセス拒否ログを確認する grep 'denied' /var/log/audit/audit.log | tail -20 # SELinuxの現在の状態を確認する sestatus

クラウド環境固有の制限:AWSのセキュリティグループ・NACLや、Azureのネットワークセキュリティグループ(NSG)はLinuxのfirewalldとは独立して動作します。Linuxサーバー側のファイアウォールを開放しても、クラウド側で遮断していればConnection timed outになります。この場合、クラウドコンソールのセキュリティグループ設定を確認します。

カーネルパラメータによる接続数制限:高トラフィック環境ではnet.core.somaxconnやnet.ipv4.tcp_max_syn_backlogが不足して新規接続がタイムアウトすることがあります。

# 現在の設定値を確認する(出力例) sysctl net.core.somaxconn # net.core.somaxconn = 128 sysctl net.ipv4.tcp_max_syn_backlog # net.ipv4.tcp_max_syn_backlog = 512

値が低く高トラフィックが原因と思われる場合は、/etc/sysctl.confに設定を追記してsysctl -pで反映します。

よくあるシナリオ別・原因と対処の早見表

状況 エラー 原因 最初に使うコマンド
SSHで接続できない Connection refused sshd停止またはポート変更 ss -tlnp | grep ssh
HTTPSが開かない Connection refused httpd/nginx停止またはポート443でListen未 ss -tlnp | grep ':443'
pingは通るが接続できない Connection timed out firewalldのDROPルール firewall-cmd --list-all
クラウドVMに外部から接続できない Connection timed out セキュリティグループの遮断 Linux側確認後にクラウドコンソールを確認
ローカルからは接続できるが外部から接続できない Connection refused Listenアドレスが127.0.0.1のみ ss -tlnpでLocal Addressを確認

本記事のまとめ

Connection refusedとConnection timed outの切り分けポイントをまとめます。
観点 Connection refused Connection timed out
パケットの到達 ○ 相手に届いている(RSTが返る) × 届いていない(無応答)
主な原因 サービス停止・ポート違い・REJECT DROPルール・ネットワーク経路断・クラウド遮断
最初に確認するコマンド ss -tlnp / systemctl status ping / traceroute
ファイアウォール確認のポイント REJECTルールのpktsカウンタ DROPルールのpktsカウンタ
「Connection refusedかtimed outか」を判断するだけで調査の方向性が定まります。ssでポートのListeningを確認し、systemctlでサービス状態を確認し、firewall-cmdでルールを確認するという3段階の流れを習慣化することで、ネットワーク障害時の初動が格段に速くなります。

こうした切り分けスキルをはじめ、Linuxサーバー管理に必要な技術を体系的に学びたい方は、Linux Master Pro Seminarをご覧ください。20年以上の指導実績をもとに、現場で通用するLinuxスキルを2日間のハンズオンで習得できます。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、

Linuxサーバー構築入門マニュアル(図解60P)を無料でプレゼントしています。

>> Linux Master Pro Seminarの詳細はこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

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

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

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

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。