콘텐츠로 이동

Module 7: Proxmox VE Firewall

학습 목표

이 모듈을 완료하면 다음을 이해할 수 있습니다: - PVE Firewall의 분산 아키텍처와 계층 구조 - 방향(Direction)과 영역(Zone) 개념 - 방화벽 규칙 문법과 매크로 활용 - Security Group, IP Set, Alias 관리 - iptables/nftables 기반 규칙 생성 흐름


1. Firewall 아키텍처 개요

1.1 왜 분산 방화벽인가?

전통적인 중앙 집중형 방화벽과 달리, PVE Firewall은 **각 노드에서 독립적으로 실행**됩니다:

┌─────────────────────────────────────────────────────────────────────────┐
│                     Proxmox VE Cluster Firewall                         │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐        │
│   │     Node 1      │  │     Node 2      │  │     Node 3      │        │
│   ├─────────────────┤  ├─────────────────┤  ├─────────────────┤        │
│   │ pve-firewall    │  │ pve-firewall    │  │ pve-firewall    │        │
│   │ (iptables)      │  │ (iptables)      │  │ (iptables)      │        │
│   │                 │  │                 │  │                 │        │
│   │ ┌─────┐ ┌─────┐│  │ ┌─────┐ ┌─────┐│  │ ┌─────┐ ┌─────┐│        │
│   │ │VM101│ │VM102││  │ │VM103│ │VM104││  │ │VM105│ │CT106││        │
│   │ └─────┘ └─────┘│  │ └─────┘ └─────┘│  │ └─────┘ └─────┘│        │
│   └─────────────────┘  └─────────────────┘  └─────────────────┘        │
│            │                    │                    │                  │
│            └────────────────────┼────────────────────┘                  │
│                                 │                                       │
│                    ┌────────────▼────────────┐                         │
│                    │   /etc/pve/firewall/    │                         │
│                    │      cluster.fw         │                         │
│                    │   (pmxcfs - 자동 동기화)  │                         │
│                    └─────────────────────────┘                         │
└─────────────────────────────────────────────────────────────────────────┘

분산 아키텍처의 장점: - 고대역폭: 중앙 병목 없이 각 노드에서 필터링 - 완전 격리: VM 간 트래픽이 노드를 벗어나지 않음 - 자동 동기화: pmxcfs를 통해 설정 자동 배포 - IPv4/IPv6 동시 지원: 투명한 듀얼 스택 필터링

1.2 Firewall 서비스 데몬

┌─────────────────────────────────────────────────────────────┐
│                   PVE Firewall Services                     │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────┐    ┌─────────────────────┐        │
│  │   pve-firewall      │    │   pvefw-logger      │        │
│  │   (main daemon)     │    │   (NFLOG daemon)    │        │
│  ├─────────────────────┤    ├─────────────────────┤        │
│  │ • 설정 파일 모니터링   │    │ • 로그 수집          │        │
│  │ • iptables 규칙 생성  │    │ • /var/log/pve-     │        │
│  │ • 변경 시 자동 업데이트 │    │   firewall.log      │        │
│  └──────────┬──────────┘    └─────────────────────┘        │
│             │                                               │
│             ▼                                               │
│  ┌─────────────────────────────────────────────────┐       │
│  │              Linux Kernel (netfilter)            │       │
│  ├─────────────────────────────────────────────────┤       │
│  │  iptables (legacy)  │  nftables (tech preview)  │       │
│  └─────────────────────────────────────────────────┘       │
└─────────────────────────────────────────────────────────────┘

2. 방향(Direction)과 영역(Zone)

2.1 트래픽 방향 (Direction)

PVE Firewall은 3가지 트래픽 방향을 정의합니다:

┌─────────────────────────────────────────────────────────────┐
│                    Traffic Directions                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   외부 네트워크                                               │
│        │                                                    │
│        │  ┌─────┐                                          │
│        │  │ IN  │  도착하는 트래픽 (외부 → Zone)              │
│        ▼  └─────┘                                          │
│   ┌─────────────────────────────────────────┐              │
│   │              ZONE (Host/VM/VNet)         │              │
│   └─────────────────────────────────────────┘              │
│        │  ┌─────┐                                          │
│        │  │ OUT │  떠나는 트래픽 (Zone → 외부)               │
│        ▼  └─────┘                                          │
│   외부 네트워크                                               │
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │  FORWARD: Zone을 통과하는 트래픽 (라우팅/NAT)          │  │
│   │           * nftables (proxmox-firewall)에서만 지원    │  │
│   └─────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘

2.2 방화벽 영역 (Zone)

