Subnet route: 10.10.0.0/24
Router: Linux tailscale0 ↔ enx00e04c637a20
Destination: Windows VM 10.10.0.20
Linux 기반 악성코드 분석 VM 격리망 · 2/5
관리망 구성 변경라우팅 경로인터페이스 및 주소전용 NIC NetworkManager 설정전용 NIC 라우팅 설정커널 IPv4 forwardingTailscale subnet route 설정SNAT 및 return pathMacBook → Windows 패킷 처리 순서INPUT과 FORWARD의 처리 대상설정 검증정리Sources작업 기록공식 문서시리즈 이동
관리망 구성 변경
공유기에서 SWAG 웹 서버와 SSH용 외부 포트 20022를 포워딩하던 상태에서는 서비스마다 공개 포트를 따로 관리해야 했다. 장비와 관리 경로가 늘어나자 포트포워딩 자체가 운영 대상이 됐다.
SSHFS/SFTP, WireGuard + Samba/NFS, Tailscale + Samba를 비교한 뒤 Tailscale을 선택했다. 직접 WireGuard peer와 route를 관리하는 범위를 줄이면서 여러 장비의 관리 경로를 하나의 Tailnet으로 묶을 수 있었기 때문이다. 당시 기록에도 선택 기준을 보안성으로 남겼다.
Tailscale은 Linux 서버 관리와 10.10.0.0/24 분석망 접근에 사용했다.
라우팅 경로
Tailscale의 subnet router는 Tailscale client를 설치하지 않은 장치나 기존 subnet을 Tailnet에 연결하는 방식이다. Linux subnet router에서는 커널이 패킷 forwarding을 담당한다. Tailscale subnet routers, Kernel vs. netstack routing
인터페이스 및 주소
영역 | 인터페이스·주소 | 역할 |
일반 외부망 | enp1s0 | Linux 서버 업데이트와 일반 WAN 통신 |
관리망 | tailscale0 | MacBook 등 Tailnet 장비의 진입점 |
분석망 게이트웨이 | enx00e04c637a20 · 10.10.0.10/24 | Windows VM과 1:1 연결 |
분석 대상 | Windows VM · 10.10.0.20 | Sunshine과 분석 도구 실행 |
Docker망 | foxirain4 · 10.20.0.1/24 | 별도 CTF·gdbserver 환경 |
Windows VM에서 오는 패킷의 ingress는 enx00e04c637a20으로 고정된다. nftables INPUT·FORWARD 규칙에서 이 인터페이스를 조건으로 사용한다.
전용 NIC NetworkManager 설정
connection.id: enx00e04c637a20 connection.type: 802-3-ethernet connection.interface-name: enx00e04c637a20 connection.autoconnect: yes 802-3-ethernet.mac-address: 00:E0:4C:63:7A:20 ipv4.method: manual ipv4.addresses: 10.10.0.10/24 ipv4.gateway: -- ipv4.routes: -- ipv6.method: disabled
같은 연결을 nmcli로 만들면 다음과 같다.
sudo nmcli connection add type ethernet ifname enx00e04c637a20 con-name enx00e04c637a20 ipv4.method manual ipv4.addresses 10.10.0.10/24 ipv4.gateway "" ipv6.method disabled sudo nmcli connection modify enx00e04c637a20 connection.autoconnect yes sudo nmcli connection up enx00e04c637a20
NetworkManager에서 ipv4.method=manual은 정적 IPv4 주소를 사용한다. gateway 값을 설정하면 표준 default route가 생성되므로, 이 전용 링크에는 gateway를 두지 않았다. NetworkManager nm-settings-nmcli
전용 NIC 라우팅 설정
분석 NIC에는 10.10.0.0/24의 connected route만 필요하다.
Linux 기본 경로 └─ enp1s0 → 일반 네트워크 분석망 직접 연결 └─ enx00e04c637a20 → 10.10.0.0/24
전용 NIC에 gateway를 추가하면 Linux의 기본 경로 선택에 영향을 줄 수 있다. 반대로 gateway가 없어도 같은 10.10.0.0/24에 있는 Windows VM 10.10.0.20과는 connected route로 통신할 수 있다.
Windows VM은 10.10.0.10을 gateway로 사용한다. 다른 subnet으로 전달되는 패킷은 Linux의 nftables FORWARD 규칙에서 허용하거나 차단한다.
커널 IPv4 forwarding
Linux가 tailscale0와 전용 NIC 사이를 라우팅하려면 커널 forwarding이 필요하다.
# /etc/sysctl.d/99-tailscale.conf net.ipv4.ip_forward=1 sudo sysctl --system
Docker 공식 문서도 multi-interface 호스트에서 IP forwarding을 켤 때 원하지 않는 인터페이스 간 forwarding을 방화벽으로 차단하라고 설명한다. Docker packet filtering and firewalls
즉,
ip_forward=1은 접근 허용 정책이 아니다. 커널이 라우터 역할을 수행할 수 있게 하는 전제이고, 실제 허용·차단은 FORWARD chain의 책임이다.Tailscale subnet route 설정
서버에 저장된 Tailscale preferences는 다음과 같다.
{ "RunSSH": true, "WantRunning": true, "RouteAll": false, "ExitNodeID": "", "AdvertiseRoutes": [ "10.10.0.0/24" ], "NoSNAT": false, "NoStatefulFiltering": true, "NetfilterMode": 2 }
명령으로 표현하면 다음 형태다.
sudo tailscale up --ssh --advertise-routes=10.10.0.0/24
AdvertiseRoutes에는 10.10.0.0/24만 설정되어 있다. Exit node 경로인 0.0.0.0/0과 ::/0은 광고하지 않는다.Tailscale은 Linux에서 netfilter 규칙을 자동으로 만들 수 있고 on, nodivert, off 모드를 제공한다. 이 서버에서는 Tailscale의 ts-input·ts-forward chain과 native nftables 정책이 함께 동작한다. Tailscale netfilter modes
SNAT 및 return path
Tailscale subnet router는 기본적으로 SNAT을 사용한다. 내 preferences의 NoSNAT=false도 기본 SNAT을 사용한다는 뜻이다. Tailscale subnet routers
MacBook의 원래 Tailnet 주소 │ ▼ Linux subnet router에서 SNAT │ ▼ Windows는 Linux 분석망 주소에서 온 연결처럼 인식
따라서 Windows VM이 100.64.0.0/10 Tailnet 전체에 대한 별도 복귀 route를 알 필요가 없다. Windows는 Linux 쪽으로 응답하고, Linux가 연결 상태와 NAT 정보를 이용해 다시 MacBook으로 돌려보낸다.
MacBook → Windows 패킷 처리 순서
MacBook에서 10.10.0.20으로 연결하면 다음 순서가 된다.
- MacBook이 Tailnet route에서 10.10.0.0/24의 subnet router를 선택한다.
- 암호화된 Tailscale 패킷이 Linux에 도착한다.
- 복호화된 패킷이 tailscale0 ingress로 커널 네트워크 스택에 들어온다.
- 목적지가 Linux 자신이 아니므로 INPUT이 아니라 FORWARD hook으로 간다.
- nftables가 iif=tailscale0, oif=enx00e04c637a20, 목적지 10.10.0.20, 목적 포트를 검사한다.
- 허용된 패킷만 전용 NIC로 나간다.
- 응답은 connection tracking과 SNAT 상태를 따라 MacBook으로 돌아간다.
Route: Tailscale이 10.10.0.0/24의 경로를 배포한다.
Filter: nftables가 10.10.0.20의 목적 포트별 허용 여부를 결정한다.
INPUT과 FORWARD의 처리 대상
패킷 목적지 | 사용 chain | 예시 |
Linux 서버 자신 | INPUT | Tailnet → Linux SSH |
Linux를 경유한 다른 장비 | FORWARD | MacBook → Windows 10.10.0.20 |
Linux 프로세스가 시작한 연결 | OUTPUT | Linux → 패키지 저장소 |
이 구분 때문에 Linux에서 Sunshine이나 Moonlight를 실행하는 구조로 해석하면 안 된다. Linux 로컬 프로그램의 패킷이라면 OUTPUT을 지나지만, 실제 스트리밍 패킷은 tailscale0에서 들어와 전용 NIC로 나가는 FORWARD 트래픽이다.
설정 검증
ip -br address ip route sysctl net.ipv4.ip_forward tailscale status tailscale ip -4 sudo tailscale debug prefs nmcli connection show enx00e04c637a20 ip route get 10.10.0.20
정상 상태에서는 다음을 확인해야 한다.
- enx00e04c637a20에 10.10.0.10/24가 존재한다.
- 10.10.0.0/24가 connected route로 잡힌다.
- IPv4 forwarding이 1이다.
- Tailscale이 10.10.0.0/24를 advertise한다.
- Linux가 exit node로 설정되어 있지 않다.
- nftables counter가 Tailnet → Windows 허용 패킷을 기록한다.
정리
Linux는 Tailscale에서 10.10.0.0/24를 광고하고, 전용 NIC enx00e04c637a20에 10.10.0.10/24를 설정한다. Windows VM은 Tailscale client 없이 10.10.0.20을 사용한다.
전용 NIC에는 default route를 설정하지 않았다. Windows VM의 패킷은 이 인터페이스로 들어오며 nftables INPUT·FORWARD 규칙에서 처리된다.