Files
obsidian/infra/openwrt.md

3.7 KiB

title, updated, tags
title updated tags
OpenWrt 라우터 (서울) 2026-03-25
openwrt
haproxy
nftables
firewall

호스트 정보

항목
SSH root@100.66.60.66 (openwrt-gw)
모델 FUJITSU FMVC04004
CPU AMD GX-222GC 2코어 2GHz
RAM 3.6GB
NIC 1Gbps x2 (eth0: br-lan, eth1: WAN)
OS OpenWrt (x86_64, 커널 6.12)

HAProxy

설정 파일: /etc/haproxy.cfg stats: :9999 (admin/admin) maxconn: 20000

포트 매핑

Frontend Port Backend 대상 용도
ft_http :80 bk_traefik_http 3노드 :80 roundrobin Traefik 메인 라우팅
ft_https :443 bk_traefik_https 3노드 :443 roundrobin Traefik 메인 라우팅
ft_apisix_http :9080 bk_apisix_http 3노드 :30233 roundrobin APISIX SafeLine WAF
ft_apisix_https :9443 bk_apisix_https 3노드 :31137 roundrobin APISIX SafeLine WAF

백엔드 노드: incus-kr2(192.168.9.135), incus-kr1(192.168.9.214), incus-hp2(192.168.9.134)

nftables 방화벽

CDN IP 필터 (/etc/nftables.d/10-cdn-filter.nft)

named set 방식으로 BunnyCDN + Cloudflare IP를 관리. 80/443/9080/9443 포트에 대해 CDN IP만 허용, WAN 직접 접근 차단.

set cdn_ipv4 { type ipv4_addr; flags interval; elements = { BunnyCDN IPs + Cloudflare IPv4 CIDRs } }
set cdn_ipv6 { type ipv6_addr; flags interval; elements = { Cloudflare IPv6 CIDRs } }

chain cdn_filter {
    tcp dport { 80, 443, 9080, 9443 } ip saddr @cdn_ipv4 accept
    udp dport 443 ip saddr @cdn_ipv4 accept
    tcp dport { 80, 443, 9080, 9443 } ip6 saddr @cdn_ipv6 accept
    udp dport 443 ip6 saddr @cdn_ipv6 accept
    tcp dport { 80, 443, 9080, 9443 } iifname "eth1" drop
    udp dport 443 iifname "eth1" drop
}

CDN IP 갱신 스크립트 (/etc/cdn-filter-update.sh)

BunnyCDN API + Cloudflare IP 목록을 다운로드하여 named set 재생성 → fw4 restart. 수동 실행: sh /etc/cdn-filter-update.sh

QUIC 로드밸런싱 (table ip quic_lb)

nftables DNAT으로 UDP 443을 3노드 APISIX :9443에 round-robin 분배.

NAT Reflection (dstnat_lan)

LAN(192.168.1.0/24, 192.168.9.0/24)에서 공인IP(220.120.65.245)로 접근 시 192.168.9.1(라우터)로 DNAT → HAProxy 경유.

WAN DNAT (dstnat_wan)

WAN TCP 80/443 → 192.168.9.1:80/443 (HAProxy)로 DNAT.

백업

  • 스크립트: /usr/local/bin/backup-openwrt.sh
  • 스케줄: cron 매일 03:30
  • 방식: sysupgrade -b → scp → NAS
  • NAS 경로: kaffa@192.168.9.100:/volume1/k3s-backup/openwrt/
  • SSH 키: /root/.ssh/id_ed25519
  • 보관: 7일 초과 자동 삭제
  • 크기: ~18KB
  • 복원: sysupgrade -r backup.tar.gz
  • 포함: /etc/ 전체 (haproxy.cfg, nftables.d/, config/, crontabs/, ssh 키 등)
  • R2 연동: NAS /volume1/k3s-backup/ → R2 k3s-backup 버킷 (기존 r2-backup.timer로 자동 포함)

cron 작업

스케줄 스크립트 용도
03:30 /usr/local/bin/backup-openwrt.sh 설정 백업 → NAS
04:00 /etc/cdn-filter-update.sh BunnyCDN+Cloudflare IP 갱신

WAN DNAT (fw4)

/etc/config/firewall의 redirect 규칙. firewall restart 시 dstnat_wan 체인에 반영.

Name Port 대상 비고
APISIX-HTTP :80 192.168.9.1:80 Traefik 메인
APISIX-HTTPS :443 192.168.9.1:443 Traefik 메인
APISIX-WAF-HTTP :9080 192.168.9.1:9080 APISIX WAF
APISIX-WAF-HTTPS :9443 192.168.9.1:9443 APISIX WAF

DNAT 없으면 input_wanreject_from_wan으로 차단됨. DNAT이 있어야 ct status dnat accept로 통과.

관련 문서