┌─────────────────────────────────────────────────────────────────────────┐
│                         Firewall Zones                                   │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌───────────────────────────────────────────────────────────────────┐ │
│  │                         HOST Zone                                  │ │
│  │  • 물리 노드로 들어오고 나가는 트래픽                                  │ │
│  │  • Datacenter 또는 Host 레벨에서 규칙 정의                           │ │
│  │  • Host 레벨 규칙이 Datacenter 규칙보다 우선                         │ │
│  │                                                                    │ │
│  │  설정 파일:                                                         │ │
│  │  • /etc/pve/firewall/cluster.fw (클러스터 전체)                     │ │
│  │  • /etc/pve/nodes/<nodename>/host.fw (특정 호스트)                  │ │
│  └───────────────────────────────────────────────────────────────────┘ │
│                                                                         │
│  ┌───────────────────────────────────────────────────────────────────┐ │
│  │                          VM Zone                                   │ │
│  │  • VM/CT로 들어오고 나가는 트래픽                                     │ │
│  │  • FORWARD 규칙 불가 (IN/OUT만 가능)                                │ │
│  │  • 각 네트워크 인터페이스별 방화벽 활성화 가능                          │ │
│  │                                                                    │ │
│  │  설정 파일: /etc/pve/firewall/<VMID>.fw                            │ │
│  └───────────────────────────────────────────────────────────────────┘ │
│                                                                         │
│  ┌───────────────────────────────────────────────────────────────────┐ │
│  │                         VNet Zone                                  │ │
│  │  • SDN VNet을 통과하는 트래픽 (guest↔guest, host↔guest)            │ │
│  │  • FORWARD 방향만 가능 (양방향 규칙 필요)                            │ │
│  │  • nftables (proxmox-firewall)에서만 지원                          │ │
│  │                                                                    │ │
│  │  설정 파일: /etc/pve/sdn/firewall/<vnet_name>.fw                   │ │
│  └───────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘

3. 설정 파일 구조

3.1 계층적 설정 파일

/etc/pve/
├── firewall/
│   └── cluster.fw              # 클러스터 전체 설정 (Datacenter 레벨)
├── nodes/
│   ├── node1/
│   │   └── host.fw             # node1 호스트 전용 설정
│   ├── node2/
│   │   └── host.fw             # node2 호스트 전용 설정
│   └── node3/
│       └── host.fw             # node3 호스트 전용 설정
└── firewall/
    ├── 100.fw                  # VM 100 방화벽 설정
    ├── 101.fw                  # VM 101 방화벽 설정
    └── 102.fw                  # CT 102 방화벽 설정

3.2 cluster.fw 구조

# /etc/pve/firewall/cluster.fw

[OPTIONS]
# 클러스터 전체 방화벽 활성화 (기본값: 0 = 비활성)
enable: 1

# ebtables 규칙 활성화
ebtables: 1

# 로그 레이트 제한 설정
log_ratelimit: enable=1,rate=1/second,burst=5

# 기본 정책
policy_in: DROP
policy_out: ACCEPT

[RULES]
# 클러스터 전체에 적용되는 규칙
IN ACCEPT -source 10.0.0.0/8 -p tcp -dport 22 -log info
IN ACCEPT -source 192.168.0.0/16 -p tcp -dport 8006

[IPSET management]
# 관리 IP 목록 (자동으로 GUI/SSH/SPICE 허용)
192.168.1.10
192.168.1.0/24

[IPSET blacklist]
# 차단할 IP 목록 (모든 호스트와 VM에서 차단)
203.0.113.50
198.51.100.0/24

[group webserver]
# 보안 그룹 정의
IN ACCEPT -p tcp -dport 80
IN ACCEPT -p tcp -dport 443

[ALIASES]
# IP 별칭 정의
local_network 192.168.1.0/24
monitoring_server 10.0.0.50

3.3 host.fw 구조

# /etc/pve/nodes/node1/host.fw

[OPTIONS]
# 호스트 방화벽 활성화
enable: 1

# 로그 레벨 설정
log_level_in: info
log_level_out: info
log_level_forward: info

# 연결 추적 설정
nf_conntrack_max: 524288
nf_conntrack_tcp_timeout_established: 432000

# SYN Flood 보호
protection_synflood: 1
protection_synflood_rate: 200
protection_synflood_burst: 1000

# TCP 플래그 필터링
tcpflags: 1

# SMURFS 공격 방지
nosmurfs: 1

# NDP (IPv6 Neighbor Discovery) 허용
ndp: 1

# nftables 사용 (tech preview)
# nftables: 1

[RULES]
# 호스트 전용 규칙 (cluster.fw 규칙 오버라이드)
IN ACCEPT -source 10.10.10.0/24 -p tcp -dport 3128 -log info

3.4 VM/CT 방화벽 설정

# /etc/pve/firewall/100.fw

[OPTIONS]
# VM 방화벽 활성화
enable: 1

# 기본 정책
policy_in: DROP
policy_out: ACCEPT

# DHCP 허용
dhcp: 1

# MAC 필터링
macfilter: 1

# IP 필터링 (IP 스푸핑 방지)
ipfilter: 1

# NDP 허용 (IPv6)
ndp: 1

# 로그 레벨
log_level_in: warning
log_level_out: nolog

