https://www.youtube.com/shorts/qxb5rhv3zJI
VPS는 기본적으로 22번 포트를 열어둡니다
VPS를 한 번 설정하고 방화벽을 건너뛰면, 인터넷 상의 자동화 봇들이 SSH 포트(22번)를 무차별로 두드리기 시작합니다. 취약한 루트 비밀번호를 대입하려 시도하며, 대부분의 기본 설정 서버는 단 몇 시간 안에 뚫립니다.
ufw(Uncomplicated Firewall)는 이 문제를 단 3단계로 해결합니다. 복잡한 iptables 규칙 대신, 명령 3줄이면 자동화 봇의 99%를 막을 수 있습니다. VPS 보안의 기초가 되는 이 설정은 VPS 서버 보안 가이드에서도 다루는 첫 번째 단계입니다.
UFW 3단계 원칙: default deny – allow 필수포트 – limit ssh
핵심은 “기본적으로 모든 접속을 차단, 필요한 것만 허용, 반복 공격자는 자동 차단”하는 것입니다. 이 3단계만 따르면 당신의 서버는 초보자 수준에서 안전해집니다.
1단계: default deny incoming (들어오는 트래픽 기본 차단)
가장 먼저 할 일은 들어오는 모든 트래픽을 기본적으로 차단하는 것입니다. 이것이 방화벽의 기본 정책입니다:
sudo ufw default deny incoming
sudo ufw default allow outgoing
이 명령을 실행하면 외부에서 들어오는 모든 새 포트 접속을 차단합니다. 서버 자체는 외부로 요청을 보낼 수 있으므로 패키지 업데이트나 외부 API를 호출하거나 패키지를 다운로드하는 데 문제가 없습니다.
이 상태에서는 서버가 SSH 접속도 차단하므로, 반드시 다음 단계에서 필요한 포트를 열어야 합니다. 포트를 열지 않고 방화벽을 켜버리면 접속이 영원히 끊어질 수 있습니다. 실수로 잠금 상태가 되었다면 VPS 공급자의 웹 콘솔(Vultr, DigitalOcean, Hetzner 모두 제공)을 통해 복구할 수 있습니다.
2단계: allow ssh, allow http, allow https (필요한 포트만 허용)
서버가 사용하는 포트를 허용합니다. 대부분의 VPS 웹 서비스에서는 다음 세 포트면 충분합니다:
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
ufw는 /etc/services 파일을 참조하여 서비스 이름을 자동으로 포트 번호로 변환합니다. allow ssh는 22/tcp, allow http는 80/tcp, allow https는 443/tcp로 해석됩니다.
이 방식의 장점은 명령어 자체가 의미를 전달한다는 것입니다. 나중에 방화벽 규칙을 확인할 때 22/tcp보다 SSH로 표시되는 것이 읽기 편합니다. 데이터베이스 포트(3306, 5432)나 Redis(6379)는 외부에 노출하면 안 되므로, 반드시 내부망이나 localhost에서만 접근하도록 설정하세요.
sudo ufw status numbered
이 명령으로 현재 활성 규칙을 번호와 함께 확인할 수 있습니다:
Status: Active
To Action From
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
3단계: limit ssh (반복 시도하는 IP 자동 차단)
allow와 limit의 차이가 핵심입니다. allow는 무조건 접속을 허용하지만, limit는 30초 안에 6회 이상 접속을 시도하는 IP를 자동으로 차단합니다:
sudo ufw delete allow ssh
sudo ufw limit ssh
먼저 기존의 SSH allow 규칙을 삭제하고, limit으로 교체합니다. 이 규칙은 내부적으로 iptables -m recent 모듈을 사용하여 짧은 시간의 접속 시도 횟수를 추적합니다.
일반적인 사용자는 정상적으로 비밀번호 입력을 하기 때문에 짧은 시간에 여러 번 접속하지 않으므로, 이 제한에 걸리지 않습니다. 반면 봇은 30초 안에 수십에서 수백 번 SSH를 시도하므로 자동화 봇을 효과적으로 차단할 수 있습니다. 더 정교한 로그 기반 차단이 필요하다면 Fail2ban SSH 무차별 공격 방어 튜토리얼을 참고하세요.
방화벽 활성화 및 상태 확인
세 단계의 규칙을 모두 넣었으면 이제 방화벽을 활성화합니다:
sudo ufw enable
sudo ufw status verbose
출력에서 Status: active를 확인하고, 규칙이 제대로 적용되었는지 점검합니다. 활성화한 방화벽은 서버 재부팅 후에도 자동으로 시작됩니다. verbose 옵션을 붙이면 기본 정책(deny incoming, allow outgoing)과 각 규칙의 상세 정보를 함께 볼 수 있습니다.
UFW 로그로 실제 차단 현황 확인하기
방화벽을 켰다고 끝이 아닙니다. ufw가 실제로 어떤 공격을 막아내고 있는지 로그로 확인하면 설정의 효과를 체감할 수 있습니다:
sudo ufw logging on
sudo tail -f /var/log/ufw.log
로그를 켜면 /var/log/ufw.log에 차단 기록이 쌓입니다. 실제 운영 중인 VPS에서 몇 분만 기다려도 다음과 같은 로그를 볼 수 있습니다:
Jul 11 02:14:33 vps kernel: [UFW BLOCK] IN=eth0 SRC=203.0.113.50 DST=10.0.0.1 PROTO=TCP DPT=22
Jul 11 02:14:34 vps kernel: [UFW LIMIT BLOCK] IN=eth0 SRC=203.0.113.50 DST=10.0.0.1 PROTO=TCP DPT=22
[UFW BLOCK]은 허용되지 않은 포트로의 접속 시도를, [UFW LIMIT BLOCK]은 limit 규칙에 의해 차단된 반복 시도를 의미합니다. 로그를 확인하면 어떤 IP가 어떤 포트를 공격하고 있는지 한눈에 파악할 수 있습니다. 로그 레벨은 low(기본값), medium, high로 조절 가능하며, 디버깅이 필요할 때만 high로 올리세요. 평상시에는 low로 충분합니다.
운영 중 규칙 변경: ufw reload와 주의사항
운영 중에 포트를 추가하거나 삭제해야 할 때가 있습니다. 예를 들어 데이터베이스 포트(3306)를 특정 IP에서만 허용하려면:
sudo ufw allow from 192.168.1.100 to any port 3306
sudo ufw reload
ufw reload는 규칙을 다시 로드하면서 기존 연결을 끊지 않습니다. 반면 ufw disable 후 다시 ufw enable을 하면 순간적으로 모든 연결이 리셋되므로 운영 중인 서비스에 영향을 줄 수 있습니다. 규칙 변경 후에는 항상 reload를 사용하세요.
규칙을 삭제할 때는 ufw status numbered로 규칙 번호를 확인한 뒤 sudo ufw delete 2처럼 번호로 삭제합니다. 삭제 후에도 reload를 한 번 실행하는 것이 안전합니다.
IPv6 환경과 Docker를 쓸 때 주의점
VPS가 IPv6를 지원한다면 ufw도 IPv6 규칙을 함께 적용해야 합니다. 기본적으로 /etc/default/ufw에서 IPV6=yes로 설정되어 있지만, 확인이 필요합니다:
sudo grep IPV6 /etc/default/ufw
출력이 IPV6=yes가 아니라면 파일을 수정한 뒤 ufw reload를 실행하세요. IPv6를 켜지 않으면 공격자가 IPv6 경로로 우회할 수 있습니다.
Docker를 사용할 때는 특별한 주의가 필요합니다. Docker는 자체적으로 iptables 규칙을 삽입하여 ufw보다 먼저 처리되는 경우가 많습니다. 즉, ufw로 포트를 막아도 Docker가 -p 8080:80으로 열어둔 포트는 외부에서 접근 가능합니다. 이 문제를 해결하려면 Docker의 daemon.json에서 "iptables": false를 설정하거나, Docker 네트워크를 내부망으로 구성하고 리버스 프록시(Nginx)로만 외부 노출을 제한하는 방식을 사용해야 합니다. Docker 셀프 호스팅 가이드에서 이 구성을 자세히 다룹니다.
자주 묻는 질문
SSH 포트를 바꿔야 하나요?
기본 22번 포트 그대로 써도 limit ssh 규칙으로 충분히 보호됩니다. 포트 변경(obscurity)은 추가 보안층이 될 수는 있지만, limit 규칙이 이미 자동화 봇을 차단합니다. 보안보다 관리 복잡도가 늘어나는 것을 피하려면 기본 포트와 정확한 규칙을 유지하는 것을 권장합니다.
fail2ban과 함께 쓰나요?
ufw limit는 1차 방어선으로 훌륭한 보호입니다. fail2ban은 로그 분석 기반으로 더 강력한 차단(장기 밴, 화이트리스트, 이메일 알림 등)을 제공합니다. 기본 보안엔 ufw 3단계면 충분하며, 추가 방어가 필요하면 fail2ban을 함께 설치하는 것을 추천합니다. 두 도구는 서로 충돌하지 않고互补적으로 작동합니다.
이미 방화벽을 안 쓰는 운영 서버에 적용해도 되나요?
네. SSH 포트(22번)를 반드시 허용한 뒤 ufw enable을 실행하면 됩니다. 이미 열려있는 연결은 유지되므로, 활성 SSH 세션이 있다면 연결이 끊기지 않고 계속 작업할 수 있습니다. 다만 원격 작업이므로 실수로 SSH를 차단하면 복구가 어렵다는 점을 항상 염두에 두세요.
요약
| 단계 | 명령어 | 역할 |
|---|---|---|
| 1 | sudo ufw default deny incoming |
전체 차단 |
| 2 | sudo ufw allow ssh/http/https |
필수 포트 허용 |
| 3 | sudo ufw limit ssh |
반복 공격자 자동 차단 |
| + | sudo ufw logging on |
차단 로그 확인 |
| + | sudo ufw reload |
규칙 변경 안전 적용 |
이 3단계만으로 VPS를 자동화 봇으로부터 보호할 수 있습니다. 서버 보안은 한 번에 완벽하게 할 수 있는 작업이 아니라, 작은 습관을 꾸준히 실천해야 하는 영역입니다. 지금 바로 접속해서 3분만 투자해 보세요.



















