vtun 虚拟网卡创建过程

本文详细分析了在TCP/IP协议栈中,使用UDP协议进行客户端和服务端通信时,如何通过特定函数实现虚拟网卡的建立,以及在不同阶段的状态变化,包括认证流程和子进程创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只分析udp,

单独运行clinet,处于connect状态,并没有运行到tunnel这个步骤,单独运行client时没出现虚拟网卡;

单独运行server,处于listen状态,也没运行到tunnel这个步骤,所以单独运行server也不会出现虚拟新网卡。

 

当server端开启,处于监听状态,这时client请求连接,认证成功后client和server才会进入tunnel执行打开虚拟网卡,

以及读写发送等后续操作。

 

为深入理解虚拟网卡的建立过程,得深入学习套接字的阻塞和非阻塞问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46


 
 
int tunnel(struct vtun_host *host)
{
    ......
    if ( (host->persist == VTUN_PERSIST_KEEPIF) && (host->loc_fd >= 0) )     //接口是否已经打开
        interface_already_open = 1;                                            
    if( host->dev ){...}                                                      //判断虚拟设备类型
    if(!interface_already_open)                                                 //虚拟网卡没有打开,则打开之
    {
        ...
        switch(host->flags & VTUN_TYPE_MASK)
        {
            ...
            case VTUN_TUN:
                if( (fd[0]=tun_open(dev)) < 0 )                                 //打开虚拟网卡,获取描述符
                {
                    vtun_syslog(LOG_ERR,"Can't allocate tun device %s. %s(%d)", dev, strerror(errno), errno);
                    return -1;
                }
                break;
        }
        host->loc_fd = fd[0];                                                 //虚拟设备文件描述符存在host->loc_fd
    }
    switch( host->flags & VTUN_PROT_MASK )                                     //初始化协议,tcp还是udp
    {
        ......
        case VTUN_UDP:
            if( (opt = udp_session(host)) == -1){.....}                         //进行udpsocket创建等操作
            proto_write = udp_write;
            proto_read = udp_read;
    }
    switch( (pid=fork()) ){...}                                                 //建立子进程
    switch( host->flags & VTUN_TYPE_MASK )                                     //根据虚拟设备类型,选择相应虚拟设备读写方式
    {
        .....
        case VTUN_TUN:
            set_title("%s tun %s", host->host, dev);
            dev_read  = tun_read;
            dev_write = tun_write;
            break;
    }
    opt = linkfd(host);                        
    .......
}

转载于:https://www.cnblogs.com/helloweworld/archive/2012/09/27/2705428.html

### 如何在WSL中安装vtun #### 安装必要的依赖包 为了能够在 WSL 上成功编译并运行 `vtun`,需要先确保已经安装了一些基本的开发工具和库。这些可以通过更新软件包列表并安装构建必需的组件来完成。 ```bash sudo apt update && sudo apt upgrade -y sudo apt install build-essential libssl-dev checkinstall -y ``` 上述命令将会把系统的软件仓库同步至最新状态,并安装一系列用于编译 C/C++ 程序所需的工具以及 OpenSSL 库的头文件[^1]。 #### 下载vtun源码 可以从官方网站或者 GitHub 获取最新的稳定版本 tarball 文件。这里假设使用的是官方发布的压缩包: ```bash cd ~ wget http://vtun.sourceforge.net/download/vtun-latest.tar.gz tar zxvf vtun-latest.tar.gz cd vtun* ``` 这段脚本会在用户主目录下创建一个新的工作空间,下载解压后的 `vtun` 源代码并将终端位置切换至此处[^2]。 #### 编译与安装vtun 进入解压出来的文件夹之后就可以开始配置、编译项目了。如果一切顺利的话,在执行完下面几条指令后就能得到可以正常工作的二进制文件。 ```bash ./configure --prefix=/usr/local make sudo make install ``` 这组命令依次完成了对项目的初始化设置(指定安装路径)、实际编译过程以及最终将生成的目标文件复制到系统默认的位置以便全局调用[^3]。 #### 配置vtun服务端/客户端 编辑 `/etc/vtund.conf` 来定义隧道两端之间的连接参数,比如密码验证方式等细节。对于简单的测试环境来说,默认模板可能就已经足够用了;而对于生产环境中,则建议仔细阅读文档以获得更安全可靠的配置方案。 请注意,由于当前是在 WSL 环境里操作,所以涉及到网络接口的部分可能会有所不同——特别是当打算让这个虚拟隧道跨越宿主机与其他真实设备通讯时,应当特别留意有关于 TUN/TAP 接口的支持情况及其权限管理等问题。 #### 启动vtun服务 最后一步就是启动服务本身了。可以根据实际情况选择作为后台守护进程长期在线还是仅按需临时开启。 ```bash sudo systemctl start vtund.service # 或者手动模式 sudo /usr/local/sbin/vtund -f /path/to/config/file & ``` 以上就是在 WSL 中部署 `vtun` 的大致流程概述。具体实施过程中遇到任何疑问都可以查阅官方手册获取更多帮助和支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值