操作系统里凭空多出来的一块「网卡」,它没有金属和插口,却能像真网卡一样收发数据包 —— 它到底是什么。
物理网卡(NIC)是一块真实硬件:它把电脑里的数据包变成网线/电磁波上的电信号发出去,再把收到的信号还原成数据包交给系统。虚拟网卡则是纯软件造出来的一个「假网卡」—— 操作系统看它和真网卡一模一样(有名字如 tun0、有 IP、能配路由),但它另一端连的不是硬件,而是一段程序。
核心:一个「软件端口」把内核和程序接上
Linux 提供了 TUN/TAP 这种虚拟网卡设备。它的精髓是把网卡的两端拆开:
- 一端朝向内核:在系统里注册成一块标准网卡,所有走它的流量,内核都按正常网络栈处理(配 IP、查路由表)。
- 另一端朝向用户程序:表现为一个文件句柄
/dev/net/tun。程序对它read()就能拿到「本该从这块网卡发出去」的数据包;write()就能把数据包「塞进」这块网卡,让系统以为是网卡收到的。
于是数据包不再流向硬件,而是流向一段你写的代码 —— 你可以对它任意加工:加密、压缩、改地址、换条路走。这就是一切的关键。
TUN vs TAP 的区别
- TUN(网络层):收发的是 IP 数据包(第 3 层)。VPN 几乎都用它 —— 只关心「把 IP 包送到对端」。
- TAP(链路层):收发的是带 MAC 头的以太网帧(第 2 层)。需要模拟整张「虚拟局域网」时用它,比如把多台虚拟机桥接到同一个交换机。
它为什么有用 —— 三个典型场景
- VPN / 科学上网:程序从虚拟网卡读到你的数据包,加密后通过一条普通连接发给远端服务器,服务器解密再转发出去。对你的应用来说,只是「往 tun0 发了个包」,完全无感。
- 虚拟机 / 容器联网:宿主机用 TAP + 虚拟交换机(网桥),让每台虚拟机像插在同一台物理交换机上一样互通、上网。
- 抓包与改包:把流量引到虚拟网卡上,程序就能逐包分析、调试甚至篡改。
一句话总结
虚拟网卡 = 给操作系统的一个「插座」,插头另一端是程序而不是硬件。系统照常收发数据包,数据包却被程序接管,从而能被加密、转发、桥接、改写。VPN、虚拟机网络、容器网络,底座都是它。
延伸:本站所在服务器跑的 sing-box 代理,客户端那一侧正是用虚拟网卡(TUN 模式)接管全局流量后再加密外发的。