UFW 방화벽 포트 3개만 열기 — VPS 해킹 차단 1분 설정 가이드 (2026)

VPS를 빌리고 가장 먼저 해야 할 일이 방화벽 설정입니다. 근데 많은 분들이 이걸 미룹니다. 기본적으로 리눅스 서버는 65,535개의 포트가 전부 열려 있거나, 아니면 아무 보호도 없이 인터넷에 노출되어 있습니다. 방화벽이 꺼져 있다면, 지금 이 순간에도 누군가가 열린 포트를 스캔하고 있습니다. UFW(Uncomplicated Firewall)는 이걸 1분 만에 해결합니다.


포트가 열려 있으면 어떻게 되나

서버에는 수많은 서비스가 포트를 점유합니다. SSH(22번), HTTP(80번), HTTPS(443번)는 기본이고, 데이터베이스(3306, 5432), Redis(6379), 모니터링 도구(9090) 등등. 이 포트들이 외부에 그대로 노출되면 공격자가 스캐너 하나로 전부 찾아냅니다.

특히 위험한 건 데이터베이스 포트입니다. MySQL 3306번이나 Redis 6379번이 인터넷에 열려 있으면, 비밀번호가 없는 경우(기본 설정) 누구나 접속해서 데이터를 빼갈 수 있습니다. Redis는 기본적으로 인증이 없습니다. 6379번이 열려 있으면 명령어 한 줄로 서버 제어권을 넘겨주는 셈입니다.

전 세계의 봇넷이 24시간 IP 대역을 스캔하고 있습니다. 새로 VPS를 만들면 보통 10분 안에 첫 스캔이 들어옵니다. 방화벽 없이 서버를 운영하는 건 현관문을 열어둔 채 여행을 가는 것과 같습니다. VPS 제공자 선택과 마찬가지로 보안은 기본 중의 기본입니다.

UFW가 하는 일

UFW는 ‘다 들어올 수 없고, 초대장 있는 사람만 들어와’라고 하는 클럽 보안맨 같습니다. 기본 정책을 ‘들어오는 건 전부 차단’으로 잡고, 필요한 포트만 선택적으로 엽니다.

Ubuntu, Debian 계열에서 기본 제공됩니다. 설치가 돼 있지 않다면 apt install ufw 한 줄이면 됩니다. 복잡한 iptables 규칙을 직접 짜지 않아도 됩니다. UFW가 사용하기 쉬운 명령어로 iptables를 대신 설정해 줍니다. 기존 UFW 3단계 가이드에서 다룬 기초를 넘어, 실전에서 자주 쓰는 패턴까지 정리합니다.

포트 3개만 열기 — 1분 설정

VPS에서 웹 서버를 운영한다면 필요한 포트는 보통 3개입니다. SSH(22번), HTTP(80번), HTTPS(443번). 이 세 개만 열고 나머지 6만 개는 전부 닫습니다.

# 1. 기본 정책: 들어오는 건 전부 차단, 나가는 건 전부 허용
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 2. 포트 3개만 허용 (SSH, HTTP, HTTPS)
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 3. 방화벽 활성화
sudo ufw enable

# 4. 상태 확인
sudo ufw status verbose

ufw enable을 입력하면 ‘기존 SSH 연결이 끊길 수 있다’는 경고가 나옵니다. 22번 포트를 먼저 허용했기 때문에 문제없습니다. y를 누르면 방화벽이 켜집니다.

status verbose를 확인하면 22, 80, 443번만 ALLOW로 뜨고 나머지는 전부 DENY인 걸 볼 수 있습니다. 이제 6만 4천 개 포트는 전부 막혀 있습니다. 데이터베이스, Redis, 모니터링 포트를 외부에서 스캔해도 전부 차단됩니다.

UFW 규칙 관리 — 확인, 삭제, 수정

방화벽을 켠 뒤에는 규칙을 확인하고 관리하는 법을 알아야 합니다. 실서버에서 포트를 잘못 열었다가 닫아야 하는 상황이 반드시 옵니다.

# 규칙에 번호를 붙여서 확인
sudo ufw status numbered

# 결과 예시:
#      To                         Action      From
# [ 1] 22/tcp                     ALLOW IN    Anywhere
# [ 2] 80/tcp                     ALLOW IN    Anywhere
# [ 3] 443/tcp                    ALLOW IN    Anywhere
# [ 4] 3306/tcp                   ALLOW IN    Anywhere   ← 실수로 연 DB 포트

# 4번 규칙(3306번) 삭제
sudo ufw delete 4

# 또는 규칙을 지정해서 삭제
sudo ufw delete allow 3306/tcp

규칙을 삭제할 때 주의할 점이 있습니다. ufw status numbered로 번호를 확인한 뒤 하나를 지우면, 그 뒤의 번호가 전부 당겨집니다. 즉 4번을 지우면 기존 5번이 4번이 됩니다. 여러 개를 연속으로 지울 때는 뒤번호부터 거꾸로 지워야 번호 꼬임을 피할 수 있습니다. 실무에서 자주 하는 실수입니다.

특정 IP에서만 접속 허용하기

SSH 포트를 전체에 열어두면 무차별 공격이 계속 들어옵니다. 사무실이나 집 IP처럼 고정 IP에서만 SSH 접속을 허용하면 공격 표면을 획기적으로 줄일 수 있습니다.

