📚 네트워크 · 패킷 분석 › 02. 포트 · 프로토콜 분석 — 84편
이전 글: 83. DB 포트(3306·1433·5432·1521·6379) 노출 점검 · 다음 글: 85. Windows Service Port
Linux 서버의 포트 목록을 읽으려면 "이 번호는 어떤 데몬이 여는가"를 알아야 합니다. ss의 사용법과 Listening Port 점검 절차는 리눅스 시리즈에서 다뤘습니다.
이 글은 점검 절차가 아니라 포트 ↔ 데몬 대응표에 집중합니다. 웹·메일·DB 포트는 81~83편에서 따로 다루므로 여기서는 Linux 운영에 공통으로 등장하는 포트를 봅니다.
| 포트 | 전송 | 서비스 | 대표 데몬(프로세스) | 비고 |
|---|---|---|---|---|
| 22 | TCP | SSH | sshd | 원격 관리 (65. SSH) |
| 53 | UDP/TCP | DNS | systemd-resolved, named, dnsmasq | resolved는 127.0.0.53에서만 수신 |
| 68 | UDP | DHCP 클라이언트 | NetworkManager, dhclient 등 | 서버가 아닌 클라이언트 쪽 |
| 111 | TCP/UDP | rpcbind | rpcbind | NFSv3 등 RPC 사용 시 (74. NFS) |
| 123 | UDP | NTP | chronyd | 서버로 쓸 때만 외부 수신 |
| 323 | UDP | chrony 제어 | chronyd | localhost 전용, chronyc가 사용 |
| 514 | UDP/TCP | Syslog 수신 | rsyslogd | 중앙 로그 서버로 설정할 때만 |
| 631 | TCP | 인쇄(IPP) | cupsd | 데스크톱 설치에서 흔함 |
| 5353 | UDP | mDNS | avahi-daemon | 데스크톱·일부 설치 |
| 9090 | TCP | 웹 관리 콘솔 | cockpit (systemd 소켓) | Rocky에서 활성화 시 |
Linux에서 포트를 여는 방식은 두 가지이며, 이 차이가 추적 방법을 바꿉니다.
① 데몬이 직접 여는 방식
systemctl start sshd
↓
sshd 프로세스 실행 → bind(0.0.0.0:22) → listen()
↓
ss -tlnp 에 users:(("sshd",pid=...)) 표시
② systemd 소켓 활성화 방식
systemctl enable --now cockpit.socket
↓
systemd(PID 1)가 먼저 9090을 열고 대기
↓ 첫 연결이 오면
cockpit 서비스 프로세스 기동 → 연결 넘겨줌
↓
연결 전에는 ss -tlnp 에 "systemd" 가 9090 소유자로 표시
ss에 systemd만 보여 "시스템이 연 포트"로 오해하기 쉽습니다. systemctl list-sockets로 어느 유닛의 소켓인지 확인합니다.ssh.socket 방식이어서 같은 현상이 나타날 수 있습니다.바인드 주소에 따라 같은 포트라도 의미가 다릅니다.
| 예 | 바인드 주소 | 의미 |
|---|---|---|
127.0.0.53%lo:53 | 루프백 전용 | systemd-resolved의 로컬 DNS 스텁, 외부 노출 아님 |
127.0.0.1:323 | 루프백 전용 | chronyd 제어 포트, 정상 |
127.0.0.1:25 | 루프백 전용 | 로컬 메일 전달용 MTA |
0.0.0.0:22 / [::]:22 | 모든 IPv4 / IPv6 | 외부 수신 가능, 방화벽 확인 필요 |
192.168.122.1:53 | 가상 브리지 | libvirt의 dnsmasq(가상 머신용 DNS·DHCP) |
설치 직후 기본 상태는 배포판과 설치 유형에 따라 다릅니다. 아래는 일반적인 경향이며 반드시 실제 목록으로 확인해야 합니다.
| 항목 | Rocky Linux (Server 설치) | Ubuntu Server |
|---|---|---|
| SSH | sshd.service, 22 | ssh.service 또는 ssh.socket, 22 |
| 로컬 DNS | 보통 없음 | systemd-resolved, 127.0.0.53:53 |
| 시간 동기화 | chronyd (323 localhost) | systemd-timesyncd 또는 chronyd |
| 웹 관리 | cockpit.socket (활성화하면 9090) | 기본 없음 |
| 방화벽 도구 | firewalld | ufw (기본 비활성) |
에이전트형 보안·모니터링 도구는 서버가 포트를 여는 것이 아니라 밖으로 접속하는 경우가 많습니다. 예를 들어 Wazuh 에이전트는 매니저의 1514/TCP(이벤트 전송)·1515/TCP(등록)로 연결하고, Zabbix 에이전트는 10050/TCP에서 수신합니다(설정 기본값 기준).
실습 예시 — 본인 소유 Linux VM에서 포트 → 프로세스 → systemd 유닛 → 패키지 순으로 역추적합니다.
# 1) TCP·UDP LISTEN 목록과 프로세스
sudo ss -tulnp
# 2) systemd가 대신 연 소켓 확인
systemctl list-sockets
# 3) PID로 소속 유닛 확인 (예: PID 812)
systemctl status 812
# 4) 실행 파일 → 패키지
readlink /proc/812/exe
rpm -qf /usr/sbin/sshd # Rocky
dpkg -S /usr/sbin/sshd # Ubuntu
ss -tulnp 출력 형식 예시(Ubuntu Server, 값은 환경마다 다름, 일부 생략):
Netid State Local Address:Port Process
udp UNCONN 127.0.0.54:53 users:(("systemd-resolve",pid=560,fd=16))
udp UNCONN 127.0.0.53%lo:53 users:(("systemd-resolve",pid=560,fd=14))
tcp LISTEN 127.0.0.53%lo:53 users:(("systemd-resolve",pid=560,fd=15))
tcp LISTEN 0.0.0.0:22 users:(("sshd",pid=812,fd=3),("systemd",pid=1,fd=112))
tcp LISTEN [::]:22 users:(("sshd",pid=812,fd=4),("systemd",pid=1,fd=113))
22번에 sshd와 systemd가 함께 보이면 소켓 활성화 방식입니다. 53번은 루프백에만 있으므로 외부 DNS 서비스가 아닙니다.
📷 [실습 화면 삽입 위치]
ss -tulnp와systemctl list-sockets를 나란히 두고 포트별 유닛을 대응시킨 화면
| 흔적 위치 | 확인할 수 있는 것 |
|---|---|
서버 (ss, systemctl) | 포트·프로세스·유닛·바인드 주소 |
| 패키지 이력 | 새 서비스 설치 시점 (Rocky dnf history, Ubuntu /var/log/apt/history.log) |
| 방화벽 로그 | 해당 포트로의 외부 접근 시도 |
| 에이전트(Wazuh 등) | 리슨 포트 변화 감시 결과(설정 시) |
관제자가 확인할 질문
/usr/sbin/...)와 일치하는가?오탐 주의: 같은 번호라도 배포판·설치 유형마다 기본 서비스가 다릅니다. 데스크톱 설치의 631·5353, 가상화 호스트의 192.168.122.1:53은 정상 구성입니다. 판단은 포트 번호가 아니라 프로세스·유닛·경로로 합니다.
ss에 systemd로 보이므로 systemctl list-sockets로 유닛을 확인합니다.