1. 라이브러리
  2. 포트
  3. 포트 보안

업데이트됨 1개월 전

무언가 연결이 안 될 때, 첫 번째 질문은 항상 이것입니다: 포트가 실제로 열려 있는가?

하지만 "열려 있다"는 말의 의미는 어디서 확인하느냐에 따라 달라집니다. 포트가 내 컴퓨터에서는 열려 있어도 방화벽에 막힐 수 있고, 방화벽을 통과해도 ISP에서 막힐 수 있으며, 인터넷 어느 곳에서는 접근되지만 다른 곳에서는 그렇지 않을 수도 있습니다.

포트 확인은 단 하나의 질문이 아닙니다. 세 가지 질문입니다.

세 가지 상태

모든 포트는 다음 세 가지 상태 중 하나에 있습니다:

열림(Open): 서비스가 수신 대기 중이며 연결을 받아들일 준비가 되어 있습니다. 접속하려는 서버를 테스트할 때 원하는 상태가 바로 이것입니다.

닫힘(Closed): 연결 시도가 도달했지만 수신 대기 중인 서비스가 없습니다. "연결이 거부되었습니다"—어찌 보면 친절한 거절입니다. 네트워크 경로는 살아 있지만 서비스가 없는 것입니다.

필터됨(Filtered): 방화벽이 패킷을 소리 없이 버리고 있습니다. 문을 두드려도 아무 소리가 없습니다—거절 응답조차 없습니다. 가장 답답한 상태입니다. 침묵의 이유가 호스트가 존재하지 않아서인지, 포트가 차단되어서인지, 아니면 패킷이 중간 어딘가에서 사라지고 있어서인지 알 수 없기 때문입니다.

이 구분이 중요합니다. 닫힘이라면 서비스를 고쳐야 하고, 필터됨이라면 네트워크 경로를 고쳐야 합니다.

내 컴퓨터 확인하기

Windows

PowerShell을 열고 실행하세요:

Get-NetTCPConnection -State Listen

컴퓨터가 수신 대기 중인 모든 TCP 포트와 해당 프로세스를 보여줍니다.

예전 방식도 여전히 유효합니다:

netstat -ano | findstr LISTENING

-o 플래그를 사용하면 프로세스 ID가 함께 출력되며, 작업 관리자에서 해당 프로세스를 찾아볼 수 있습니다.

macOS 및 Linux

ss 명령이 현대적인 표준입니다:

ss -tuln

TCP(-t), UDP(-u), 수신 대기 중인 포트(-l), 숫자 형식 주소(-n)를 보여줍니다.

각 포트를 소유한 프로세스를 확인하려면:

sudo lsof -i -P -n | grep LISTEN

lsof—"열린 파일 목록 표시(list open files)"—는 네트워크 연결도 파일로 취급합니다. Unix에서는 모든 것이 파일이기 때문입니다.

원격 포트 확인하기

네트워크를 통해 포트를 테스트한다는 것은 연결 시도를 보내고 돌아오는 응답을 살펴보는 것입니다.

Telnet

telnet example.com 80

포트가 열려 있으면 연결 메시지나 빈 화면이 나타납니다(연결되어 입력을 기다리는 상태). 닫혀 있으면 "Connection refused"가 뜹니다. 타임아웃이 발생한다면 필터됨 또는 도달 불가 상태입니다.

Telnet은 TCP만 지원합니다.

Netcat

Netcat(nc)은 두 프로토콜을 모두 지원합니다:

nc -zv example.com 80

-z는 데이터를 전송하지 않고 스캔하고, -v는 자세한 출력을 활성화합니다. UDP의 경우:

nc -zuv example.com 53

범위 스캔도 가능합니다:

nc -zv example.com 20-80

Nmap

Nmap은 다른 도구들과 같은 기능을 하되, 더 많은 것을 알려줍니다—포트가 열려 있는지뿐만 아니라 뒤에서 무엇이 실행 중인지까지:

nmap -p 80,443 example.com

UDP 스캔에는 root 권한이 필요합니다:

sudo nmap -sU -p 53 example.com

UDP에 대해 솔직히 말하자면, UDP는 근본적으로 불확실합니다. TCP에는 핸드셰이크가 있어 연결 성공 여부를 명확히 알 수 있습니다. UDP는 그냥 패킷을 허공으로 던질 뿐입니다. 아무것도 돌아오지 않을 때, 포트가 조용히 수락한 것인지 아니면 방화벽이 다 버리고 있는 것인지 알 수 없습니다. Nmap이 종종 open|filtered를 반환하는 것은 진짜로 구별이 안 되기 때문입니다. 이 모호함은 도구의 한계가 아닙니다. 프로토콜 자체의 특성입니다.

PowerShell

Test-NetConnection example.com -Port 443

별도 설치 없이 ping 결과, TCP 테스트 결과, 타이밍 정보까지 확인할 수 있습니다. 출력에서 TcpTestSucceeded 값을 확인하면 됩니다.

