Windowsで「[WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした」を修正する

beginner🪟 Windows2026-04-23| Windows 10/11、Python 3.x、任意のTCPクライアントアプリケーション(requests、socket、httpx など)

Error Message

[WinError 10061] No connection could be made because the target machine actively refused it
#windows#socket#ネットワーク#python#接続

このエラーが発生する原因

Pythonスクリプト、RESTクライアント、またはTCPベースのツールを実行中に、次のエラーが表示されます:

ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

これはタイムアウトではありません。Windowsが即座にTCP RSTパケットを返した — つまり、何かが「拒否」したということです。そのポートで待ち受けているものが存在しないか、サービスがクラッシュしたか、ファイアウォールがアプリケーション層で接続をブロックしています。

よくある発生状況:

  • まだ起動していないローカル開発サーバーへの接続
  • アプリが localhost:5432 を参照しているが、PostgreSQLが起動していない
  • コンテナが正常起動する前のDocker内のRedis/RabbitMQ/Elasticsearchへの接続
  • サーバーを起動する前にPythonの socket クライアントをテストしている
  • Windowsファイアウォールがポートをブロックしているリモートサービスへの接続

ステップ1 — 実際に待ち受けているものを確認する

何かを変更する前に、そのポートで何かが待ち受けているかどうかを確認します。PowerShellまたはコマンドプロンプトを開いて実行します:

# ポート8080で待ち受けているものを確認する(対象のポートに変更してください)
netstat -ano | findstr :8080

# またはすべてのリッスン中のポートを一覧表示する
netstat -ano | findstr LISTENING

指定したポートに出力がない場合、何も待ち受けていません — サービスを起動するだけで解決です。

ポートを所有しているプロセスを特定するには:

# netstatの出力からPIDを取得してから:
tasklist /FI "PID eq 1234"

PowerShellを使うと同じ情報をよりすっきり確認できます:

Get-NetTCPConnection -LocalPort 8080 -State Listen

ステップ2 — 対象サービスを起動する

待ち受けているものがなければ、接続先もありません。サーバーを起動します:

# Python HTTPサーバー
python -m http.server 8080

# Flaskアプリ
flask run --port 8080

# PostgreSQL(サービス経由)
net start postgresql-x64-15

# Redis(サービスとしてインストールされている場合)
net start Redis

# またはサービスパネル経由
services.msc

起動後に元のコマンドを再実行してください。エラーが消えた場合は完了です。

ステップ3 — Windowsファイアウォールを確認する

サービスは起動しているのにエラーが続く場合、Windowsファイアウォールが原因の可能性が高いです。特に他のマシンやDockerコンテナからの受信接続に対して、アプリケーションレベルでポートをブロックすることがあります。

対象ポートのルールが存在するか確認します:

# PowerShellを管理者として実行
Get-NetFirewallRule -Action Allow | Where-Object { $_.Enabled -eq 'True' } | Get-NetFirewallPortFilter | Where-Object { $_.LocalPort -eq '8080' }

ポート8080への受信トラフィックを許可するルールを追加するには:

# 管理者としてPowerShellで実行
New-NetFirewallRule -DisplayName "Allow port 8080" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow

GUIを使う場合は、Windowsセキュリティ → 詳細設定 → 受信の規則 → 新しい規則 → ポート → TCP → 8080 → 許可 の順に進みます。

ステップ4 — コード内の接続アドレスを修正する

よくあるPythonの間違い:サーバーを 127.0.0.1 にバインドしているのに、別のプロセスから異なるアドレスを使って接続しようとする(またはその逆)パターンです。

# サーバー側 — localhostのみにバインド
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 9000))  # ローカル接続のみ受け付ける
server.listen()

# クライアント側 — 完全に一致させる必要がある
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 9000))  # OK
# client.connect(('0.0.0.0', 9000))  # 誤り — WinError 10061

0.0.0.0 にバインドすると、すべてのネットワークインターフェースからの接続を受け付けます。127.0.0.1 にバインドするとローカルのみに制限されます。クライアントは、サーバーが実際に待ち受けているアドレスに接続しなければなりません。

ステップ5 — コードの競合状態を処理する

アプリがサブプロセスのサーバーを起動してすぐに接続しようとすると、サーバーがまだ準備できていない場合があります。素の connect() ではなく、リトライループを追加してください:

import socket
import time

def wait_for_port(host: str, port: int, timeout: float = 10.0):
    start = time.time()
    while True:
        try:
            with socket.create_connection((host, port), timeout=1):
                return True  # 接続成功
        except (ConnectionRefusedError, OSError):
            if time.time() - start >= timeout:
                raise TimeoutError(f"Port {port} not available after {timeout}s")
            time.sleep(0.5)

wait_for_port('127.0.0.1', 8080)
# これで安全に本来の接続を行える

ステップ6 — アンチウイルスとサードパーティ製ファイアウォールを確認する

これだけ試してもWinError 10061が続く場合、サードパーティ製セキュリティソフトが隠れた原因になっていることがよくあります。Windows Defender Antivirus、Kaspersky、Norton、Bitdefenderなどはいずれもネットワーク保護層を持っており、Windowsファイアウォールのルールが完璧に設定されていてもポートアクセスをブロックすることがあります。

  • 一時的にアンチウイルスを無効にして接続をテストする
  • アンチウイルスのネットワーク保護ログでブロックされた接続を確認する
  • アプリまたはPython実行ファイルをアンチウイルスの除外リストに追加する

修正の確認

PowerShellで Test-NetConnection を使用します — Windowsにおける nc -zv の相当コマンドです:

# localhostのポート8080への接続をテスト
Test-NetConnection -ComputerName localhost -Port 8080

# 正常な場合の期待される出力:
# TcpTestSucceeded : True

# まだ問題がある場合の期待される出力:
# TcpTestSucceeded : False

またはPythonで直接テストします:

import socket
try:
    s = socket.create_connection(('127.0.0.1', 8080), timeout=3)
    print('Connection OK')
    s.close()
except ConnectionRefusedError:
    print('Still refused — service not listening')
except TimeoutError:
    print('Timeout — firewall may be dropping packets silently')

ヒント

IPアドレス範囲、VPN、またはDockerサブネットの競合を含むネットワーク問題をデバッグしていますか?ToolCraftのサブネット計算機を使えば、CIDRレンジの確認や2つのアドレスが同一ネットワーク上にあるかどうかを素早く検証できます — アプリがブリッジネットワーク経由でコンテナに接続しているとき、IPアドレスに到達できるかどうか不明な場合に便利です。ブラウザ上で完全に動作し、データのアップロードは不要です。

クイックリファレンス — WinError 10061の原因

  • 待ち受けているサービスがない → まずサーバーを起動する
  • ポート番号が間違っている → サーバー設定とクライアント設定を確認する
  • ホストアドレスが間違っている → バインドアドレスと接続アドレスを一致させる
  • Windowsファイアウォールがブロックしている → ポートの受信ルールを追加する
  • サービスがクラッシュしている → イベントビューアー → Windowsログ → アプリケーションを確認する
  • 競合状態 → 接続前にリトライループを追加する
  • アンチウイルスがブロックしている → AVのネットワークログを確認するか除外設定を追加する

Related Error Notes