🌐

[2/5] Tailscale 서브넷 라우터와 전용 NIC — 10.10.0.0/24 분석망 연결

Description
Tailscale subnet router, IPv4 forwarding, SNAT과 전용 Ethernet을 이용해 MacBook에서 Windows 분석망으로 들어가는 경로를 만든 과정
URL
기간
Aug 10, 2025 → Oct 14, 2025
분야
보안
상태
초안
시리즈
Security Foundations
요약
tailscale0, 전용 NIC 10.10.0.10/24, Windows VM 10.10.0.20의 실제 라우팅과 NetworkManager 설정을 설명한다.
원작성일
Aug 26, 2026
태그
Linux
Pentesting
🌐
Subnet route: 10.10.0.0/24
Router: Linux tailscale0 ↔ enx00e04c637a20
Destination: Windows VM 10.10.0.20

관리망 구성 변경

공유기에서 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으로 연결하면 다음 순서가 된다.
  1. MacBook이 Tailnet route에서 10.10.0.0/24의 subnet router를 선택한다.
  1. 암호화된 Tailscale 패킷이 Linux에 도착한다.
  1. 복호화된 패킷이 tailscale0 ingress로 커널 네트워크 스택에 들어온다.
  1. 목적지가 Linux 자신이 아니므로 INPUT이 아니라 FORWARD hook으로 간다.
  1. nftables가 iif=tailscale0, oif=enx00e04c637a20, 목적지 10.10.0.20, 목적 포트를 검사한다.
  1. 허용된 패킷만 전용 NIC로 나간다.
  1. 응답은 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 규칙에서 처리된다.

Sources

작업 기록

공식 문서


시리즈 이동

전체 시리즈