Sửa lỗi '[WinError 10061] No connection could be made because the target machine actively refused it' trên Windows

beginner🪟 Windows2026-04-23| Windows 10/11, Python 3.x, mọi ứng dụng TCP client (requests, socket, httpx, v.v.)

Error Message

[WinError 10061] No connection could be made because the target machine actively refused it
#windows#socket#networking#python#connection

Nguyên nhân gây ra lỗi này

Bạn đang chạy một script Python, REST client, hoặc bất kỳ công cụ nào dựa trên TCP, và gặp phải:

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

Đây không phải timeout. Windows đã gửi lại gói TCP RST ngay lập tức — nghĩa là có gì đó chủ động nói "không." Hoặc không có gì đang lắng nghe trên cổng đó, service bị crash, hoặc tường lửa đang chặn kết nối ở tầng ứng dụng.

Các tình huống thường gặp:

  • Kết nối đến dev server local chưa được khởi động
  • Ứng dụng trỏ đến localhost:5432 nhưng PostgreSQL chưa chạy
  • Kết nối Redis/RabbitMQ/Elasticsearch trong Docker khi container chưa sẵn sàng
  • Kiểm tra Python socket client trước khi khởi động server
  • Kết nối đến service từ xa bị Windows Firewall chặn cổng

Bước 1 — Xác nhận những gì đang thực sự lắng nghe

Trước khi làm bất cứ điều gì, hãy kiểm tra xem có gì đang lắng nghe trên cổng đó không. Mở PowerShell hoặc Command Prompt và chạy:

# Kiểm tra xem có gì đang lắng nghe trên cổng 8080 không (thay bằng cổng của bạn)
netstat -ano | findstr :8080

# Hoặc liệt kê tất cả các cổng đang lắng nghe
netstat -ano | findstr LISTENING

Không có kết quả cho cổng của bạn? Không có gì đang lắng nghe — chỉ cần khởi động service là xong.

Để xác định process nào đang chiếm một cổng:

# Lấy PID từ kết quả netstat, rồi chạy:
tasklist /FI "PID eq 1234"

PowerShell cho kết quả tương tự nhưng rõ ràng hơn:

Get-NetTCPConnection -LocalPort 8080 -State Listen

Bước 2 — Khởi động service đích

Không có gì lắng nghe thì không có gì để kết nối. Hãy khởi động server:

# Python HTTP server
python -m http.server 8080

# Flask app
flask run --port 8080

# PostgreSQL (qua services)
net start postgresql-x64-15

# Redis (nếu đã cài đặt như một service)
net start Redis

# Hoặc qua panel Services
services.msc

Chạy lại lệnh ban đầu sau khi khởi động. Lỗi biến mất? Xong rồi.

Bước 3 — Kiểm tra Windows Firewall

Service đang chạy nhưng lỗi vẫn còn? Windows Firewall có thể là thủ phạm. Nó có thể chặn các cổng ở tầng ứng dụng — đặc biệt với kết nối inbound từ các máy khác hoặc Docker container.

Kiểm tra xem có rule nào tồn tại cho cổng của bạn không:

# Chạy PowerShell với quyền Administrator
Get-NetFirewallRule -Action Allow | Where-Object { $_.Enabled -eq 'True' } | Get-NetFirewallPortFilter | Where-Object { $_.LocalPort -eq '8080' }

Để thêm rule cho phép traffic inbound trên cổng 8080:

# PowerShell với quyền Administrator
New-NetFirewallRule -DisplayName "Allow port 8080" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow

Thích dùng giao diện đồ họa? Vào Windows Defender Firewall → Advanced Settings → Inbound Rules → New Rule → Port → TCP → 8080 → Allow.

Bước 4 — Sửa địa chỉ kết nối trong code

Một lỗi Python rất phổ biến: bind server với 127.0.0.1 nhưng kết nối từ process khác bằng địa chỉ khác (hoặc ngược lại).

# Phía server — chỉ bind với localhost
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 9000))  # Chỉ chấp nhận kết nối cục bộ
server.listen()

# Phía client — phải khớp chính xác
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 9000))  # OK
# client.connect(('0.0.0.0', 9000))  # SAI — WinError 10061

Bind với 0.0.0.0 chấp nhận kết nối trên tất cả các network interface. Bind với 127.0.0.1 giới hạn chỉ kết nối cục bộ. Client phải kết nối đến địa chỉ mà server đang thực sự lắng nghe — không phải địa chỉ nào tùy tiện.

Bước 5 — Xử lý race condition trong code

Khi ứng dụng khởi động một subprocess server và ngay lập tức cố kết nối, server có thể chưa sẵn sàng. Hãy thêm vòng lặp retry thay vì gọi connect() trực tiếp:

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  # Kết nối thành công
        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)
# Bây giờ an toàn để thực hiện kết nối thực sự

Bước 6 — Kiểm tra antivirus và tường lửa bên thứ ba

Vẫn thấy WinError 10061 sau tất cả những bước trên? Phần mềm bảo mật bên thứ ba thường là thủ phạm ẩn. Windows Defender Antivirus, Kaspersky, Norton, Bitdefender — tất cả đều có lớp bảo vệ mạng có thể chặn truy cập cổng ngay cả khi các rule Windows Firewall đã được cấu hình hoàn hảo.

  • Tạm thời tắt AV và kiểm tra kết nối
  • Kiểm tra log bảo vệ mạng của AV để tìm kết nối bị chặn
  • Thêm ứng dụng hoặc file thực thi Python vào danh sách ngoại lệ của AV

Xác minh đã sửa được lỗi

Dùng Test-NetConnection trong PowerShell — tương đương Windows của nc -zv:

# Kiểm tra kết nối đến localhost cổng 8080
Test-NetConnection -ComputerName localhost -Port 8080

# Kết quả khi thành công:
# TcpTestSucceeded : True

# Kết quả khi vẫn bị lỗi:
# TcpTestSucceeded : False

Hoặc kiểm tra trực tiếp trong 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')

Mẹo thêm

Đang debug sự cố mạng liên quan đến dải IP, VPN, hoặc xung đột Docker subnet? Subnet Calculator trên ToolCraft giúp bạn nhanh chóng kiểm tra dải CIDR và xác định xem hai địa chỉ có cùng mạng không — hữu ích khi ứng dụng kết nối đến container qua bridge network mà bạn không chắc IP có thể đến được không. Chạy hoàn toàn trên trình duyệt, không tải dữ liệu lên.

Tóm tắt nhanh — Nguyên nhân WinError 10061

  • Không có service nào đang lắng nghe → Khởi động server trước
  • Sai số cổng → Kiểm tra config server so với config client
  • Sai địa chỉ host → Địa chỉ bind phải khớp với địa chỉ kết nối
  • Windows Firewall chặn → Thêm inbound rule cho cổng đó
  • Service bị crash → Kiểm tra Event Viewer → Windows Logs → Application
  • Race condition → Thêm vòng lặp retry trước khi kết nối
  • Antivirus chặn → Kiểm tra log mạng của AV hoặc thêm ngoại lệ

Related Error Notes