TUN 모드란: 가상 네트워크 어댑터와 3계층 후킹
TUN은 운영체제가 제공하는 가상 네트워크 장치로, 네트워크 계층(3계층)에서 동작하며 이 장치를 통과하는 것은 모두 표준 IP 패킷입니다. TUN 모드를 켜면 클라이언트는 순서대로 다음 세 가지를 수행합니다.
- 시스템에 가상 네트워크 어댑터를 등록합니다. Windows에서는 Mihomo 또는 utun이라는 이름의 어댑터로 표시되고, macOS와 Linux에서는 새로운 utun 장치가 추가됩니다.
- 라우팅 테이블을 수정해 기본 경로를 이 어댑터로 지정합니다. 기기에서 나가는 모든 IP 패킷이 먼저 커널을 거치게 됩니다.
- 커널(mihomo)이 이 어댑터에서 패킷을 읽어 목적지 도메인과 포트를 분석하고, 설정된 규칙에 따라 직접 연결할지 노드를 거칠지 결정한 뒤 실제 네트워크 어댑터로 내보냅니다.
핵심은 동작 계층입니다. 시스템 프록시는 애플리케이션 계층 프로토콜이라 앱이 직접 시스템 설정을 읽고 따라야만 동작하지만, TUN은 네트워크 계층에서 패킷을 가로채기 때문에 앱은 프록시의 존재 자체를 알 필요가 없습니다. 이것이 TUN이 터미널 명령어, 게임 트래픽, UWP 앱까지 후킹할 수 있는 이유입니다.
대가는 권한입니다. 가상 네트워크 어댑터를 만들고 라우팅 테이블을 수정하려면 관리자 권한(Windows/macOS) 또는 root 권한(Linux)이 필요하므로, 처음 켤 때 시스템이 권한 요청 창을 띄우는 것은 정상적인 동작입니다.
TUN 모드와 시스템 프록시의 차이
| 비교 항목 | 시스템 프록시 | TUN 모드 |
|---|---|---|
| 동작 계층 | 애플리케이션 계층 (HTTP/SOCKS) | 네트워크 계층 (IP 패킷) |
| 동작 전제 | 앱이 시스템 프록시 설정을 직접 읽어야 함 | 앱의 협조 없이 기기 전체를 후킹 |
| 적용 범위 | 브라우저 및 설정을 따르는 앱 | 전체 TCP/UDP 트래픽 |
| UDP 지원 | 기본적으로 미지원 | 지원 (노드에 따라 다름) |
| 권한 요구사항 | 일반 사용자 권한으로 충분 | 관리자/root 권한 필요 |
| 대표적인 사각지대 | 터미널, 게임, UWP 앱 | 다른 VPN류 소프트웨어와의 라우팅 경합 |
정리하면 이렇습니다. 일상적인 웹 브라우징은 시스템 프록시만으로 충분하고 오버헤드도 가장 적습니다. 터미널 트래픽을 프록시로 보내야 하거나 게임을 가속하거나 특정 앱이 시스템 프록시를 전혀 인식하지 않을 때는 TUN을 켜세요. 둘을 동시에 켜도 충돌하지 않습니다. TUN이 트래픽을 가져가면 시스템 프록시 경로는 대부분 사용되지 않는 상태가 됩니다. 다만 문제를 진단할 때는 변수를 줄이기 위해 하나만 켜두는 것을 권장합니다.
설정 전 준비사항: 커널, 권한, 설정 파일
커널은 mihomo여야 합니다
TUN은 커널 단에서 구현됩니다. 원조 Clash는 이미 유지보수가 중단되어 TUN 지원이 불완전하므로, 안정적인 TUN 모드를 사용하려면 클라이언트 커널이 mihomo(Clash Meta)여야 합니다. 본 사이트에서 소개하는 Clash Verge Rev, Clash Nyanpasu, FlClash, Clash Plus는 모두 mihomo 커널을 사용합니다.
설정 파일 측면에서 mihomo의 TUN 섹션은 다음과 같이 작성합니다. GUI 클라이언트에서는 대부분 스위치만 켜면 되고 이 항목들은 클라이언트가 자동으로 채워주지만, 의미는 알아두면 좋습니다.
tun:
enable: true
stack: mixed
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
stack: 프로토콜 스택 구현 방식입니다.system은 시스템 프로토콜 스택을 사용해 호환성이 가장 좋고,gvisor는 사용자 공간 프로토콜 스택으로 UDP나 게임 환경에서 더 안정적입니다.mixed는 TCP는 system, UDP는 gvisor로 처리하며 일상적으로 권장됩니다.auto-route: 라우팅 테이블을 자동으로 수정해 기기 전체 트래픽을 후킹합니다. 끄면 어댑터는 생성되지만 트래픽이 들어오지 않아 켜지 않은 것과 같습니다.auto-detect-interface: 실제 외부 네트워크 어댑터를 자동으로 감지합니다. 여러 네트워크 어댑터가 있는 기기에서는 켜두는 것을 권장합니다.dns-hijack: 53번 포트로 보내는 DNS 쿼리를 가로채 커널 내장 DNS로 처리합니다. DNS 유출로 분기 판단이 틀어지는 것을 막아줍니다.
DNS는 fake-ip 모드와 함께 사용하는 것을 권장합니다. TUN 환경에서 가장 깔끔하게 분기됩니다.
dns:
enable: true
enhanced-mode: fake-ip
플랫폼별 TUN 설정 절차
Windows (Clash Verge Rev 기준)
- 설정 페이지를 열고 먼저 '서비스 모드'를 설치합니다. 상시 실행되는 작은 도우미 프로그램으로, 설치해두면 TUN 모드를 켤 때마다 관리자 권한으로 클라이언트를 실행할 필요가 없습니다.
- 설정 페이지로 돌아와 'TUN 모드' 스위치를 켭니다.
- 시스템에서 방화벽 허용 창이 뜨면 허용을 선택하고, 네트워크 연결 목록에 가상 네트워크 어댑터가 하나 추가된 것을 확인합니다.
- 서비스 모드를 설치하지 않아도 사용할 수 있지만, 클라이언트를 실행할 때마다 마우스 우클릭으로 '관리자 권한으로 실행'해야 합니다.
macOS
- Clash Verge Rev나 ClashX Meta의 설정에서 TUN을 켭니다(일부 클라이언트에서는 '강화 모드'라고 표기됩니다).
- 처음 켤 때 로그인 비밀번호 입력을 요구하는데, 이는 권한 헬퍼 프로그램을 설치하기 위한 것으로 한 번만 입력하면 됩니다.
- 터미널에서
ifconfig를 실행해 새로 생긴 utun 장치가 보이면 정상적으로 켜진 것입니다.
Linux
- GUI 클라이언트에서는 TUN 스위치를 바로 켜면 되고, mihomo를 명령줄로 실행할 경우에는 root 권한이 필요하거나 바이너리에
cap_net_admin권한을 부여해야 합니다. - 데스크톱 환경에 여러 VPN류 도구가 설치되어 있다면 라우팅 테이블은 하나만 우선권을 가질 수 있으니 나머지는 먼저 종료하세요.
Android와 iOS
- Android용 Clash 클라이언트(Clash for Android, FlClash, Clash Plus)는 시스템 VpnService를 기반으로 동작하며 본질적으로 TUN이기 때문에 별도의 스위치가 없습니다. 시작을 누르면 시스템이 '연결 요청' 창을 띄우고, 확인하면 상태 표시줄에 열쇠 아이콘이 나타나며 전체 트래픽 후킹이 시작됩니다.
- 클라이언트를 배터리 최적화 예외 목록에 추가해두면 백그라운드에서 시스템에 의해 종료되어 연결이 끊기는 것을 막을 수 있습니다.
- iOS도 마찬가지입니다. 클라이언트는 시스템 네트워크 확장(Packet Tunnel)을 통해 트래픽을 후킹하며, 처음 실행할 때 VPN 설정 추가를 허용하면 됩니다.
TUN 후킹이 제대로 동작하는지 확인하기
세 단계로 확인합니다.
- 네트워크 어댑터 확인. Windows에서는
ipconfig를 실행해 이름에 Mihomo나 utun이 포함된 어댑터를 찾고, macOS와 Linux에서는ifconfig나ip addr로 utun 장치를 확인합니다. - 시스템 프록시를 읽지 않는 도구로 출구 IP를 확인합니다. 터미널에서 다음을 실행하세요.
curl ip.sb
curl은 기본적으로 시스템 프록시 설정을 읽지 않습니다. TUN을 켜기 전에 실행하면 실제 기기의 IP가 나오고, 켠 후에 실행하면 노드의 출구 IP가 나옵니다. 이는 트래픽이 가상 네트워크 어댑터에 의해 후킹되었다는 뜻입니다. '시스템 프록시가 동작 중'인 것과 'TUN이 동작 중'인 것을 구분하는 가장 확실한 방법입니다.
- 연결 페이지 확인. 클라이언트의 연결(Connections) 패널에서 curl 프로세스가 만든 연결 기록을 볼 수 있고, 규칙 체인 항목에 어떤 규칙에 매칭되었는지 표시됩니다.
curl 결과가 여전히 실제 기기 IP라면 먼저 auto-route가 켜져 있는지, 라우팅 테이블이 다른 VPN 소프트웨어에 의해 덮어써지지 않았는지 확인하세요.
자주 겪는 문제와 해결 방법
다른 VPN류 소프트웨어와의 충돌
기업용 VPN, 게임 가속기, WSL2 가상 스위치는 모두 라우팅 테이블을 수정합니다. 여러 소프트웨어가 동시에 기본 경로를 차지하려 하면 결국 전부 연결이 안 됩니다. 한 번에 하나만 후킹하도록 유지하세요.
웹은 되는데 터미널이 프록시를 타지 않는 경우
대부분 auto-route가 적용되지 않았거나 라우팅 테이블이 다른 소프트웨어에 의해 수정된 경우입니다. 다른 VPN류 도구를 먼저 종료하고 TUN을 다시 켜보세요. 여러 네트워크 어댑터가 있는 기기라면 auto-detect-interface가 켜져 있는지 확인하세요.
DNS 이상: 프록시는 연결되는데 도메인 해석이 잘못되는 경우
dns-hijack이 설정되어 있는지, enhanced-mode가 fake-ip로 되어 있는지 확인하세요. 시스템 DNS가 접근 불가능한 주소로 고정되어 있어도 같은 증상이 나타날 수 있습니다.
게임 UDP가 연결되지 않는 경우
TUN은 통로일 뿐이며 UDP 전달 여부는 노드 자체가 UDP를 지원하는지에 달려 있습니다. 노드가 지원하는데도 여전히 안 된다면 stack을 system에서 gvisor나 mixed로 바꿔서 시도해 보세요.
마지막으로 참고할 점: TUN은 기기 전체 트래픽이 프로토콜 스택을 한 번 더 거치게 하므로 약간의 성능과 배터리 소모가 발생합니다. 전체 후킹이 필요 없는 상황이라면 TUN을 끄고 시스템 프록시만 사용하는 것이 더 절약됩니다.