[RULES]
# VM 전용 규칙
IN SSH(ACCEPT) -i net0 -source 192.168.1.0/24
IN ACCEPT -p tcp -dport 80
IN ACCEPT -p tcp -dport 443
IN ACCEPT -p icmp
OUT ACCEPT

# 보안 그룹 적용
GROUP webserver

[IPSET ipfilter-net0]
# net0 인터페이스에서 허용되는 소스 IP (IP 스푸핑 방지)
192.168.1.100

[ALIASES]
db_server 192.168.1.50

4. 방화벽 규칙 문법

4.1 기본 규칙 구조

┌─────────────────────────────────────────────────────────────────────────┐
│                       Firewall Rule Syntax                              │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   DIRECTION ACTION [OPTIONS]                                           │
│                                                                         │
│   |DIRECTION ACTION [OPTIONS]    # 비활성화된 규칙 (| 접두사)            │
│                                                                         │
│   DIRECTION MACRO(ACTION) [OPTIONS]   # 매크로 사용                     │
│                                                                         │
├─────────────────────────────────────────────────────────────────────────┤
│  DIRECTION:                                                             │
│  • IN      - 들어오는 트래픽                                             │
│  • OUT     - 나가는 트래픽                                               │
│  • FORWARD - 통과하는 트래픽 (nftables만 지원)                           │
│                                                                         │
│  ACTION:                                                                │
│  • ACCEPT  - 트래픽 허용                                                 │
│  • DROP    - 트래픽 무시 (응답 없음)                                     │
│  • REJECT  - 트래픽 거부 (ICMP 에러 응답)                                │
└─────────────────────────────────────────────────────────────────────────┘

4.2 규칙 옵션

# 규칙에 사용 가능한 옵션들

--source <string>     # 소스 IP/네트워크/IP셋/별칭
                      # 예: 192.168.1.0/24, +management, myalias

--dest <string>       # 목적지 IP/네트워크/IP셋/별칭
                      # 예: 10.0.0.1, 10.0.0.1-10.0.0.100

--proto <string>      # 프로토콜 (tcp, udp, icmp, etc.)
                      # /etc/protocols에 정의된 이름 또는 번호

--sport <string>      # 소스 포트 (TCP/UDP)
                      # 예: 22, 80:85, 80,443,8080

--dport <string>      # 목적지 포트 (TCP/UDP)
                      # 예: 443, 1024:65535

--iface <string>      # 네트워크 인터페이스
                      # VM: net0, net1, etc.
                      # Host: eth0, vmbr0, etc.

--icmp-type <string>  # ICMP 타입 (proto가 icmp일 때)
                      # 예: echo-request, echo-reply

--log <level>         # 로그 레벨
                      # nolog, emerg, alert, crit, err, warning, notice, info, debug

4.3 규칙 예제

[RULES]
# 기본 규칙
IN ACCEPT -p tcp -dport 22                    # SSH 허용
IN ACCEPT -p tcp -dport 80,443                # HTTP/HTTPS 허용
IN DROP                                        # 나머지 모두 차단
OUT ACCEPT                                     # 나가는 트래픽 모두 허용

# 소스 IP 제한
IN ACCEPT -source 192.168.1.0/24 -p tcp -dport 22
IN ACCEPT -source 10.0.0.1-10.0.0.100 -p tcp -dport 3306

# IP 셋 사용
IN ACCEPT -source +management -p tcp -dport 8006
IN DROP -source +blacklist

# 별칭 사용
IN ACCEPT -source myserver -p tcp -dport 5432

# 인터페이스 지정 (VM)
IN ACCEPT -i net0 -p tcp -dport 80
IN ACCEPT -i net1 -p tcp -dport 3306

# 로그 기록
IN ACCEPT -p tcp -dport 22 -log info
IN DROP -log warning

# 비활성화된 규칙
|IN ACCEPT -p tcp -dport 8080                  # 임시 비활성화

# ICMP
IN ACCEPT -p icmp -icmp-type echo-request
OUT ACCEPT -p icmp -icmp-type echo-reply

5. 매크로 (Macros)

5.1 매크로 개념

매크로는 일반적인 서비스에 대한 **사전 정의된 규칙 세트**입니다:

┌─────────────────────────────────────────────────────────────────────────┐
│                           Macro Usage                                    │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   DIRECTION MACRO(ACTION) [OPTIONS]                                    │
│                                                                         │
│   예시:                                                                  │
│   IN SSH(ACCEPT)                    # SSH 허용 (tcp/22)                 │
│   IN SSH(ACCEPT) -source 10.0.0.0/8 # 특정 소스에서만 SSH 허용           │
│   IN HTTP(ACCEPT)                   # HTTP 허용 (tcp/80)                │
│   IN HTTPS(ACCEPT)                  # HTTPS 허용 (tcp/443)              │
│   IN Ping(ACCEPT)                   # ICMP ping 허용                    │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

5.2 주요 매크로 목록

