CHAPTER 07 · NETWORK
문은 열렸는데
왜 못 들어가지?
프로그램의 Listen 상태와 방화벽 허용, 외부 노출의 차이를 구분합니다.

01
포트는 혼자 열리지 않는다
포트는 실제 문이 아니라 운영체제가 통신을 받을 프로그램을 구분하기 위한 번호입니다.
웹 서버나 SSH 서버 같은 프로그램이 특정 주소와 포트에 바인딩하고 Listen해야 해당 포트가 열린 상태가 됩니다.
프로세스를 종료하면 포트도 더 이상 Listen하지 않습니다. 포트를 연다는 말은 대부분 서비스를 실행한다는 뜻입니다.
$ ss -tulnp
$ sudo lsof -i -P -n
$ systemctl status ssh
$ systemctl status nginx
02
localhost와 0.0.0.0은 다르다
같은 포트라도 어느 주소에 바인딩했는지에 따라 접속 가능한 범위가 달라집니다.
개발 서버가 localhost에만 바인딩되어 있으면 방화벽을 열어도 외부에서는 접속할 수 없습니다. ss 출력에서 Local Address를 함께 확인해야 합니다.

03
경비원이 문 앞에서 막을 수 있다
서비스가 Listen 중이어도 방화벽 정책이 패킷을 차단하면 외부에서 접속할 수 없습니다.
방화벽은 출발지·목적지 IP, 포트, 프로토콜과 연결 상태를 기준으로 허용하거나 차단합니다. 기본 차단 후 필요한 통신만 허용하는 방식이 안전합니다.
UFW는 사용하기 쉬운 관리 도구이며 실제 Linux 방화벽은 nftables 또는 iptables 규칙으로 동작할 수 있습니다.
$ sudo ufw status verbose
$ sudo ufw allow 22/tcp
$ sudo ufw allow from 192.168.0.0/24 to any port 22 proto tcp
$ sudo nft list ruleset
04
열린 포트는 공격 표면이다
외부에서 접근 가능한 서비스가 많을수록 점검하고 보호해야 할 대상도 늘어납니다.
사용하지 않는 서비스는 종료하고, 관리 포트는 허용 IP를 제한하며, 기본 비밀번호를 제거하고, 보안 업데이트와 로그 감시를 적용해야 합니다.
내부에서 curl localhost가 성공하지만 외부에서 실패한다면 바인딩 주소, 호스트 방화벽, 클라우드 보안 그룹, NAT·포트포워딩 순으로 확인합니다.
$ curl localhost:80
$ nc -vz 192.168.0.30 22
$ journalctl -u ssh --since today
CHAPTER REVIEW
이번 장에서 기억할 한 문장
서비스가 실행되고 포트를 Listen하며 방화벽과 경로가 허용되어야 외부에서 접속할 수 있다.