네트워크 보안 기초부터 실전까지 3편: 방화벽의 이해와 설정
Network Security Series Part 3: Understanding and Configuring Firewalls
서론: 방화벽, 네트워크 보안의 첫 번째 방어선
방화벽(Firewall)은 네트워크 보안의 가장 기본적이면서도 핵심적인 구성 요소입니다. 마치 건물의 방화벽이 화재의 확산을 막듯이, 네트워크 방화벽은 외부의 위협으로부터 내부 네트워크를 보호하는 역할을 합니다. 1988년 모리스 웜(Morris Worm) 사건 이후 본격적으로 발전하기 시작한 방화벽 기술은 오늘날 모든 조직의 필수 보안 인프라로 자리 잡았습니다.
이번 3편에서는 방화벽의 기본 개념부터 다양한 종류, 아키텍처 설계, 그리고 Linux와 Windows에서의 실제 설정 방법까지 체계적으로 살펴보겠습니다.
1. 방화벽이란?
1.1 방화벽의 정의와 역할
방화벽은 미리 정의된 보안 규칙에 따라 네트워크 트래픽을 모니터링하고 제어하는 네트워크 보안 시스템입니다. 신뢰할 수 있는 내부 네트워크와 신뢰할 수 없는 외부 네트워크(주로 인터넷) 사이에서 장벽 역할을 수행합니다.
방화벽의 주요 기능은 다음과 같습니다:
- 트래픽 필터링: 허용된 트래픽만 통과시키고 나머지는 차단
- 접근 제어: 특정 IP, 포트, 프로토콜에 대한 접근 허용/거부
- 로깅 및 모니터링: 모든 네트워크 활동 기록
- NAT(Network Address Translation): 내부 IP 주소 은폐
- VPN 종단점: 안전한 원격 접속 지원
1.2 방화벽의 작동 원리
방화벽은 네트워크 패킷의 헤더 정보(출발지/목적지 IP, 포트 번호, 프로토콜 등)를 검사하여 사전에 정의된 규칙과 비교합니다. 규칙에 일치하면 해당 동작(허용, 거부, 로깅)을 수행합니다.
패킷 도착 → 규칙 매칭 → 일치하는 규칙 발견 → 해당 동작 수행
↓
일치하는 규칙 없음 → 기본 정책(Default Policy) 적용
2. 방화벽의 종류
2.1 패킷 필터링 방화벽 (Packet Filtering Firewall)
가장 기본적인 형태의 방화벽으로, OSI 3~4계층(네트워크, 전송 계층)에서 동작합니다. 각 패킷을 독립적으로 검사하며, 패킷 헤더의 정보만을 기반으로 필터링합니다.
장점:
- 빠른 처리 속도
- 낮은 리소스 사용
- 간단한 구현
단점:
- 연결 상태를 추적하지 않음
- 애플리케이션 레벨 공격에 취약
- IP 스푸핑 공격에 취약
2.2 상태 검사 방화벽 (Stateful Inspection Firewall)
연결 상태를 추적하는 방화벽으로, 현재 가장 널리 사용되는 방식입니다. 세션 테이블을 유지하여 연결의 상태(새 연결, 기존 연결, 관련 연결)를 파악합니다.
상태 테이블 예시:
┌─────────────┬─────────────┬───────┬───────┬─────────┐
│ Source IP │ Dest IP │ SPort │ DPort │ State │
├─────────────┼─────────────┼───────┼───────┼─────────┤
│ 192.168.1.10│ 8.8.8.8 │ 45123 │ 53 │ ESTAB │
│ 192.168.1.20│ 142.250.1.1 │ 52341 │ 443 │ ESTAB │
│ 192.168.1.15│ 104.16.1.1 │ 38921 │ 80 │ TIME_WT │
└─────────────┴─────────────┴───────┴───────┴─────────┘
장점:
- 연결 상태 기반의 정확한 필터링
- 응답 패킷 자동 허용으로 규칙 단순화
- DoS 공격 탐지 가능
2.3 애플리케이션 레벨 게이트웨이 (Application Level Gateway / Proxy Firewall)
OSI 7계층(애플리케이션 계층)에서 동작하며, 특정 애플리케이션 프로토콜을 완전히 이해하고 검사합니다. 클라이언트와 서버 사이에서 프록시 역할을 수행합니다.
장점:
- 깊은 패킷 검사(DPI) 가능
- 애플리케이션 레벨 공격 차단
- 사용자 인증 기능
- 콘텐츠 필터링
단점:
- 처리 속도 저하
- 높은 리소스 사용
- 지원하는 프로토콜에 제한
2.4 차세대 방화벽 (NGFW: Next-Generation Firewall)
NGFW는 전통적인 방화벽 기능에 다양한 보안 기능을 통합한 현대적인 방화벽입니다. 대표적인 제품으로 Palo Alto Networks, Fortinet FortiGate, Cisco Firepower 등이 있습니다.
NGFW의 주요 기능:
- 애플리케이션 인식: 포트가 아닌 애플리케이션 기반 정책
- 사용자 인식: IP가 아닌 사용자/그룹 기반 정책
- IPS(침입 방지 시스템): 실시간 위협 탐지 및 차단
- SSL/TLS 검사: 암호화된 트래픽 복호화 및 검사
- 샌드박싱: 의심스러운 파일 격리 분석
- 위협 인텔리전스: 실시간 위협 정보 연동
| 기능 | 패킷 필터링 | 상태 검사 | 애플리케이션 | NGFW |
|---|---|---|---|---|
| 동작 계층 | L3-L4 | L3-L4 | L7 | L3-L7 |
| 상태 추적 | X | O | O | O |
| DPI | X | X | O | O |
| IPS 통합 | X | X | X | O |
| 처리 속도 | 빠름 | 빠름 | 느림 | 중간 |
3. 방화벽 아키텍처
3.1 스크린드 호스트 아키텍처 (Screened Host Architecture)
스크리닝 라우터와 배스천 호스트(Bastion Host)를 조합한 구조입니다. 외부에서 내부 네트워크로의 접근은 반드시 배스천 호스트를 통해야만 가능합니다.
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ 인터넷 │────│ 스크리닝 │────│ 배스천 호스트 │────│ 내부 네트워크 │
│ │ │ 라우터 │ │ (Bastion Host) │ │ │
└─────────────┘ └──────────────┘ └─────────────────┘ └───────────────┘
3.2 스크린드 서브넷 아키텍처 (DMZ)
DMZ(Demilitarized Zone, 비무장지대)는 외부와 내부 네트워크 사이에 위치한 격리된 네트워크 영역입니다. 웹 서버, 메일 서버 등 외부에 서비스를 제공해야 하는 서버들을 배치합니다.
┌─────────────────────────────────┐
│ DMZ 영역 │
│ ┌─────────┐ ┌─────────┐ │
┌─────────┐ │ │ 웹 서버 │ │ 메일서버│ │ ┌───────────────┐
│ 인터넷 │─────────│ └─────────┘ └─────────┘ │─────────│ 내부 네트워크 │
└─────────┘ │ ┌─────────┐ ┌─────────┐ │ │ │
│ │ │ DNS │ │ FTP │ │ │ ┌──────────┐ │
│ │ └─────────┘ └─────────┘ │ │ │ 업무서버 │ │
│ └─────────────────────────────────┘ │ │ DB 서버 │ │
│ │ │ └──────────┘ │
│ ┌────────┴────────┐ └───────────────┘
└──────────────│ 외부 방화벽 │
└─────────────────┘
│
┌────────┴────────┐
│ 내부 방화벽 │
└─────────────────┘
DMZ 설계 원칙:
- DMZ 서버는 내부 네트워크로 직접 연결 불가
- 내부에서 DMZ로의 연결만 허용 (필요시)
- DMZ 서버 간 통신 최소화
- 각 서버별로 필요한 포트만 개방
4. Linux iptables/nftables 기초
4.1 iptables 개요
iptables는 Linux 커널의 netfilter 프레임워크를 사용하는 방화벽 도구입니다. 테이블(Table), 체인(Chain), 규칙(Rule)의 계층 구조로 구성됩니다.
주요 테이블:
- filter: 패킷 필터링 (기본 테이블)
- nat: 네트워크 주소 변환
- mangle: 패킷 헤더 수정
- raw: 연결 추적 예외 설정
filter 테이블의 기본 체인:
- INPUT: 로컬 시스템으로 들어오는 패킷
- OUTPUT: 로컬 시스템에서 나가는 패킷
- FORWARD: 시스템을 통과하는 패킷 (라우팅)
4.2 iptables 기본 명령어
# 현재 규칙 확인
sudo iptables -L -n -v
# 특정 테이블의 규칙 확인
sudo iptables -t nat -L -n -v
# 규칙 추가 (Append)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 규칙 삽입 (Insert) - 특정 위치에
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
# 규칙 삭제
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# 체인의 모든 규칙 삭제
sudo iptables -F INPUT
# 기본 정책 설정
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
4.3 실용적인 iptables 규칙 예시
#!/bin/bash
# 기본 서버 방화벽 스크립트
# 기존 규칙 초기화
iptables -F
iptables -X
# 기본 정책 설정 (화이트리스트 방식)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 루프백 인터페이스 허용
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 기존 연결 및 관련 연결 허용
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SSH 허용 (특정 IP에서만)
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
# HTTP/HTTPS 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# DNS 허용
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# ICMP (ping) 허용 (제한적)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# 로깅 (차단된 패킷)
iptables -A INPUT -j LOG --log-prefix "iptables-dropped: " --log-level 4
# 나머지 모두 차단 (이미 기본 정책으로 DROP이지만 명시적으로)
iptables -A INPUT -j DROP
# 규칙 저장
iptables-save > /etc/iptables/rules.v4
4.4 nftables - iptables의 후속
nftables는 iptables를 대체하는 최신 방화벽 프레임워크입니다. 더 간결한 문법과 향상된 성능을 제공합니다.
# nftables 기본 설정 예시
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# 루프백 허용
iif lo accept
# 기존 연결 허용
ct state established,related accept
# SSH 허용
tcp dport 22 accept
# HTTP/HTTPS 허용
tcp dport { 80, 443 } accept
# ICMP 허용
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
# 로깅 후 차단
log prefix "nftables-dropped: " drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
5. UFW (Uncomplicated Firewall) 설정
UFW는 Ubuntu/Debian 시스템에서 iptables를 쉽게 관리할 수 있도록 해주는 프론트엔드 도구입니다.
5.1 UFW 기본 명령어
# UFW 상태 확인
sudo ufw status verbose
# UFW 활성화/비활성화
sudo ufw enable
sudo ufw disable
# 기본 정책 설정
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 포트 허용
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 특정 IP에서 접근 허용
sudo ufw allow from 192.168.1.0/24 to any port 22
# 특정 포트 거부
sudo ufw deny 3306/tcp
# 규칙 삭제
sudo ufw delete allow 80/tcp
# 규칙 번호로 삭제
sudo ufw status numbered
sudo ufw delete 3
# 애플리케이션 프로필 사용
sudo ufw app list
sudo ufw allow 'Nginx Full'
sudo ufw allow 'OpenSSH'
5.2 UFW 고급 설정
# 속도 제한 (브루트포스 방지)
sudo ufw limit ssh/tcp
# 특정 인터페이스에서만 허용
sudo ufw allow in on eth0 to any port 80
# 로깅 설정
sudo ufw logging on
sudo ufw logging medium # off, low, medium, high, full
# IPv6 설정 (/etc/default/ufw)
# IPV6=yes
6. Windows 방화벽
6.1 Windows Defender 방화벽 GUI 설정
Windows는 기본적으로 Windows Defender 방화벽을 제공합니다. 제어판 또는 Windows 보안 앱에서 설정할 수 있습니다.
주요 설정 경로:
- 제어판 > 시스템 및 보안 > Windows Defender 방화벽
- Windows 보안 > 방화벽 및 네트워크 보호
- 고급 보안이 포함된 Windows Defender 방화벽 (wf.msc)
6.2 PowerShell을 이용한 방화벽 관리
# 방화벽 상태 확인
Get-NetFirewallProfile
# 특정 프로필 방화벽 활성화/비활성화
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True
# 인바운드 규칙 조회
Get-NetFirewallRule -Direction Inbound | Where-Object {$_.Enabled -eq 'True'}
# 새 인바운드 규칙 추가 (HTTP 허용)
New-NetFirewallRule -DisplayName "Allow HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
# 새 인바운드 규칙 추가 (특정 IP에서만 SSH 허용)
New-NetFirewallRule -DisplayName "Allow SSH from Internal" -Direction Inbound -Protocol TCP -LocalPort 22 -RemoteAddress 192.168.1.0/24 -Action Allow
# 규칙 삭제
Remove-NetFirewallRule -DisplayName "Allow HTTP"
# 규칙 비활성화
Disable-NetFirewallRule -DisplayName "Allow HTTP"
# 아웃바운드 규칙 추가 (특정 포트 차단)
New-NetFirewallRule -DisplayName "Block Telnet Outbound" -Direction Outbound -Protocol TCP -RemotePort 23 -Action Block
# 모든 규칙 내보내기
netsh advfirewall export "C:\firewall-backup.wfw"
# 규칙 가져오기
netsh advfirewall import "C:\firewall-backup.wfw"
6.3 netsh를 이용한 방화벽 관리
REM 방화벽 상태 확인
netsh advfirewall show allprofiles
REM 방화벽 활성화
netsh advfirewall set allprofiles state on
REM 포트 열기
netsh advfirewall firewall add rule name="Open HTTP" dir=in action=allow protocol=tcp localport=80
REM 규칙 삭제
netsh advfirewall firewall delete rule name="Open HTTP"
REM 모든 인바운드 규칙 조회
netsh advfirewall firewall show rule name=all dir=in
7. 방화벽 정책 설계 원칙
7.1 최소 권한 원칙 (Principle of Least Privilege)
반드시 필요한 트래픽만 허용하고, 나머지는 모두 차단하는 화이트리스트(Whitelist) 방식을 사용합니다.
좋은 예:
- 기본 정책: 모든 인바운드 트래픽 차단 (DROP)
- 예외: 필요한 서비스만 명시적으로 허용
나쁜 예:
- 기본 정책: 모든 트래픽 허용 (ACCEPT)
- 예외: 위험한 포트만 차단 (블랙리스트)
7.2 계층적 방어 (Defense in Depth)
단일 방화벽에 의존하지 않고, 여러 계층의 보안을 구축합니다.
- 네트워크 경계 방화벽: 외부/내부 네트워크 경계
- 세그먼트 방화벽: 내부 네트워크 세그먼트 간
- 호스트 기반 방화벽: 개별 서버/워크스테이션
7.3 규칙 순서 최적화
방화벽 규칙은 위에서 아래로 순차적으로 처리됩니다. 효율적인 규칙 순서:
- 가장 자주 일치하는 규칙을 상위에 배치
- 명시적 거부 규칙은 허용 규칙보다 앞에
- 더 구체적인 규칙을 일반적인 규칙보다 앞에
- 마지막에 기본 거부 규칙
7.4 문서화 및 변경 관리
모든 방화벽 규칙은 반드시 문서화하고, 변경 시 승인 절차를 거쳐야 합니다.
방화벽 규칙 문서화 템플릿:
┌────────┬────────────┬──────────┬────────┬────────────┬────────────┬──────────┐
│ 규칙ID │ 출발지 │ 목적지 │ 포트 │ 프로토콜 │ 동작 │ 비고 │
├────────┼────────────┼──────────┼────────┼────────────┼────────────┼──────────┤
│ FW-001 │ Any │ DMZ-WEB │ 443 │ TCP │ Allow │ HTTPS │
│ FW-002 │ Internal │ DMZ-DB │ 3306 │ TCP │ Allow │ MySQL │
│ FW-003 │ Admin-Net │ Any │ 22 │ TCP │ Allow │ SSH │
│ FW-999 │ Any │ Any │ Any │ Any │ Deny + Log │ 기본차단 │
└────────┴────────────┴──────────┴────────┴────────────┴────────────┴──────────┘
8. 방화벽 로그 분석
8.1 로그의 중요성
방화벽 로그는 보안 사고 탐지, 포렌식 분석, 규정 준수 등에 필수적입니다. 효과적인 로그 관리를 위해:
- 모든 차단된 트래픽 로깅
- 중요 허용 트래픽 로깅
- 충분한 저장 기간 확보 (최소 90일, 권장 1년)
- 중앙 집중식 로그 관리 (SIEM 연동)
8.2 Linux 방화벽 로그 분석
# iptables 로그 확인
tail -f /var/log/kern.log | grep "iptables"
tail -f /var/log/syslog | grep "iptables-dropped"
# 차단된 IP 주소 Top 10
grep "iptables-dropped" /var/log/syslog | \
awk '{for(i=1;i<=NF;i++) if($i ~ /SRC=/) print $i}' | \
cut -d= -f2 | sort | uniq -c | sort -rn | head -10
# 차단된 목적지 포트 Top 10
grep "iptables-dropped" /var/log/syslog | \
awk '{for(i=1;i<=NF;i++) if($i ~ /DPT=/) print $i}' | \
cut -d= -f2 | sort | uniq -c | sort -rn | head -10
# 시간대별 차단 횟수
grep "iptables-dropped" /var/log/syslog | \
awk '{print $1, $2, $3}' | \
cut -d: -f1,2 | uniq -c
8.3 Windows 방화벽 로그 분석
# 방화벽 로깅 활성화
Set-NetFirewallProfile -Profile Domain,Public,Private -LogBlocked True -LogAllowed True -LogFileName "C:\Windows\System32\LogFiles\Firewall\pfirewall.log"
# 로그 파일 위치
# C:\Windows\System32\LogFiles\Firewall\pfirewall.log
# PowerShell로 로그 분석
Get-Content "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" |
Where-Object { $_ -match "DROP" } |
Select-Object -Last 100
# 차단된 연결의 소스 IP 통계
Get-Content "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" |
Where-Object { $_ -match "DROP" } |
ForEach-Object { ($_ -split '\s+')[4] } |
Group-Object | Sort-Object Count -Descending | Select-Object -First 10
8.4 로그 분석 시 주의할 패턴
다음과 같은 패턴이 발견되면 주의가 필요합니다:
- 포트 스캔: 같은 출발지에서 다수의 포트로 연결 시도
- 무차별 대입 공격: SSH(22), RDP(3389) 포트에 대한 반복적인 연결
- 비정상적인 아웃바운드 연결: 내부에서 외부로의 이상 트래픽
- 비표준 포트 사용: 일반 서비스가 비표준 포트로 연결
- 야간/주말 트래픽 급증: 업무 외 시간의 비정상 활동
9. 마무리 및 다음 편 예고
이번 편에서는 방화벽의 기본 개념부터 다양한 종류, 아키텍처 설계, 그리고 Linux와 Windows에서의 실제 설정 방법까지 살펴보았습니다. 방화벽은 네트워크 보안의 첫 번째 방어선으로서, 올바른 설계와 지속적인 관리가 필수적입니다.
핵심 요약:
- 방화벽은 화이트리스트 방식(기본 차단, 필요한 것만 허용)으로 설정
- 상태 검사 방화벽 이상의 기능을 활용하여 정교한 필터링
- DMZ를 통한 네트워크 세그먼테이션
- 모든 규칙의 문서화 및 변경 관리
- 로그 분석을 통한 지속적인 모니터링
다음 4편에서는 IDS/IPS(침입 탐지/방지 시스템)에 대해 알아보겠습니다. Snort, Suricata 설치 및 설정, 탐지 규칙 작성, 그리고 SIEM과의 연동까지 다룰 예정입니다.