┌──────────────────┬─────────────────────────────────────────────────────┐
│     Macro        │                    Description                       │
├──────────────────┼─────────────────────────────────────────────────────┤
│ SSH              │ TCP 22 - Secure Shell                                │
│ HTTP             │ TCP 80 - HTTP Web Server                             │
│ HTTPS            │ TCP 443 - HTTPS Web Server                           │
│ DNS              │ TCP/UDP 53 - Domain Name System                      │
│ FTP              │ TCP 21 - File Transfer Protocol                      │
│ SMTP             │ TCP 25 - Mail Transfer                               │
│ SMTPs            │ TCP 465 - Secure SMTP                                │
│ IMAP             │ TCP 143 - Internet Mail Access Protocol              │
│ IMAPs            │ TCP 993 - Secure IMAP                                │
│ POP3             │ TCP 110 - Post Office Protocol                       │
│ POP3s            │ TCP 995 - Secure POP3                                │
│ NTP              │ UDP 123 - Network Time Protocol                      │
│ SNMP             │ UDP 161 - Simple Network Management Protocol         │
│ LDAP             │ TCP 389 - LDAP Directory Service                     │
│ LDAPs            │ TCP 636 - Secure LDAP                                │
│ MySQL            │ TCP 3306 - MySQL Database                            │
│ PostgreSQL       │ TCP 5432 - PostgreSQL Database                       │
│ MSSQL            │ TCP 1433 - Microsoft SQL Server                      │
│ RDP              │ TCP 3389 - Remote Desktop Protocol                   │
│ VNC              │ TCP 5900 - Virtual Network Computing                 │
│ Ping             │ ICMP echo-request - Ping                             │
│ Telnet           │ TCP 23 - Telnet (insecure)                           │
│ Syslog           │ UDP 514 - System Logging                             │
│ Ceph             │ TCP 6789,6800:7300 - Ceph Storage Cluster            │
│ Corosync         │ UDP 5405:5412 - Cluster Communication                │
│ SPICE            │ TCP 3128 - SPICE Proxy                               │
│ Web              │ TCP 80,443 - HTTP and HTTPS                          │
└──────────────────┴─────────────────────────────────────────────────────┘

5.3 매크로 활용 예제

# /etc/pve/firewall/100.fw (웹 서버 VM)

[OPTIONS]
enable: 1
policy_in: DROP
policy_out: ACCEPT

[RULES]
# 매크로를 사용한 간결한 규칙
IN SSH(ACCEPT) -source 192.168.1.0/24
IN HTTP(ACCEPT)
IN HTTPS(ACCEPT)
IN Ping(ACCEPT)

# MySQL은 내부 네트워크에서만
IN MySQL(ACCEPT) -source 10.0.0.0/8

6. Security Groups

6.1 Security Group 개념

Security Group은 **재사용 가능한 규칙 모음**입니다:

┌─────────────────────────────────────────────────────────────────────────┐
│                        Security Group Flow                               │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   cluster.fw                                                            │
│   ┌─────────────────────────────────────────┐                          │
│   │ [group webserver]                       │                          │
│   │ IN ACCEPT -p tcp -dport 80              │                          │
│   │ IN ACCEPT -p tcp -dport 443             │                          │
│   │                                         │                          │
│   │ [group database]                        │                          │
│   │ IN ACCEPT -p tcp -dport 3306            │                          │
│   │ IN ACCEPT -p tcp -dport 5432            │                          │
│   │                                         │                          │
│   │ [group monitoring]                      │                          │
│   │ IN ACCEPT -p tcp -dport 9090            │                          │
│   │ IN ACCEPT -p tcp -dport 9100            │                          │
│   └─────────────────────────────────────────┘                          │
│                    │                                                    │
│                    │ 참조                                               │
│                    ▼                                                    │
│   100.fw (웹서버VM)     101.fw (DB VM)       102.fw (모니터링 VM)        │
│   ┌──────────────┐    ┌──────────────┐    ┌──────────────┐            │
│   │ [RULES]      │    │ [RULES]      │    │ [RULES]      │            │
│   │ GROUP webserver   │ GROUP database│    │ GROUP monitoring          │
│   │ GROUP monitoring  │ GROUP monitoring   │                          │
│   └──────────────┘    └──────────────┘    └──────────────┘            │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

6.2 Security Group 정의 및 사용

# /etc/pve/firewall/cluster.fw

# 웹 서버 그룹 정의
[group webserver]
IN ACCEPT -p tcp -dport 80
IN ACCEPT -p tcp -dport 443
IN ACCEPT -p tcp -dport 8080

# 데이터베이스 그룹 정의
[group database]
IN ACCEPT -p tcp -dport 3306 -source +app_servers
IN ACCEPT -p tcp -dport 5432 -source +app_servers

# SSH 관리 그룹
[group ssh-management]
IN SSH(ACCEPT) -source +management

# 모니터링 그룹
[group monitoring]
IN ACCEPT -p tcp -dport 9090   # Prometheus
IN ACCEPT -p tcp -dport 9100   # Node Exporter
IN ACCEPT -p tcp -dport 9093   # Alertmanager

