🛡️

악성코드 분석 VM을 원격으로 보되, 역방향은 막기 — Linux 격리 게이트웨이 총정리

Description
MacBook → Tailscale → Linux → Windows VM 경로와 전용 NIC, nftables INPUT·FORWARD, Docker bridge 설정을 정리한 5편 기술 시리즈
URL
기간
Feb 23, 2025 → Oct 18, 2025
분야
보안
상태
초안
시리즈
Security Foundations
요약
MacBook에서 Windows 분석 VM으로 들어가는 원격 경로만 허용하고, VM이 Linux·Tailnet·WAN으로 시작하는 신규 연결을 nftables에서 차단한 구성과 검증 과정을 정리한다.
원작성일
Aug 26, 2026
태그
Linux
Docker
Pentesting
🛡️
허용: MacBook Moonlight → Windows VM Sunshine, Windows VM → Docker gdbserver TCP 31234
차단: Windows VM → Linux 호스트, WAN, Tailnet의 비허용 포트
Linux에서 Tailscale subnet routing과 nftables filtering을 처리한다.
항목
구현 내용
관리 장비
MacBook · Tailscale · Moonlight Client
정책 집행 지점
Linux · IPv4 forwarding · nftables
분석망
전용 NIC 10.10.0.10/24 ↔ Windows VM 10.10.0.20
원격 화면
Windows VM의 Sunshine Server와 가상 디스플레이
Docker 디버깅망
foxirain4 · 10.20.0.0/24 · gdbserver TCP 31234
기본 경계
input drop · forward drop · stateful whitelist

요구사항

Windows VM에서 악성코드를 실행하면서 화면과 입력은 MacBook에서 받아야 했다. Sunshine으로 원격 화면을 열려면 VM에 네트워크 경로가 필요하지만, 그 경로가 Linux·Tailnet·WAN 전체로 이어져서는 안 됐다.
정책 요구사항은 다음과 같이 잡았다.
  • MacBook에서는 Windows 분석 환경으로 들어갈 수 있어야 한다.
  • Sunshine/Moonlight의 TCP·UDP 세션이 정상적으로 동작해야 한다.
  • Windows 분석 VM에서 Linux 서버로 신규 연결을 만들면 안 된다.
  • Windows가 Linux를 router로 사용해 Tailnet이나 WAN으로 이동하면 안 된다.
  • Docker의 CTF·Linux 디버깅 환경은 필요한 포트로만 연결해야 한다.
  • Tailscale과 Docker가 동적으로 만드는 firewall chain까지 재부팅 후 같은 순서로 재현해야 한다.
Linux는 이 요구사항을 집행하는 VPN 진입점 + subnet router + stateful firewall + Docker router로 구성했다.

네트워크 구성

🎮
Moonlight는 MacBook, Sunshine은 Windows VM에서 실행한다. Linux에는 두 프로그램이 없고, Tailscale 패킷을 분석망으로 forwarding하며 nftables로 허용 범위를 결정한다.

VM 격리와 네트워크 접근 제어

Hypervisor는 VM의 CPU·메모리를 분리하지만, VM이 어느 네트워크로 연결될지는 별도의 정책이 필요하다. NIST도 VM 보호에서 virtual network segmentation과 firewall traffic control을 독립적인 설계 요소로 다룬다. NIST SP 800-125B
Windows VM의 next hop은 Linux 10.10.0.10이다. Linux의 nftables가 VM에서 접근할 수 있는 목적지와 서비스를 제한한다.
MacBook → Windows VM 관리 세션 허용 허용된 세션의 응답 허용 Windows VM → Linux 신규 연결 차단 Windows VM → WAN 차단 Windows VM → Tailnet 비허용 포트 차단 Windows VM → Docker TCP 31234 허용
MacBook에서 시작한 관리 세션과 TCP 31234 디버깅 연결은 허용한다. Windows VM에서 Linux·WAN·Tailnet으로 시작하는 나머지 신규 연결은 차단한다.

방화벽 정책 기준

1. Sunshine 트래픽과 일반 라우팅

Sunshine/Moonlight 포트는 Tailnet에서 Windows VM으로 전달한다. Windows VM의 WAN routing과 Tailnet 비허용 포트는 별도 규칙으로 차단한다.

2. Netfilter hook·verdict 검증

UFW의 forwarding policy를 DROP으로 설정한 뒤에도 Moonlight 통신과 Docker published port가 동작했다. ufw status 외에 Netfilter hook, chain priority, connection state와 최종 verdict를 확인했다.
Docker 공식 문서도 Docker와 UFW의 rule path가 충돌할 수 있으며 published container traffic이 UFW가 사용하는 INPUT·OUTPUT보다 앞에서 NAT될 수 있다고 설명한다. Docker packet filtering and firewalls

