일본 서버호스팅으로 서버를 받으면 인터넷에 직접 노출된 상태입니다. 방화벽 설정 없이 서버를 운영하면 불필요한 포트가 열려 있어 해킹·스캔 공격의 표적이 됩니다. 이 글에서는 Ubuntu 서버에서 UFW(간편 방화벽)와 iptables를 사용해 방화벽을 설정하는 방법을 안내합니다.
UFW vs iptables
| 항목 | UFW | iptables |
|---|---|---|
| 사용 편의성 | 간단한 명령어 | 복잡한 문법 |
| 유연성 | 기본 규칙 | 세밀한 제어 |
| 권장 대상 | 일반 서버 운영 | 고급 네트워크 제어 |
| Ubuntu 통합 | 기본 포함 | 별도 설치 |
대부분의 일본 서버 운영에는 UFW로 충분합니다.
UFW 기본 설정
1. UFW 기본 정책 설정
# 들어오는 트래픽 기본 차단
ufw default deny incoming
# 나가는 트래픽 기본 허용
ufw default allow outgoing
2. 필요한 포트 허용
# SSH (포트 번호는 실제 설정한 번호로)
ufw allow 22222/tcp
# 웹 서비스
ufw allow 80/tcp
ufw allow 443/tcp
# 특정 포트 허용
ufw allow 3306/tcp # MySQL (필요한 경우만)
ufw allow 6379/tcp # Redis (필요한 경우만)
3. 특정 IP에서만 허용
# 특정 IP에서만 SSH 허용
ufw allow from 123.456.789.0 to any port 22222
# 특정 IP 대역 허용
ufw allow from 123.456.0.0/16 to any port 3306
4. UFW 활성화
ufw enable
ufw status verbose
UFW 주요 명령어
# 규칙 목록 확인 (번호 포함)
ufw status numbered
# 특정 번호 규칙 삭제
ufw delete 3
# 특정 포트 차단
ufw deny 8080/tcp
# 특정 IP 차단
ufw deny from 192.168.1.100
# UFW 비활성화 (주의)
ufw disable
# 모든 규칙 초기화 (주의)
ufw reset
iptables 고급 설정
UFW가 내부적으로 iptables를 사용하지만, 더 세밀한 제어가 필요한 경우 직접 iptables를 사용합니다.
SYN Flood 방어
# SYN 쿠키 활성화 (커널 레벨)
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# SYN 패킷 속도 제한
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
포트 스캔 방어
# NULL 패킷 차단
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Xmas 패킷 차단
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# 비정상 패킷 차단
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
IP당 연결 수 제한
# 하나의 IP에서 최대 20개 연결 허용
iptables -A INPUT -p tcp -m connlimit --connlimit-above 20 -j REJECT
# 분당 연결 속도 제한
iptables -A INPUT -p tcp --dport 80 -m limit --limit 30/min --limit-burst 50 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables 규칙 영구 저장
apt install iptables-persistent -y
netfilter-persistent save
netfilter-persistent reload
스크립트로 규칙 관리
방화벽 규칙이 복잡해지면 스크립트로 관리하는 것이 편리합니다:
#!/bin/bash
# /usr/local/bin/firewall.sh
# 기존 규칙 초기화
iptables -F
iptables -X
# 기본 정책
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# loopback 허용
iptables -A INPUT -i lo -j ACCEPT
# 기존 연결 허용
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SSH (포트 22222)
iptables -A INPUT -p tcp --dport 22222 -j ACCEPT
# HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# ICMP (ping)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
echo "방화벽 규칙 적용 완료"
iptables -L -n -v
방화벽 설정 확인
# UFW 상태
ufw status verbose
# iptables 규칙 확인
iptables -L -n -v --line-numbers
# 열린 포트 확인
ss -tnlp
# 외부에서 포트 스캔 (다른 서버에서 실행)
nmap -sV 서버IP
마치며
방화벽은 일본 서버 보안의 첫 번째 방어선입니다. UFW로 기본 설정을 마친 후 필요에 따라 iptables로 세밀하게 조정하세요. TCP-80.NET은 서버 방화벽 설정 지원을 텔레그램 @tcp80net으로 제공합니다.