허용: 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 |
요구사항네트워크 구성VM 격리와 네트워크 접근 제어방화벽 정책 기준1. Sunshine 트래픽과 일반 라우팅2. Netfilter hook·verdict 검증3. Windows–Docker FORWARD 경로4. 신규 연결과 conntrack 상태흐름별 허용·차단 결과구성 변경 이력2025년 2~3월 — NAT와 포트포워딩2025년 8월 — Tailscale 관리망2025년 9~10월 — Windows 원격 분석 환경2025년 9월 말 — UFW에서 native nftables로2025년 10월 — Docker L3 bridge와 운영 자동화기술 시리즈1. 원격 Windows 분석 환경2. Tailscale·전용 NIC 라우팅3. UFW·nftables 신뢰 경계4. Docker L3 bridge·gdbserver5. 시작 순서·패킷 검증적용한 설정Sources작업 기록공식 문서
요구사항
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로 전달되는 트래픽을 목적지와 포트별로 처리한다.