SSD Nodes Learn
가이드 Matt Connor작성자 Matt Connor · 업데이트됨 2026-07-24

리눅스 포트 개념과 ss 명령어로 리스닝 확인하기

포트의 정의와 TCP/UDP 차이점을 설명합니다. ss 명령어를 사용하여 현재 시스템에서 어떤 프로세스가 특정 포트에서 listen 중인지 확인하는 방법을 상세히 안내합니다.

포트의 실제 정의

포트는 하나의 서버가 여러 서비스를 동시에 실행할 때 트래픽이 섞이지 않도록 해주는 번호입니다. VPS에는 하나의 IP 주소가 있지만, 웹 서버, SSH 서버, 데이터베이스를 동시에 실행할 수 있습니다. 패킷이 도착하면 운영 체제는 해당 패킷이 어떤 서비스용인지 알아야 합니다. 포트 번호가 그 해답입니다. 웹 트래픽은 port 443으로, SSH는 port 22로 이동합니다. IP 주소는 패킷을 서버까지 전달하며, 포트는 서버 내의 올바른 프로그램으로 전달합니다.

포트는 16-bit 번호입니다. 16-bit는 0부터 65535까지의 숫자를 제공하며, 0은 예약되어 있습니다. 따라서 실제 포트는 1부터 65535까지 사용됩니다. 1024 미만의 포트는 "well-known" 포트이며, 이를 열기 위해서는 root 권한이 필요합니다. 이것이 SSH용 22, HTTP용 80, HTTPS용 443, DNS용 53과 같은 표준 서비스들이 해당 위치에 존재하는 이유입니다. 1024 이상의 모든 번호는 일반 프로그램에서 자유롭게 사용할 수 있습니다.

포트에는 TCP와 UDP 두 종류가 있으며, 한쪽의 포트 번호는 다른 쪽의 동일한 번호와 별개입니다. TCP는 SSH, HTTP, 데이터베이스와 같이 대부분의 서비스가 사용하는 연결 기반 프로토콜입니다. UDP는 연결이 없는(connectionless) 프로토콜로, DNS나 일부 VPN에서 사용됩니다. 방화벽을 설정할 때 보통 22/tcp와 같이 어떤 프로토콜을 사용할지 지정합니다.

Listening은 프로그램이 포트에서 대기 중임을 의미합니다

연결을 받으려는 프로그램은 커널에 특정 포트에서 "listen"하도록 요청합니다. 그 순간부터 해당 포트는 머신에서 열리며, 방화벽 설정에 따라 해당 포트로 들어오는 모든 요청에 프로그램이 응답합니다. 아무것도 listen하고 있지 않은 포트는 연결을 거부합니다. 따라서 보안 점검의 첫 번째 질문은 "무엇이 어디에서 listen하고 있는가"입니다.

이에 대한 답을 주는 명령어는 ss입니다:

sudo ss -tlnp

플래그의 의미는 다음과 같습니다: TCP (t), listening 소켓만 표시 (l), 숫자 포트 표시 (n, 따라서 22 대신 ssh이 표시됨), 그리고 소유 프로세스 (p). 일반적인 결과 예시:

State   Recv-Q  Local Address:Port   Process
LISTEN  0       0.0.0.0:22           sshd
LISTEN  0       127.0.0.1:5432       postgres
LISTEN  0       [::]:80              nginx

Process 열은 각 포트를 소유한 프로그램을 나타냅니다. 이를 통해 의도하지 않게 실행 중인 프로세스를 추적할 수 있습니다.

Local Address 열이 가장 중요합니다

각 포트 앞의 주소를 주의 깊게 읽어야 합니다. 이 주소가 서비스에 접근할 수 있는 대상을 결정하기 때문입니다. 다음 세 가지 케이스를 자주 보게 됩니다.

0.0.0.0:22은 "이 머신이 가진 모든 IPv4 주소(공용 IP 포함)에서 listen"함을 의미합니다. 방화벽이 허용한다면 인터넷을 통해 해당 서비스에 접근할 수 있습니다.

[::]:80은 IPv6에 대해 동일한 의미를 가집니다. 공용 주소를 포함하여 모든 IPv6 주소에서 listen합니다. 많은 프로그램이 기본적으로 여기에 바인드하며, Linux의 :: 소켓은 종종 IPv4도 함께 수용합니다.