[IPSET app_servers]
192.168.1.10
192.168.1.11
192.168.1.12
# /etc/pve/firewall/100.fw (웹 서버 VM)

[OPTIONS]
enable: 1

[RULES]
GROUP webserver
GROUP ssh-management
GROUP monitoring
IN Ping(ACCEPT)

7. IP Sets

7.1 IP Set 유형

┌─────────────────────────────────────────────────────────────────────────┐
│                          IP Set Types                                    │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │ Standard IP Set: management                                     │   │
│  │ • 관리 IP 목록 (호스트 방화벽에만 적용)                            │   │
│  │ • GUI (8006), VNC (5900-5999), SPICE (3128), SSH (22) 자동 허용  │   │
│  │ • cluster_network 별칭이 자동 포함                               │   │
│  │                                                                  │   │
│  │ [IPSET management]                                              │   │
│  │ 192.168.1.10                                                    │   │
│  │ 192.168.1.0/24                                                  │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │ Standard IP Set: blacklist                                      │   │
│  │ • 모든 호스트와 VM에서 차단되는 IP 목록                            │   │
│  │ • 클러스터 전체에서 DROP 처리                                     │   │
│  │                                                                  │   │
│  │ [IPSET blacklist]                                               │   │
│  │ 203.0.113.0/24                                                  │   │
│  │ 198.51.100.50                                                   │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │ Standard IP Set: ipfilter-net*                                  │   │
│  │ • VM 인터페이스별 IP 스푸핑 방지                                   │   │
│  │ • 허용된 소스 IP만 해당 인터페이스에서 사용 가능                     │   │
│  │ • Container는 설정된 IP가 자동 포함                               │   │
│  │                                                                  │   │
│  │ # /etc/pve/firewall/<VMID>.fw                                   │   │
│  │ [IPSET ipfilter-net0]                                           │   │
│  │ 192.168.1.100                                                   │   │
│  │ 192.168.1.101                                                   │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │ Custom IP Set                                                   │   │
│  │ • 사용자 정의 IP 그룹                                             │   │
│  │ • 규칙에서 +name으로 참조                                         │   │
│  │                                                                  │   │
│  │ [IPSET trusted_networks]                                        │   │
│  │ 10.0.0.0/8                                                      │   │
│  │ 172.16.0.0/12                                                   │   │
│  │ 192.168.0.0/16                                                  │   │
│  │                                                                  │   │
│  │ [RULES]                                                         │   │
│  │ IN ACCEPT -source +trusted_networks -p tcp -dport 22            │   │
│  └─────────────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────────────┘

7.2 IP Set 관리 예제

# /etc/pve/firewall/cluster.fw

# 관리 네트워크
[IPSET management]
192.168.1.10        # 관리자 워크스테이션
192.168.1.0/24      # 관리 서브넷
10.0.0.0/8          # 내부 네트워크

# 차단 목록
[IPSET blacklist]
# 악성 IP
203.0.113.50
198.51.100.0/24
# 특정 국가 IP 범위 (예시)
# 1.0.0.0/8

# 애플리케이션 서버 그룹
[IPSET app_servers]
192.168.1.20        # app-server-1
192.168.1.21        # app-server-2
192.168.1.22        # app-server-3

# 데이터베이스 클라이언트
[IPSET db_clients]
192.168.1.20
192.168.1.21
192.168.1.22
192.168.1.30        # reporting server

# 모니터링 시스템
[IPSET monitoring]
192.168.1.50        # prometheus
192.168.1.51        # grafana

8. IP Aliases

8.1 Alias 개념

Alias는 IP 주소나 네트워크에 **이름을 부여**합니다:

┌─────────────────────────────────────────────────────────────────────────┐
│                           IP Aliases                                     │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   [ALIASES]                                                             │
│   local_network 192.168.1.0/24      # 로컬 네트워크                      │
│   backup_server 192.168.1.100       # 백업 서버                          │
│   monitoring 10.0.0.50              # 모니터링 서버                       │
│   external_dns 8.8.8.8              # 외부 DNS                           │
│                                                                         │
│   [RULES]                                                               │
│   IN ACCEPT -source local_network -p tcp -dport 22                     │
│   IN ACCEPT -source monitoring -p tcp -dport 9100                      │
│   OUT ACCEPT -dest external_dns -p udp -dport 53                       │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

8.2 Standard Alias: local_network

# local_network 별칭 확인
pve-firewall localnet

# 출력 예시:
# local hostname: node1
# local IP address: 192.168.1.10
# network auto detect: 192.168.1.0/24
# using detected local_network: 192.168.1.0/24

이 별칭은 **클러스터 통신에 자동으로 사용**됩니다 (Corosync, API, SSH).

8.3 Alias 오버라이드

# /etc/pve/firewall/cluster.fw

[ALIASES]
# 자동 감지된 local_network 오버라이드 (단일 호스트/공용 네트워크)
local_network 203.0.113.10

