일본 서버호스팅으로 서버를 받으면 인터넷에 직접 노출된 상태입니다. 방화벽 설정 없이 서버를 운영하면 불필요한 포트가 열려 있어 해킹·스캔 공격의 표적이 됩니다. 이 글에서는 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으로 제공합니다.