서버에서 특정 포트를 "열어둔다"는 것은 두 가지 단계가 필요합니다. 첫 번째는 해당 포트를 점유하여 대기하는 프로세스(리스너)를 띄우는 것이고, 두 번째는 OS 방화벽에서 해당 포트로의 접근을 허용하는 것입니다.
테스트용으로 빠르게 띄우는 방법과 방화벽 설정법을 정리해 드립니다.
가장 간단한 방법은 nc(netcat)를 사용하는 것입니다. 도구가 없다면 python을 활용할 수도 있습니다.
# -l: Listen, -p: Port
nc -l -p 8080# -u: UDP
nc -lu -p 8080ncat(nmap 패키지)을 쓰신다면 -k 옵션을 추가해 클라이언트가 접속을 끊어도 계속 대기하게 할 수 있습니다.python3 -m http.server 8080# udp_server.py
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", 8080))
print("UDP server listening on 8080...")
while True:
data, addr = sock.recvfrom(1024)
print(f"Received: {data} from {addr}")리스너를 띄웠어도 방화벽에서 막히면 외부 접속이 안 됩니다. OS별 명령어가 다릅니다.
# TCP 8080 허용
sudo firewall-cmd --permanent --add-port=8080/tcp
# UDP 8080 허용
sudo firewall-cmd --permanent --add-port=8080/udp
# 적용
sudo firewall-cmd --reload
sudo ufw allow 8080/tcp
sudo ufw allow 8080/udp
# TCP 8080 인바운드 규칙 추가
New-NetFirewallRule -DisplayName "Test_TCP_8080" -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow
# UDP 8080 인바운드 규칙 추가
New-NetFirewallRule -DisplayName "Test_UDP_8080" -Direction Inbound -LocalPort 8080 -Protocol UDP -Action Allow
서버 내부에서 아래 명령어로 내 프로세스가 포트를 잘 잡고 있는지 확인하세요.
# TCP 리스닝 확인
ss -ntlp | grep 8080
# UDP 리스닝 확인
ss -nulp | grep 8080
0.0.0.0:8080: 모든 인터페이스에서 접속 허용 상태127.0.0.1:8080: 서버 내부(Local)에서만 접속 가능 상태 (외부 접속 불가)대규모 인프라(K8s 등)를 운영하신다면, OS 방화벽 외에도 클라우드 보안 그룹(Security Group)이나 네트워크 ACL, 혹은 쿠버네티스의 NetworkPolicy가 가로막고 있지는 않은지 반드시 확인해야 합니다.
특히 UDP의 경우, 일부 클라우드 로드밸런서(LB)나 방화벽 장비에서 기본적으로 차단되어 있거나 세션 유지 시간이 매우 짧게 설정된 경우가 많으니 이 점 유의하세요!
==
서버 간 네트워크 통신 가능 여부를 확인하는 것은 인프라 트러블슈팅의 기본입니다. 특히 에어갭(Air-gapped) 환경이나 폐쇄망을 관리하신다면, 별도의 도구 설치 없이 기본 명령어로 확인하는 방법이 매우 중요합니다.
주요 도구별 사용법을 정리해 드립니다.
대부분의 리눅스 배포판에 설치되어 있으며, TCP와 UDP 모두 지원합니다.
# -z: 스캔 모드, -v: 상세 출력, -w: 타임아웃(초)
nc -zv -w 3 <IP주소> <포트번호># -u: UDP 모드
nc -zuv -w 3 <IP주소> <포트번호>주의: UDP는 비연결형 프로토콜이라 포트가 열려 있어도 응답을 보내지 않는 경우가 많습니다.
succeeded!가 뜨지 않더라도 방화벽에서 거부(Refused또는Admin Prohibited) 메시지가 오는지 확인해야 합니다.
네트워크 보안 및 포트 스캔의 표준 도구입니다.
# -sT: TCP 연결 스캔, -sU: UDP 스캔, -p: 포트 지정
sudo nmap -sT -sU -p 80,443,53 <IP주소>nc나 telnet이 설치되지 않은 최소 설치(Minimal) 환경에서 유용합니다.
timeout 3 bash -c "cat < /dev/tcp/<IP주소>/<포트번호>" && echo "Open" || echo "Closed"timeout 3 bash -c "cat < /dev/udp/<IP주소>/<포트번호>" && echo "Sent" || echo "Failed"Windows 서버 간 혹은 클라이언트에서 서버 접속 여부를 확인할 때 사용합니다.
가장 강력하고 권장되는 명령어입니다.
Test-NetConnection -ComputerName <IP주소> -Port <포트번호>TcpTestSucceeded : True가 나오면 연결 성공입니다.PowerShell 기본 명령어에는 UDP 전용 테스트가 없으므로 .NET 클래스를 활용해야 합니다.
$udpClient = New-Object System.Net.Sockets.UdpClient
$udpClient.Connect("<IP주소>", <포트번호>)
# UDP는 데이터 전송 후 에러가 없으면 열려있다고 가정하는 경우가 많음
netstat -tulnp | grep <포트번호>ss -tulnp | grep <포트번호>ping은 가는데 특정 서비스만 안 된다면, 특히 쿠버네티스 CNI나 VPN 환경일 경우 패킷 파편화(Fragmentation) 문제일 수 있습니다.tcpdump로 패킷이 도달하는지 직접 찍어보는 것이 확실합니다.어느 도구를 사용하는 것이 현재 환경에 가장 적합하신가요? 상황에 맞는 스크립트가 필요하시면 바로 작성해 드릴 수 있습니다.