# 커스텀 별칭
primary_dns 8.8.8.8
secondary_dns 8.8.4.4
ntp_server time.google.com
log_server 192.168.1.60

9. 서비스 및 명령어

9.1 pve-firewall 명령어

# 방화벽 시작
pve-firewall start

# 방화벽 중지
pve-firewall stop

# 상태 확인 (설정 오류도 표시)
pve-firewall status

# 로컬 네트워크 정보 확인
pve-firewall localnet

# 규칙 컴파일 (디버깅용)
pve-firewall compile

# 시뮬레이션 (적용 전 테스트)
pve-firewall simulate

9.2 iptables 규칙 확인

# 현재 적용된 모든 규칙 확인
iptables-save

# 특정 체인 확인
iptables -L -n -v

# INPUT 체인 상세
iptables -L INPUT -n -v --line-numbers

# FORWARD 체인 상세
iptables -L FORWARD -n -v --line-numbers

# NAT 테이블 확인
iptables -t nat -L -n -v

9.3 방화벽 로그 확인

# 방화벽 로그 확인
tail -f /var/log/pve-firewall.log

# 특정 VM 관련 로그
grep "VM 100" /var/log/pve-firewall.log

# journalctl로 확인
journalctl -u pve-firewall -f

10. 기본 방화벽 규칙

10.1 활성화 시 기본 허용 트래픽

방화벽을 활성화하면 기본적으로 모든 트래픽이 **차단**되지만, 다음은 자동 허용됩니다:

┌─────────────────────────────────────────────────────────────────────────┐
│              Default Allowed Traffic (Datacenter Level)                  │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  자동 허용되는 트래픽:                                                    │
│                                                                         │
│  • Loopback 인터페이스 (localhost)                                       │
│  • 이미 설정된 연결 (ESTABLISHED, RELATED)                               │
│  • IGMP 프로토콜 (멀티캐스트)                                             │
│  • management IP셋에서:                                                  │
│    - TCP 8006 (Web GUI)                                                 │
│    - TCP 5900-5999 (VNC)                                                │
│    - TCP 3128 (SPICE)                                                   │
│    - TCP 22 (SSH)                                                       │
│  • cluster_network에서:                                                  │
│    - UDP 5405-5412 (Corosync)                                           │
│    - UDP 멀티캐스트                                                      │
│  • ICMP type 3, 4, 11 (에러 메시지)                                      │
│                                                                         │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  자동 DROP (로그 없음):                                                   │
│                                                                         │
│  • 잘못된 연결 상태의 TCP                                                 │
│  • Corosync 외 브로드캐스트/멀티캐스트                                     │
│  • TCP 43, 135, 139, 445                                                │
│  • UDP 135, 137-139, 445, 1900                                          │
│  • 소스 포트 53 UDP (DNS 반사 공격 방지)                                  │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

10.2 Proxmox VE 사용 포트

┌───────────────┬──────────┬─────────────────────────────────────────────┐
│     Port      │ Protocol │              Description                     │
├───────────────┼──────────┼─────────────────────────────────────────────┤
│     22        │   TCP    │ SSH                                          │
│    111        │   UDP    │ rpcbind                                      │
│    3128       │   TCP    │ SPICE proxy                                  │
│    5405-5412  │   UDP    │ Corosync cluster                             │
│    5900-5999  │   TCP    │ VNC WebSocket                                │
│    8006       │   TCP    │ Web GUI (HTTPS)                              │
│    60000-60050│   TCP    │ Live migration                               │
│    25         │   TCP    │ sendmail (outgoing)                          │
└───────────────┴──────────┴─────────────────────────────────────────────┘

11. nftables (Tech Preview)

11.1 nftables vs iptables

┌─────────────────────────────────────────────────────────────────────────┐
│                    nftables vs iptables Comparison                       │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  Feature              │ iptables (pve-firewall) │ nftables (proxmox-fw) │
│  ─────────────────────┼─────────────────────────┼───────────────────────│
│  기본 상태             │ Production               │ Tech Preview          │
│  FORWARD 규칙         │ 미지원                    │ 지원                   │
│  VNet 레벨 규칙       │ 미지원                    │ 지원                   │
│  Firewall Bridge      │ fwbrX 생성               │ 불필요                 │
│  REJECT (guest)       │ 지원                      │ DROP으로 대체          │
│  성능                  │ 검증됨                    │ 개선됨                 │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

11.2 nftables 활성화

# proxmox-firewall 패키지 설치
apt install proxmox-firewall

# 호스트 설정에서 활성화
# /etc/pve/nodes/<node_name>/host.fw
[OPTIONS]
nftables: 1

# 또는 GUI: Host → Firewall → Options → nftables: Yes

11.3 nftables 관리 명령어

# 서비스 관리
systemctl start proxmox-firewall
systemctl stop proxmox-firewall
systemctl status proxmox-firewall

# 현재 규칙셋 확인
nft list ruleset

# 컴파일된 규칙 덤프
/usr/libexec/proxmox/proxmox-firewall compile

