作者:刘海峰,IT行业资深码农,从事.net/java/go语言开发十余年,长期关注springcloud/k8s/linux网络相关的技术,现为滴普科技容器产品首席架构师。
前言
tun是linux的另一种虚拟网络设备,与前面讲过的veth类似,只是另一端连的不一样,veth设备是一端连着内核协议栈,另一端连着另一个netns的协议栈;而tun设备是一端连着内核协议栈,另一端连接着一个用户程序,任何时候从协议栈发到tun网卡的数据都能从用户程序中读到,而从用户程序写到/dev/net/tun的数据都会被内核协议栈收到。
当我们通过程序打开/dev/net/tun文件时,就会发现我们的主机上多了一张网卡,打开多次会新增多张网卡,命名依次为tun0/tun1/tun2…,我们读写tun网卡的方式与正常读写一个文件一样,下面通过示例来了解一下。
tun设备
首先编写一个c程序,文件名为tun.c,代码如下:
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <linux/if_tun.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
int tun_fd, nre