ufw 방화벽: 불필요한 것 닫기
5분 만에 ufw를 설정하는 방법이에요. 필요한 포트를 허용하고, 나머지를 닫으며, 주소별로 접근을 제한하고, 자신의 SSH를 차단하지 않는 방법을 알아봐요.
업데이트 2026년 8월 23일
새로 설치한 머신에서는 네트워크에서 수신 대기하는 모든 것이 열려 있어요. 직접 설치한 서비스도 있고, 패키지와 함께 딸려온 서비스도 있죠. 방화벽은 이 문제를 한 번에 해결해요. 목록에 올린 것 외에는 모두 차단해요.
ufw는 커널 규칙을 감싼 간단한 래퍼예요. 대부분의 경우에 충분하고, 더 복잡한 구성은 nftables 문서에서 다뤄요.
기본 구성
apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw enable
ufw status verbose
여기서는 순서가 중요해요. SSH 규칙은 활성화하기 전에 추가해야 해요. 그렇지 않으면 ufw enable이 연결을 끊어버려서, 패널의 콘솔 /hosting/vds/m/<id>이나 복구 모드를 통해 다시 접속해야 하거든요.
패널의 콘솔은 네트워크와 무관하게 동작하므로 완전히 잠길 일은 없어요. 다만 시간이 걸려요.
자주 쓰는 규칙
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow from 203.0.113.5 to any port 22 proto tcp
ufw limit 22/tcp
ufw delete allow 80/tcp
ufw status numbered
ufw delete 3
ufw limit은 30초 안에 여섯 개 넘는 연결을 여는 사람의 속도를 늦춰요. 비밀번호 무차별 대입에 대한 저렴한 방어책이죠. 같은 목적에 더 정교한 도구로는 fail2ban이 있어요.
allow from 규칙은 공개되면 안 되는 서비스에 유용해요. 데이터베이스, 관리자 패널, 메트릭 익스포터 같은 것들이죠.
ufw allow from 203.0.113.5 to any port 5432 proto tcp
결과 확인
ufw status verbose
ss -tulpn
ss는 시스템이 무엇을 수신 대기하는지 보여주고, ufw status는 외부에서 무엇이 통과할 수 있는지 보여줘요. 두 목록의 차이는 닫아둔 서비스이고, 그건 괜찮아요. 반대는 나빠요. ufw에서는 포트가 열려 있는데 리스너가 없는 경우죠.
외부에서는 핑이 아니라 포트로 확인해요.
nc -vz <address> 443
Docker와 ufw
머신에서 Docker를 실행한다면 기억하세요. 컨테이너 포트 포워딩은 ufw 규칙보다 먼저 커널 체인에서 처리돼요. -p 5432:5432로 시작한 컨테이너는 ufw status가 deny를 보여줘도 외부에서 접근할 수 있어요. 이런 포트는 로컬 인터페이스에 바인딩하세요.
docker run -p 127.0.0.1:5432:5432 postgres
흔한 실수
| 실수 | 결과 | 해결 |
|---|---|---|
SSH 규칙 없이 ufw enable | 네트워크 접속 끊김 | 패널 콘솔로 접속해서 ufw allow 22/tcp |
| SSH 포트를 바꾸고 예전 규칙을 남겨둠 | 마찬가지 | 규칙을 먼저, 그다음 포트 |
| 포트는 열려 있는데 서비스가 응답하지 않음 | 서비스가 127.0.0.1에서 수신 대기 중 | 바인드 주소 변경 |
| deny인데도 컨테이너에 접근 가능 | Docker가 ufw를 우회 | 127.0.0.1에 바인딩 |
포트를 닫기 전에
ss -tulpn을 실행하고 그 포트에 무엇이 올라와 있는지 확실히 파악하세요. 나중에 닫아둔 모니터링 포트는 "서비스가 죽었다"처럼 보여요.