
虚拟网卡WinTun和Linux开发(一)
声明
《中华人民共和国计算机信息网络国际联网管理暂行规定》第六条
计算机信息网络直接进行国际联网,必须使用邮电部国家公用电信网提供的国际出入口信道。
任何单位和个人不得自行建立或者使用其他信道进行国际联网。
物理网卡和虚拟网卡区别
物理网卡是一个物理硬件设备,硬件设备存活在七层模型中最底层负责真实的数据传输。硬件设备需要拥有对应驱动提供注册和接口到操作系统内核。
虚拟网卡是在Linux 2.4.x内核之后实现的虚拟网络设备,对真实硬件设备驱动接口抽象网络接口。tap/tun虚拟网卡均有软件实现接管,扩展出接口与原有真实硬件设备功能一致。tap/tun接口在七层模型中,tap位于第二层(数据链路层 Data Link Layer)、tun则在第三层(网络层 Network Layer)
真实与虚拟两者工作方式
物理网卡
虚拟网卡
两者在I/O操作中进行的操作区别
真实网卡
- 用户 Read / Write
- 操作系统内核 Read / Write
虚拟网卡
- 用户 Read / Write
- 操作系统内核 Read / Write
- App Read / Write
- 操作系统内核 Read / Write
真实网卡比虚拟网卡少单项(Read)三次IO操作,虚拟网卡需要四次IO操作才能把一个数据发往到真实网络。如果调用操作系统内核作为更近接触,更加减少一次IO操作提升性能。
使用虚拟网卡和真实网卡的头部区别
虚拟局域网想通信到额外一张虚拟网时,依靠 通信协议 通过软件发往就会产生二次封装。第一层IP报文属于通信协议目的地,下层第二层IP报文就是虚拟网卡到来一张虚拟局域网的封装。
DMA机制
直接内存访问(DMA,Direct Memory Access)是一些计算机总线架构提供的功能,它能使数据从附加设备(如磁盘驱动器)直接发送到计算机主板的内存上。
DMA解释:不经过CPU,通过I/O设备直接访问存储器,从而减少CPU资源浪费。
这里可以了解一下,实际上开发不会关心。
包离开网卡速度
网卡在一秒内处理60个包,那么为 60pkt/s,单位pkt/s。pkt/s是传输速率又是每秒的数据包个数。
每个包又要受到队列影响,导致每个包时延快慢。特别是讲包放到网络中可能会受到QOS限制、网络堵塞丢包(被队列丢弃包)
DPU 数据处理器
DPU(数据处理器)是面向以数据为中心的计算的新一代处理器,集完整的数据中心功能于单芯片,和CPU及GPU一起构成新型计算的三大支柱。
对包处理没什么概念,在大数据中DPU可以处理100Gb/s级别数据。
(数据来自 NVIDIA BLUEFIELD-2 DPU 英伟达)
普通人用不到DPU,仅作扩展。
虚拟局域网和SD-WAN技术
SD-WAN,全名是Software-Defined WAN,软件定义广域网。
虚拟局域网可以形成SD-WAN技术,通过相关虚拟局域网关联而成,俗称“组网”。
虚拟SD-WAN技术解决公网IPv4匮乏,大量家庭设备通过一个虚拟局域网形成组网,可以相互传输通信。
家庭设备一条公网或者NAT网络,依赖虚拟局域网对IP报文转发形成虚拟局域网,解决公网浪费问题。
(相关 N2N、Tailscale、ZeroTier、Wireguard)
虚拟网卡虚拟局域网通信
Windows和Linux 虚拟网卡
- Windows
- 非常讽刺的说,在Windows上直接创建虚拟网卡似乎没什么办法。
- 通过安装OpenVPN TUN驱动、Wireguard开发的WinTUN达到虚拟网卡创建
- 处理虚拟网卡非常的LOW
Linux
- 内核自带虚拟网卡管理
虚拟局域网通信两种
- 协议栈 lwip
- 实现一个协议栈,工程量大
- 对IP包头修改
- 实现简单
本章是对IP包头修改,实现lwip协议栈工程量过大,没能力。
IP报文段处理
捕获虚拟网卡的IP报文对源IP地址、目的IP地址进行修改通过TCP/UDP建立起点对点进行通信,将TUN数据发送到对方虚拟网卡中,俗称“代理”。
Linux 虚拟网卡一些相关命令
创建、删除虚拟网卡 TAP
创建TAP
1 | ip tuntap add dev tap0 mod tap |
删除TAP
1 | ip tuntap del dev tap0 mod tap |
创建、删除虚拟网卡TUN
创建TUN
1 | ip tuntap add dev tun0 mode tun |
删除TUN
1 | ip tuntap del dev tun0 mod tun |
启用TUN
1 | ip link set dev tun0 up |
关闭TUN
1 | ip link set dev tun0 down |
路由表修改操作
添加路由
1 | ip route add Routes via NextRoute dev tun0 |
添加路由列举:添加tun0的路由192.168.2.0/24路由跳到192.168.1.1
1 | ip route add 192.168.2.0/24 via 192.168.1.1 dev tun0 |
设置TUN的网关和优先级:顺序越小,优先级越高
1 | ip route add default via 10.1.0.1 dev tun0 metric 1 |
Windows 虚拟网卡一些相关命令
Windows开发虚拟网卡,有一些难度。
设置虚拟网卡优先级
1 | netsh interface ip set interface UULD metric=1 |
添加路由
1 | netsh interface ipv4 add route 1.1.1.1/32 "devtun" NextRoute |
设置掩码和网关:所有流量都到网关上,本质上win网卡不需要设置这些的
1 | route add 0.0.0.0 mask 0.0.0.0 192.168.1.1 |
虚拟网卡中的程序可以在其他局域网发现
wintun开发中,可以发现协议中使用了多播地址239.255.255.250
多播地址使用后,SSDP协议会发现这个服务从而可以发现内部网络情况。
End………………….