127.0.0.1:5432은 "loopback에서만 listen"함을 의미합니다. 127.0.0.1은 머신이 자기 자신과 통신할 때 사용하는 주소이며, 외부에서는 라우팅할 수 없습니다. 여기에 바인드된 서비스는 방화벽 설정과 관계없이 오직 동일한 서버 내에서만 접근 가능하며, 인터넷에서는 절대 접근할 수 없습니다. 위의 Postgres 예시는 구조적으로 안전합니다.

실질적인 규칙은 다음과 같습니다. 본인의 애플리케이션만 사용하는 데이터베이스, 캐시, 또는 관리 패널은 0.0.0.0이 아닌 127.0.0.1에 바인드해야 합니다. 공용 주소에서 listen하지 않는다면 공격자가 접근할 수 있는 통로가 없습니다.

Listening과 Reachable은 다릅니다

혼란을 줄이기 위한 중요한 차이점이 있습니다. 머신에서 포트가 열려 있다는 것(프로그램이 listen 중임)과 외부에서 해당 포트에 접근 가능하다는 것(방화벽이 허용함)은 다릅니다. 원격 클라이언트가 연결되려면 두 조건이 모두 충족되어야 합니다.

따라서 두 단계의 제어 계층이 존재합니다. 첫째, 각 서비스의 bind 주소를 설정하여 무엇이 listen할지 결정합니다. 둘째, 방화벽을 통해 외부 세계가 무엇에 접근할 수 있는지 결정합니다. 잘 관리되는 서버는 두 가지를 모두 사용합니다. 서비스는 필요한 곳에만 바인드하고, 방화벽은 명시적으로 허용한 것 외에는 모든 것을 차단합니다. ss으로 listen 중인 항목을 확인하는 것이 1단계이며, 방화벽 허용 범위를 결정하는 것이 2단계입니다. 2단계는 firewalls 101 with UFW에서 다룹니다.

여기서 사람들이 실수하는 미묘한 차이가 있습니다. IPv4와 IPv6는 별개입니다. IPv4만 다루는 방화벽은 IPv6의 [::] 서비스를 열어둔 상태로 남겨둡니다. 이 특정 함정에 대해서는 the IPv6 firewall trap 포스트를 참조하십시오.

FAQ

Linux 서버에서 어떤 포트가 열려 있는지 어떻게 확인합니까?

TCP는 sudo ss -tlnp을, UDP는 sudo ss -ulnp을 실행하십시오. 그러면 모든 listening 소켓, 포트, 바인드된 local address, 그리고 소유 프로세스가 나열됩니다. Local Address 열을 확인하십시오. 0.0.0.0 또는 [::]은 서비스가 네트워크에 노출됨을 의미하며, 127.0.0.1은 서비스가 머신 내부에서만 listen함을 의미합니다.

0.0.0.0과 127.0.0.1의 차이는 무엇입니까?

0.0.0.0은 공용 IP를 포함하여 "모든 IPv4 주소에서 listen"함을 의미하므로 네트워크를 통해 서비스에 접근할 수 있습니다. 127.0.0.1은 loopback 주소로, 머신이 자기 자신과 통신할 때 사용하는 주소입니다. 외부에서는 라우팅할 수 없으므로, 이 주소에 바인드된 서비스는 로컬에서만 접근 가능합니다. 내부 서비스는 노출되지 않도록 127.0.0.1에 바인드하십시오.

서비스를 작동시키기 위해 방화벽에서 포트를 열어야 합니까?

다른 머신에서 접근해야 하는 서비스에만 해당됩니다. 127.0.0.1에 바인드된 서비스는 외부에서 접근할 수 없으므로 방화벽 규칙이 필요 없습니다. 0.0.0.0 또는 [::]에 있는 서비스는 트래픽을 허용하기 위한 방화벽 규칙이 필요하며, 규칙을 추가하기 전까지는 기본적으로 차단되어야 합니다.

TCP 포트와 UDP 포트의 차이는 무엇입니까?

TCP는 연결 기반이며 SSH, 웹 서버, 데이터베이스와 같은 대부분의 서비스에서 사용됩니다. UDP는 연결이 없는(connectionless) 프로토콜로, DNS와 일부 VPN에서 사용됩니다. TCP와 UDP에서 동일한 번호는 서로 다른 포트입니다. 따라서 53/tcp53/udp은 서로 다릅니다. 방화벽 규칙을 작성할 때는 22/tcp와 같이 프로토콜을 지정해야 합니다.