# 기본 규칙셋 확인
/usr/libexec/proxmox/proxmox-firewall skeleton

# 디버그 로그 활성화
systemctl edit proxmox-firewall
# [Service]
# Environment="PVE_LOG=trace"

11.4 nftables 트래픽 추적

#!/usr/sbin/nft -f
# 패킷 추적 테이블 생성 (ICMP만 추적)

table bridge tracebridge
delete table bridge tracebridge

table bridge tracebridge {
    chain trace {
        meta l4proto icmp meta nftrace set 1
    }

    chain prerouting {
        type filter hook prerouting priority -350; policy accept;
        jump trace
    }

    chain postrouting {
        type filter hook postrouting priority -350; policy accept;
        jump trace
    }
}

# 추적 모니터링
# nft monitor trace

# 추적 테이블 삭제
# nft delete table bridge tracebridge

12. 실전 시나리오

12.1 웹 서버 VM 방화벽 설정

# /etc/pve/firewall/100.fw (웹 서버)

[OPTIONS]
enable: 1
policy_in: DROP
policy_out: ACCEPT
dhcp: 0
macfilter: 1
ipfilter: 1
log_level_in: info

[RULES]
# 웹 서비스
IN HTTP(ACCEPT)
IN HTTPS(ACCEPT)

# SSH는 관리 네트워크에서만
IN SSH(ACCEPT) -source +management

# 모니터링
IN ACCEPT -source +monitoring -p tcp -dport 9100

# Ping 허용
IN Ping(ACCEPT) -source +management

# 나머지 DROP (로그 기록)
IN DROP -log warning

[IPSET ipfilter-net0]
192.168.1.100

12.2 데이터베이스 VM 방화벽 설정

# /etc/pve/firewall/101.fw (MySQL 서버)

[OPTIONS]
enable: 1
policy_in: DROP
policy_out: ACCEPT
macfilter: 1
ipfilter: 1
log_level_in: warning

[RULES]
# MySQL은 앱 서버에서만
IN MySQL(ACCEPT) -source +app_servers

# SSH는 관리자만
IN SSH(ACCEPT) -source +management

# 모니터링 (MySQL Exporter)
IN ACCEPT -source +monitoring -p tcp -dport 9104

# 백업 서버
IN ACCEPT -source backup_server -p tcp -dport 3306

# Ping (관리용)
IN Ping(ACCEPT) -source +management

[ALIASES]
backup_server 192.168.1.200

12.3 멀티 티어 아키텍처

# /etc/pve/firewall/cluster.fw

[OPTIONS]
enable: 1
policy_in: DROP
policy_out: ACCEPT

# ===== Security Groups =====

[group web-tier]
IN HTTP(ACCEPT)
IN HTTPS(ACCEPT)

[group app-tier]
IN ACCEPT -source +web_servers -p tcp -dport 8080

[group db-tier]
IN ACCEPT -source +app_servers -p tcp -dport 3306
IN ACCEPT -source +app_servers -p tcp -dport 5432

[group common]
IN SSH(ACCEPT) -source +management
IN Ping(ACCEPT) -source +management
IN ACCEPT -source +monitoring -p tcp -dport 9100

# ===== IP Sets =====

[IPSET management]
192.168.1.10
192.168.1.0/24

[IPSET monitoring]
192.168.1.50

[IPSET web_servers]
192.168.1.100
192.168.1.101

[IPSET app_servers]
192.168.1.110
192.168.1.111

[IPSET db_servers]
192.168.1.120
192.168.1.121
# /etc/pve/firewall/100.fw (Web Server 1)
[OPTIONS]
enable: 1

[RULES]
GROUP web-tier
GROUP common

# /etc/pve/firewall/110.fw (App Server 1)
[OPTIONS]
enable: 1

[RULES]
GROUP app-tier
GROUP common

# /etc/pve/firewall/120.fw (DB Server 1)
[OPTIONS]
enable: 1

[RULES]
GROUP db-tier
GROUP common

13. 문제 해결

13.1 일반적인 문제

┌─────────────────────────────────────────────────────────────────────────┐
│                     Common Firewall Issues                               │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  문제: 방화벽 활성화 후 GUI 접속 불가                                      │
│  ─────────────────────────────────────────                              │
│  원인: management IP셋이 비어있거나 잘못된 IP                             │
│  해결:                                                                   │
│  1. SSH로 직접 접속 (SSH 세션 유지)                                       │
│  2. /etc/pve/firewall/cluster.fw 수정                                   │
│  3. [IPSET management]에 관리자 IP 추가                                  │
│                                                                         │
│  문제: VM 간 통신 불가                                                    │
│  ─────────────────────────                                              │
│  원인: VM 방화벽이 활성화되어 있고 규칙이 없음                              │
│  해결:                                                                   │
│  1. /etc/pve/firewall/<VMID>.fw에서 규칙 추가                            │
│  2. 또는 해당 네트워크 인터페이스의 방화벽 비활성화                          │
│                                                                         │
│  문제: 클러스터 통신 장애                                                  │
│  ─────────────────────────                                              │
│  원인: Corosync 포트가 차단됨                                             │
│  해결:                                                                   │
│  1. local_network 별칭 확인: pve-firewall localnet                       │
│  2. cluster.fw에서 local_network가 올바른지 확인                          │
│  3. UDP 5405-5412 허용 확인                                              │
│                                                                         │
│  문제: 라이브 마이그레이션 실패                                            │
│  ───────────────────────────                                            │
│  원인: 마이그레이션 포트 차단                                              │
│  해결:                                                                   │
│  1. TCP 60000-60050 클러스터 네트워크에서 허용                            │
│  2. 또는 마이그레이션 네트워크를 별도로 지정                                │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