3. Windows–Docker FORWARD 경로

macvlan L2 직결을 제거하고 Docker 컨테이너를 foxirain4 bridge에 연결했다. Windows의 10.20.0.0/24 트래픽은 Linux FORWARD hook을 통과한다.

4. 신규 연결과 conntrack 상태

신규 연결은 interface·source·destination·port 조건으로 허용한다. 허용된 세션의 응답은 ct state established,related로 처리한다.

흐름별 허용·차단 결과

패킷 흐름
결과
정책
MacBook Tailnet → Windows SSH 22
ALLOW
FWD-TS
MacBook Tailnet → Windows 스트리밍 포트
ALLOW
FWD-TS
Tailnet → Windows 임의 포트
DROP
명시적 TS→VM drop
Windows → Linux 호스트 신규 연결
DROP
INPUT internal drop
Windows → WAN
DROP
FWD-VM
Windows → Tailnet 임의 포트
DROP
명시적 VM→TS drop
Windows → Docker TCP 31234
ALLOW
FWD-DOCKER
허용된 세션의 응답
ALLOW
FWD-STATE
Docker 디버깅망은 Windows 분석망과 역할이 다르다. foxirain4는 CTF·gdbserver 실행 환경이며 Docker → WAN egress가 허용돼 있다. 주된 malware network boundary는 Windows 10.10.0.20과 전용 분석망의 nftables 정책이다.

구성 변경 이력

2025년 2~3월 — NAT와 포트포워딩

SER8 미니 PC에 서버를 올리고 외부 SSH를 위해 공유기 포트포워딩을 사용했다. 공유기 주소와 서버에서 보이는 외부 주소가 달라지는 문제를 겪으면서 NAT와 route를 직접 보기 시작했다. ,

2025년 8월 — Tailscale 관리망

공개 포트를 늘리는 대신 여러 장비를 안전하게 묶기 위해 Tailscale을 선택했다. 당시 기록에는 선택 이유를 “보안성이 제일 컸다”고 적었다. ,

2025년 9~10월 — Windows 원격 분석 환경

Windows VM과 가상 디스플레이를 만들고 Sunshine을 구성했다. MacBook의 Moonlight가 Tailnet을 통해 Linux subnet router를 거쳐 Windows로 들어가도록 했다. ,

2025년 9월 말 — UFW에서 native nftables로

UFW에서 차단했다고 생각한 흐름이 실제로는 계속 통신하는 현상을 보고 Docker·Tailscale chain을 포함한 전체 ruleset을 추적했다. 이후 INPUT·FORWARD 기본 DROP과 명시적 whitelist를 직접 작성했다. ,

2025년 10월 — Docker L3 bridge와 운영 자동화

macvlan을 철회하고 foxirain4를 만들었다. Docker chain과 native nftables를 packet mark로 연결하고, tailscaled → Docker → nftables 순서로 재현하는 스크립트를 완성했다. , ,

기술 시리즈

1. 원격 Windows 분석 환경

Sunshine·Moonlight의 실제 실행 위치, Virtual Display Driver, 스트리밍 포트와 stateful response를 다룬다.

2. Tailscale·전용 NIC 라우팅

tailscale0, 10.10.0.10/24 전용 NIC, subnet route, SNAT과 FORWARD 경로를 다룬다.

3. UFW·nftables 신뢰 경계

UFW에서 막았는데도 통신된 이유, iptables-nft와 native nftables의 차이, 전체 /etc/nftables.conf와 packet mark를 다룬다.

4. Docker L3 bridge·gdbserver

macvlan을 철회한 이유, foxirain4 10.20.0.0/24, Windows route와 gdbserver TCP 31234를 다룬다.

5. 시작 순서·패킷 검증

tailscaled → Docker → nftables 순서, 실행 로그, counter·tcpdump 기반 허용·차단 검증을 다룬다.

적용한 설정

  • Linux multi-homed gateway의 주소·route 설계
  • Tailscale subnet router와 SNAT 이해
  • Netfilter INPUT·FORWARD·OUTPUT 경로 분석
  • native nftables의 base-chain priority와 stateful filtering
  • Docker가 만든 chain과 사용자 정책의 packet mark 연동
  • macvlan과 bridge의 패킷 경로 비교
  • Windows와 Docker subnet 사이의 제한된 디버깅 route
  • 동적 firewall을 시작 순서·로그·negative test로 재현
Linux의 INPUT chain은 Windows VM에서 Linux 호스트로 들어오는 신규 연결을 차단한다. FORWARD chain은 Windows VM에서 WAN·Tailnet·Docker로 전달되는 트래픽을 목적지와 포트별로 처리한다.

Sources

작업 기록

공식 문서