본문 바로가기
서버 인프라 실무

UFW 방화벽 실전: 웹(80/443)만 열고 나머지 닫기 + 포트스캔 방어(IPv4/IPv6, 로그, 테스트까지)

by yamoojin83 2025. 10. 19.

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 <포트>/tcpsudo 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, 로그 중앙화 등으로 방어층을 탄탄히 쌓아가면 됩니다.