13.2 디버깅 명령어

# 방화벽 상태 및 설정 오류 확인
pve-firewall status

# 컴파일된 규칙 확인 (적용 전)
pve-firewall compile

# 현재 iptables 규칙
iptables-save | less

# 특정 체인의 패킷 카운터 확인
iptables -L -n -v | grep -A 20 "Chain PVEFW"

# 로그 실시간 모니터링
tail -f /var/log/pve-firewall.log

# 연결 추적 테이블 확인
conntrack -L

# 연결 추적 통계
conntrack -S

13.3 긴급 복구

# 방화벽 즉시 중지 (모든 규칙 제거)
pve-firewall stop

# 또는 iptables 직접 플러시 (위험!)
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# 방화벽 비활성화 (재부팅 후에도 유지)
# /etc/pve/firewall/cluster.fw
[OPTIONS]
enable: 0

14. 모범 사례

14.1 설정 전 체크리스트

□ SSH 세션을 유지한 상태에서 방화벽 활성화
□ management IP셋에 관리자 IP 추가
□ local_network 별칭이 올바른지 확인
□ 테스트 VM에서 먼저 규칙 테스트
□ 변경 전 현재 설정 백업

14.2 규칙 작성 가이드라인

# 1. 가장 구체적인 규칙을 먼저 배치
IN ACCEPT -source 192.168.1.10 -p tcp -dport 22    # 특정 IP
IN ACCEPT -source 192.168.1.0/24 -p tcp -dport 22  # 서브넷
IN DROP                                              # 기본 거부

# 2. Security Group 활용으로 중복 제거
GROUP webserver
GROUP monitoring
GROUP ssh-management

# 3. IP Set으로 IP 목록 관리
IN ACCEPT -source +trusted_servers -p tcp -dport 3306

# 4. Alias로 가독성 향상
IN ACCEPT -source backup_server -p tcp -dport 22

# 5. 로그 레벨 적절히 설정
IN ACCEPT -p tcp -dport 22 -log info     # 중요 트래픽 로그
IN DROP -log warning                       # 차단 트래픽 경고

14.3 성능 최적화

# 로그 레이트 제한 설정
[OPTIONS]
log_ratelimit: enable=1,rate=1/second,burst=5

# 연결 추적 최적화 (고성능 환경)
# /etc/pve/nodes/<node>/host.fw
[OPTIONS]
nf_conntrack_max: 1048576
nf_conntrack_tcp_timeout_established: 86400

# 불필요한 로그 비활성화
log_level_in: nolog
log_level_out: nolog

15. 요약 및 명령어 참조

15.1 설정 파일 위치

파일 용도
/etc/pve/firewall/cluster.fw 클러스터 전체 설정
/etc/pve/nodes/<node>/host.fw 호스트별 설정
/etc/pve/firewall/<VMID>.fw VM/CT별 설정
/etc/pve/sdn/firewall/<vnet>.fw VNet 설정 (nftables)

15.2 주요 명령어

# 서비스 관리
pve-firewall start|stop|status

# 정보 확인
pve-firewall localnet
pve-firewall compile
pve-firewall simulate

# iptables 확인
iptables-save
iptables -L -n -v

# nftables (tech preview)
systemctl start|stop|status proxmox-firewall
nft list ruleset

# 로그
tail -f /var/log/pve-firewall.log
journalctl -u pve-firewall -f

15.3 규칙 문법 요약

# 기본 형식
DIRECTION ACTION [-옵션 ] ...

# 매크로 형식
DIRECTION MACRO(ACTION) [-옵션 ] ...

# 그룹 참조
GROUP groupname

# 주요 옵션
-source IP/네트워크/+ipset/alias
-dest IP/네트워크/+ipset/alias
-p 프로토콜
-sport 소스포트
-dport 목적지포트
-i 인터페이스
-log 로그레벨

다음 모듈 예고

**Module 8: User Management**에서는 다음을 학습합니다: - 인증 영역(PAM, PVE, LDAP, AD, OpenID Connect) - 사용자, 그룹, API 토큰 관리 - 역할 기반 접근 제어(RBAC) - 2단계 인증(TOTP, WebAuthn, YubiKey) - pveum 명령어 활용