UFW 방화벽 실전: 웹(80/443)만 열고 나머지 닫기 + 포트스캔 방어(IPv4/IPv6, 로그, 테스트까지)
새 서버의 1순위 작업은 기본 차단(deny) 정책을 세우고 웹(80/443)만 허용하는 것입니다. Ubuntu 24.04 LTS 기준으로 UFW 설치→기본정책→허용 포트→SSH 안전화를 거쳐, 포트스캔 방어(제한/드롭 규칙), IPv6 대응, 로그·모니터링, nmap으로 검증까지 한 번에 마무리합니다. 중간중간 “잠김(자해)”을 피하기 위한 롤백 요령도 함께 적었습니다.
0) 준비 & 원칙
- 항상 SSH 연결이 열려 있는 기존 터미널을 유지한 채, 다른 창에서 테스트합니다.
- SSH 포트가 22가 아니면, 방화벽 활성화 전에 해당 포트를 먼저 allow 합니다.
- 클라우드 보안그룹(EC2 SG, VPC 방화벽 등)이 있다면 이중 규칙 충돌이 없는지 확인하세요.
1) UFW 설치·활성화(IPv6 포함)
sudo apt update
sudo apt install -y ufw
# IPv6 사용 시 /etc/ufw/ufw.conf 에서 v6 허용
sudo sed -i 's/^IPV6=.*/IPV6=yes/' /etc/ufw/ufw.conf
# 기본 정책: 들어오는 건 차단, 나가는 건 허용
sudo ufw default deny incoming
sudo ufw default allow outgoing
왜? 서버는 “요청에 응답”하는 역할이므로, 필요한 포트만 콕 찍어 허용하고 나머지는 닫아두는 것이 안전합니다.
2) 웹 서비스만 허용(80/443)
# Nginx/Apache 등 프록시 서버가 있을 때
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
이 상태에서 아직 UFW를 활성화하지 않았다면, SSH부터 허용합니다(다음 절). 이미 활성화되어 있으면 status로 확인하세요.
3) SSH 안전화: 포트 허용 + rate-limit + (선택) 화이트리스트
# SSH가 22라면
sudo ufw allow 22/tcp
# 포트를 2222로 바꿨다면
sudo ufw allow 2222/tcp
# 무차별 대입 완화(같은 IP의 과도한 연결 시도를 속도 제한)
sudo ufw limit 22/tcp
# 또는
sudo ufw limit 2222/tcp
회사 고정 IP만 허용하고 싶다면(강력 권장 시나리오):
# 예: 회사 공인 IP가 203.0.113.10 이고 SSH가 2222일 때
sudo ufw allow from 203.0.113.10 to any port 2222 proto tcp
# 광역대역(사내망) 허용 예: /24
sudo ufw allow from 203.0.113.0/24 to any port 2222 proto tcp
이제 활성화:
sudo ufw enable
sudo ufw status verbose
잠김 방지 팁: 활성화 후에는 새 터미널에서 실제로 SSH 접속이 되는지 확인하고, 안되면 sudo ufw delete allow ... 등으로 즉시 롤백하세요.
4) 서비스 단위 허용(선택: Application Profiles)
UFW는 서비스 프로파일을 인식합니다(/etc/ufw/applications.d/).
sudo ufw app list
sudo ufw allow 'Nginx Full' # 80,443 동시 허용
# 또는
sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTPS'
5) 포트스캔·쓰잘데기 트래픽 줄이기(현실적인 3단계)
5-1) UFW limit로 기본 방어선
limit 규칙은 동일 IP의 SSH 연결 시도를 제한해 무차별 대입 공격 소음을 크게 줄입니다(이미 위에서 적용).
5-2) 불필요한 포트 전면 차단 확인
# 현재 리스닝 포트 점검
ss -lntup
# 방화벽 규칙 점검
sudo ufw status numbered
5-3) before.rules로 스캔성 패킷 드롭(고급)
UFW는 내부적으로 iptables를 사용하므로, /etc/ufw/before.rules에 “이상한 패킷 드롭”을 추가해 소음을 더 줄일 수 있습니다.
(과도한 튜닝은 정상 트래픽까지 막을 수 있으니 테스트 환경에서 적용하세요.)
sudo cp /etc/ufw/before.rules /etc/ufw/before.rules.bak
sudo nano /etc/ufw/before.rules
아래 블록을 *filter 섹션에 추가(예: -A ufw-before-input -m conntrack --ctstate INVALID -j DROP 바로 아래):
# Drop XMAS/NULL scans (고전적 포트스캔 패턴)
-A ufw-before-input -p tcp --tcp-flags ALL ALL -j DROP
-A ufw-before-input -p tcp --tcp-flags ALL NONE -j DROP
적용:
sudo ufw reload
6) 커널 네트워크 하드닝(sysctl, 선택)
커널 파라미터로 기본 방어를 보강할 수 있습니다. /etc/sysctl.d/99-hardening.conf를 새로 만들고 아래 옵션을 넣습니다.
sudo tee /etc/sysctl.d/99-hardening.conf > /dev/null <<'SYS'
# SYN flood 완화
net.ipv4.tcp_syncookies = 1
# 의심스러운(ICMP 오류) 무시
net.ipv4.icmp_ignore_bogus_error_responses = 1
# 스푸핑 방지(역방향 경로 필터)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 라우팅 광고/리다이렉트 무시
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
SYS
sudo sysctl --system
주의: 네트워크 환경에 따라 rp_filter=1이 문제를 낼 수도 있습니다(멀티홈 환경). 일반적인 단일 NIC 서버는 안전합니다.
7) 로깅 & 모니터링
# 로깅 레벨 조정(낮음/중간/높음)
sudo ufw logging on
# 또는
sudo ufw logging low
# 로그 위치
sudo tail -f /var/log/ufw.log
로그가 과해지면 low 또는 off로 조절하고, rsyslog·filebeat·Promtail 등으로 중앙 수집을 붙이면 추적이 쉬워집니다.
8) nmap으로 결과 검증(외부 호스트에서)
# SYN 스캔(가장 일반적)
nmap -sS YOUR_SERVER_IP
# 버전 식별(허용 포트만 보이는지)
nmap -sV -p 22,80,443 YOUR_SERVER_IP
# 방화벽/우회 시도 탐지(참고)
nmap -sA -Pn YOUR_SERVER_IP
정상이라면 열린 포트는 80/443(+SSH)만 보입니다. 그 외는 filtered/closed로 나타나야 합니다.
9) 자주 겪는 문제 & 복구
- SSH가 끊겼다 — 콘솔(클라우드 제공)로 접속해
sudo ufw status확인 →sudo ufw allow <포트>/tcp후sudo ufw reload. - IPv6 안 막힌다 —
/etc/ufw/ufw.conf에서IPV6=yes인지 확인,sudo ufw disable && sudo ufw enable. - 과도한 로그 —
sudo ufw logging low또는off로 조절,rsyslog필터링. - 애플리케이션이 내부 포트 필요 — 로컬 루프백(127.0.0.1)만 쓰도록 서비스 바인딩을 변경(
address=127.0.0.1)하고 외부 허용은 최소화.
10) 최종 체크리스트
- 기본 정책:
deny incoming,allow outgoing - 허용 포트:
80/tcp,443/tcp,SSH(22 또는 변경 포트) - SSH:
limit적용, (선택) 회사 IP 화이트리스트 - 포트스캔 완화:
before.rules에 XMAS/NULL 드롭(선택) - 커널 하드닝: syncookies, redirect 차단, rp_filter
- 로그:
/var/log/ufw.log관찰,nmap으로 외부 검증
여기까지면 “웹만 열고 나머지는 닫힌 상태”가 안정적으로 완성됩니다. 이후엔 Fail2ban과의 연동(SSH 과도 시도 자동 차단), 호스트 IDS/IPS, 로그 중앙화 등으로 방어층을 탄탄히 쌓아가면 됩니다.
'서버 인프라 실무' 카테고리의 다른 글
| 무료 SSL(HTTPS) 적용: Certbot 자동 갱신 + 자주 나는 오류 해결(Ubuntu 24.04, Nginx) (0) | 2025.10.20 |
|---|---|
| Nginx 서버 블록(server_name)로 도메인 연결: WWW/비WWW 선택과 301 리다이렉트, HTTP→HTTPS까지 (0) | 2025.10.20 |
| 서버 첫 보안: SSH 포트 변경 + 공개키 로그인 + 루트 접속 차단(Ubuntu 24.04 기준) (0) | 2025.10.19 |
| Ubuntu 24.04 설치 USB 만들기 & 서버 최소 설치 옵션(보안·파티션·네트워크까지) (0) | 2025.10.18 |
| CORS 에러 한 번에 끝내기: Spring Security 6 + 프록시(Nginx) 조합 (0) | 2025.10.17 |