외부 네트워크에서 테스트하기

주의할 점이 있습니다: 내부 네트워크에서 자신의 서버를 테스트하면 방화벽을 완전히 우회할 수 있습니다. 패킷이 외부로 나가지 않아서, 외부 세계에서 접근 가능한지 알 수 없는 것입니다.

외부 관점이 필요합니다.

온라인 포트 체커는 인터넷상의 서버에서 공용 IP로 연결을 시도합니다. 라우터의 포트 포워딩이 제대로 작동하는지, ISP가 특정 포트를 차단하는지, 방화벽 규칙이 의도한 대로 동작하는지 확인할 수 있습니다.

직접 제어하는 원격 서버를 이용하면 더 유연합니다. VPS에 SSH로 접속해 홈 IP를 대상으로 nmap이나 netcat을 실행해 보세요. 동일한 정보를 얻되 도구를 직접 제어할 수 있습니다.

문제가 생겼을 때

포트가 로컬에서 닫혀 있음: 서비스가 실행 중이지 않습니다. 시작하세요.

로컬에서는 열려 있지만 원격에서 닫혀 있음: 방화벽이 트래픽을 차단하고 있습니다. 호스트 방화벽, 보안 그룹, 경로상의 네트워크 방화벽을 순서대로 확인하세요.

연결 타임아웃: 호스트에 도달하지 못하거나 방화벽이 패킷을 조용히 버리고 있습니다. IP 주소를 확인하고 호스트에 ping을 해보세요.

위치마다 결과가 다름: 출처에 따른 필터링이 적용되고 있습니다—지리적 제한, CDN 라우팅, 또는 네트워크별 규칙이 원인일 수 있습니다.

설정은 맞는데 여전히 차단됨: 일부 가정용 ISP는 25번(SMTP), 80번(HTTP), 445번(SMB) 같은 일반 포트의 인바운드 연결을 차단합니다. 설정이 정확한데도 외부 연결이 안 된다면 ISP가 원인일 수 있습니다.

세 가지 질문

로컬은 무엇이 수신 대기 중인지 알려줍니다. 원격은 무엇에 접근할 수 있는지 알려줍니다. 외부는 세계가 무엇에 접근할 수 있는지 알려줍니다. 세 가지 다른 질문, 세 가지 다른 답변입니다.

열림은 누군가 응답하고 있다는 뜻입니다. 닫힘은 아무도 없다는 뜻입니다. 필터됨은 노크조차 닿지 않는다는 뜻입니다.

그리고 반드시 본인이 소유하거나 테스트 권한을 가진 시스템만 스캔하세요. 허가 없이 타인의 인프라를 포트 스캔하는 것은 불쾌한 법적 서신을 받는 지름길입니다.

포트 확인에 관한 자주 묻는 질문

TCP와 UDP 포트 확인의 차이점은 무엇인가요?

TCP 포트는 명확하게 테스트할 수 있습니다. TCP는 핸드셰이크가 필요하기 때문에 연결이 완료되었는지 아닌지 분명히 알 수 있습니다. UDP는 "쏘고 잊기" 방식입니다. 패킷을 보내고 아무것도 돌아오지 않아도, 포트가 조용히 수락한 것인지 방화벽이 버린 것인지 알 수 없습니다. UDP 스캔이 확실한 답 대신 종종 open|filtered를 반환하는 이유가 바로 이것입니다.

포트가 로컬에서는 열려 있는데 외부에서는 닫혀 있는 이유는 뭔가요?

방화벽이 로컬 트래픽은 허용하면서 외부 접근을 차단하고 있는 것입니다. 호스트 기반 방화벽(Windows Firewall, iptables, pf)을 먼저 확인하고, 그다음 서버와 인터넷 사이의 네트워크 방화벽이나 보안 그룹을 확인하세요. 라우터 뒤에 있다면 포트 포워딩 규칙도 점검하세요.

ISP가 포트를 차단할 수 있나요?

네. 많은 가정용 ISP는 홈 사용자가 서버를 운영하거나 악성 소프트웨어가 퍼지는 것을 막기 위해 25, 80, 445번 포트의 인바운드 연결을 차단합니다. 방화벽과 포트 포워딩이 올바른데도 외부 연결이 안 된다면 ISP에 문의해 보세요.

포트 스캔은 불법인가요?

자신의 시스템을 스캔하는 것은 합법입니다. 명시적 허가를 받은 시스템을 스캔하는 것도 합법입니다. 허가 없이 타인의 시스템을 스캔하는 것은 관할 지역에 따라 다른 법적 회색지대에 있습니다—기술적으로 합법인 경우에도 서비스 이용 약관을 위반하고 보안 경보를 유발할 때가 많습니다. 소유하거나 서면 허가를 받은 시스템만 스캔하세요.

이 페이지가 도움이 되었나요?

😔
🤨
😃