# 특정 IP에서만 SSH 허용
sudo ufw allow from 203.0.113.50 to any port 22 proto tcp

# IP 대역(CIDR)으로 허용 — 사무실 네트워크 전체
sudo ufw allow from 203.0.113.0/24 to any port 22 proto tcp

# 규칙 확인
sudo ufw status verbose
# 22/tcp ALLOW IN 203.0.113.0/24  ← 특정 대역만

이렇게 설정하면 지정한 IP 외에는 아예 연결 자체가 안 됩니다. 공격자가 22번 포트를 스캔해도 패킷이 드롭됩니다. 고정 IP가 있다면 가장 효과적인 SSH 보안 조치입니다. Fail2ban과 조합하면 거의 뚫리지 않는 SSH 보안 체계가 완성됩니다.

주의: SSH 포트를 먼저 열지 않으면?

가장 흔한 사고가 방화벽 켜기 전에 SSH 포트를 허용하지 않는 것입니다. ufw default deny incoming을 설정하고 바로 ufw enable을 해버리면, 본인의 SSH 연결이 즉시 차단됩니다. 서버에 접속할 방법이 사라집니다.

VPS 콘솔(웹 콘솔, VNC 등)으로 들어가서 방화벽을 풀어야 합니다. 클라우드 제공자마다 콘솔 접속 방법이 다르고, 익숙하지 않으면 한참 헤맵니다. 그러니 반드시 ufw allow 22/tcp를 먼저 실행하고 ufw enable을 하세요. SSH 세션이 끊기는 걸 방지하려면 tmux로 세션을 유지하는 것도 좋은 방법입니다.

꿀팁: SSH 포트 변경으로 공격 90% 감소

UFW로 방화벽을 켜면 포트 스캔 자체는 막히지만, 여전히 22번 포트로 무차별 공격이 들어옵니다. SSH 포트를 기본 22번에서 다른 번호(예: 2222, 22022)로 바꾸면 공격량 자체가 90% 이상 줄어듭니다. 봇들이 기본적으로 22번만 스캔하기 때문입니다.

# /etc/ssh/sshd_config 에서
Port 2222

# 변경 후 재시작
sudo systemctl restart sshd

# 주의: 방화벽에서 새 포트를 먼저 열어야 함
sudo ufw allow 2222/tcp

포트 변경 전에 반드시 새 포트를 방화벽에서 허용하세요. 그리고 기존 SSH 연결을 끊지 말고, 새 터미널에서 새 포트로 접속되는지 확인한 뒤에 기존 설정을 마무리하세요. 안 그러면 또 lockout이 됩니다.

Fail2ban과 같이 쓰면 거의 완벽합니다. UFW가 포트를 닫고, 포트 변경이 스캔을 줄이고, Fail2ban이 남은 무차별 공격을 자동 차단합니다. 3단계 방어 체계가 완성됩니다. SSH 키 인증만 켜두면 비밀번호 공격 자체가 무의미해집니다. 비밀번호 로그인을 끄는 것도 잊지 마세요. PasswordAuthentication no 한 줄로 모든 무차별 공격을 원천 차단할 수 있습니다.

UFW 로그로 공격 확인하기

방화벽이 차단한 공격을 직접 확인할 수 있습니다. 로깅을 켜면 어떤 IP에서 어떤 포트를 스캔했는지 기록됩니다.

# 로깅 활성화 (low/medium/high)
sudo ufw logging medium

# 로그 확인
sudo tail -f /var/log/ufw.log

# 차단된 연결 시도 예시:
# [UFW BLOCK] IN=eth0 SRC=185.220.101.1 DST=내서버IP \
#   PROTO=TCP DPT=3306  ← MySQL 스캔 시도
# [UFW BLOCK] IN=eth0 SRC=45.148.10.22 DST=내서버IP \
#   PROTO=TCP DPT=6379  ← Redis 스캔 시도

로그를 보면 실시간으로 얼마나 많은 봇이 서버를 스캔하고 있는지 체감할 수 있습니다. 보통 설정 후 몇 분 안에 차단 로그가 쌓이기 시작합니다. medium 정도면 충분하고, 디스크 용량이 넉넉하다면 high로 설정하면 패킷 헤더까지 기록됩니다.

정리

VPS를 빌렸다면 UFW부터 켜세요. 기본 deny로 잡고, 필요한 포트(22, 80, 443)만 여는 데 1분이면 충분합니다. 방화벽 없이 서버를 운영하는 건 선택이 아니라 필수입니다. 공격은 ‘내 서버가 타겟이 되어서’가 아니라 ‘그냥 스캔에 걸려서’ 들어옵니다. 방화벽 한 줄이면 이 스캔의 대부분을 차단할 수 있습니다.

이 글은 VPS 실전 운영 시리즈의 일부입니다. 다음 편에서는 Let’s Encrypt 무료 SSL로 HTTPS 전환하는 방법, 그리고 WireGuard로 자체 VPN 구축하는 방법을 다룹니다. 구독하고 매주 실전 VPS 보안 팁 받아보세요.

관련 글

📎 이 영상의 발표 자료

누구나 무료로 다운로드할 수 있습니다.