零入门kubernetes网络实战-20->golang编程syscall操作tun设备介绍
《零入门kubernetes网络实战》视频专栏地址
https://www.ixigua.com/7193641905282875942
本篇文章视频地址(稍后上传)
本篇文章主要是使用golang自带的syscall包来创建tun类型的虚拟网络设备。
注意:
目前只能使用syscall包来创建tun类型的虚拟设备。
tun虚拟网卡设备的启动,IP配置,路由配置可能需要其他方式实现。
比方说通过netlink包方式来实现。
1、golang代码 |
package mainimport ("bytes""fmt""github.com/vishvananda/netlink""net""os""syscall""unsafe"
)const (tunDevice = "/dev/net/tun"ifnameSize = 16
)type ifreqFlags struct {IfrnName [ifnameSize]byteIfruFlags uint16
}func ioctl(fd int, request, argp uintptr) error {_, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), request, argp)if errno != 0 {return fmt.Errorf("ioctl failed with '%s'", errno)}return nil
}func fromZeroTerm(s []byte) string {return string(bytes.TrimRight(s, "\000"))
}func OpenTun(name string) (*os.File, string, error) {tun, err := os.OpenFile(tunDevice, os.O_RDWR, 0)if err != nil {fmt.Printf("----OpenTun----err:%v\n", err.Error())return nil, "", err}var ifr ifreqFlagscopy(ifr.IfrnName[:len(ifr.IfrnName)-1], []byte(name+"\000"))ifr.IfruFlags = syscall.IFF_TUN | syscall.IFF_NO_PIerr = ioctl(int(tun.Fd()), syscall.TUNSETIFF, uintptr(unsafe.Pointer(&ifr)))if err != nil {fmt.Printf("----OpenTun---ioctl----err:%v\n", err.Error())return nil, "", err}// 1,表示,程序结束后,创建的tun设备依旧在。// 默认为0,程序结束后,创建的tun设备就自动删除了err = ioctl(int(tun.Fd()), syscall.TUNSETPERSIST, 1)if err != nil {fmt.Printf("----OpenTun---ioctl---persist---err:%v\n", err.Error())return nil, "", err}ifname := fromZeroTerm(ifr.IfrnName[:ifnameSize])return tun, ifname, nil
}func configureIface(ifname string, ipn *net.IPNet, mtu int) error {iface, err := netlink.LinkByName(ifname)if err != nil {return fmt.Errorf("failed to lookup interface %v", ifname)}err = netlink.AddrAdd(iface, &netlink.Addr{IPNet: ipn, Label: ""})if err != nil {return fmt.Errorf("failed to add IP address %v to %v: %v", ipn.String(), ifname, err)}err = netlink.LinkSetMTU(iface, mtu)if err != nil {return fmt.Errorf("failed to set MTU for %v: %v", ifname, err)}err = netlink.LinkSetUp(iface)if err != nil {return fmt.Errorf("failed to set interface %v to UP state: %v", ifname, err)}err = netlink.RouteAdd(&netlink.Route{LinkIndex: iface.Attrs().Index,Scope: netlink.SCOPE_UNIVERSE,Dst: ipn,})if err != nil && err != syscall.EEXIST {return fmt.Errorf("failed to add route (%v -> %v): %v", ipn.String(), ifname, err)}return nil
}func main() {tun, fname, err := OpenTun("flannel-test")if err != nil {fmt.Printf("----Create--Tun------err:%v\n", err.Error())return}fmt.Printf("-----create---tun---name:%v\tfname:%v\n", tun.Name(), fname)_, ipn, _ := net.ParseCIDR("10.244.1.0/24")configureIface(fname, ipn, 1500)//time.Sleep(time.Hour)
}
2、本地编译 |
Makefile
build:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.goscp:scp main root@10.211.55.122:/rootall:make build && make scp
3、远程服务器测试 |
route -n
å
ip a s | grep 10.211ip link sh flannel-test./main ip link sh flannel-testip a sh flannel-testroute -n
ip tuntap listethtool -i flannel-testethtool -i eth0
4、测试虚拟网卡flannel-test的连通性 |
5、/dev/net/tun: not pollable |
read /dev/net/tun: not pollable
其实,曾经还出现过,此代码存在的情况下,也会报上面的错误。
可惜,已经不知道如何恢复异常场景了。
点击 下面 返回 专栏目录 |
<<零入门kubernetes网络实战>>技术专栏之文章目录
相关文章:

零入门kubernetes网络实战-20->golang编程syscall操作tun设备介绍
《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章主要是使用golang自带的syscall包来创建tun类型的虚拟网络设备。 注意: 目前只能使用syscall包来创建tun类型的虚拟设备。 tun虚拟网…...

springboot之自动配置
文章目录前言一、配置文件及自动配置原理1、配置文件2、yaml1、注解注入方式给属性赋值2、yaml给实体类赋值3、Properties给属性赋值二、springboot的多环境配置四、自动配置总结前言 1、自动装配原理 2、多种方式给属性赋值 3、多环境配置 4、自动配置 一、配置文件及自动配置…...

wxpython设计GUI:wxFormBuilder工具常用布局结构介绍之布局四—面板拼接式
python借助wxFormBuilder工具搭建基础的GUI界面—wxFormBuilder工具使用介绍:https://blog.csdn.net/Logintern09/article/details/126685315 布局四:面板拼接式,先Panel面板构图,再使用程序代码在Frame框架上拼接面板 下面讲一下…...

全网最全之接口测试【加密解密攻防完整版】实战教程详解
看视频讲的更详细:https://www.bilibili.com/video/BV1zr4y1E7V5/? 一、对称加密 对称加密算法是共享密钥加密算法,在加密解密过程中,使用的密钥只有一个。发送和接收双方事先都知道加密的密钥,均使用这个密钥对数据进行加密和解…...
Python - 目录文件(OS模块) 常用操作
目录os模块的方法os.path()模块的方法使用示例示例一:简单使用示例二:获取文件夹下指定条件的文件os模块的方法 方法说明os.listdir(path)取得指定文件夹下的文件列表os.mkdir(path)创建一个名为path的文件夹os.open(file, flags)打开一个文件ÿ…...
把本地代码初始化到远程git仓库
本地代码,推送到远程的git仓库。第一种方法第一步:建立远程的git仓库第二步:拉取git仓库到本地第三步:将本地代码复制到本地的git拉下来的文件夹中第四步:代码提交即可git add . --> git commit -m 初始化 --> g…...
关于angular中的生命周期函数
生命周期函数,也叫生命周期钩子。 Angular的每个组件(包括根组件和子组件)都存在一个生命周期,从创建、更新、到销毁,Angular提供组件生命周期钩子函数, 组件的生命周期从实例化组件类并渲染组件视图及其…...

【拼图】拼图游戏-微信小程序开发流程详解
还记得小时候玩过的经典拼图游戏吗,上小学时,在路边摊用买个玩具,是一个正方形盒子形状,里面装的是图片分割成的很多块,还差一块,怎么描述好呢,和魔方玩具差不多,有没有听说叫二维的…...
第六章 opengl之光照(颜色)
OpenGL光照颜色创建一个光照场景光照 颜色 颜色由RGB组成,分别是红色,绿色,蓝色。举例定义一个颜色向量: glm::vec3 coral(1.0f, 0.5f, 0.31f);而在现实中,人眼看到的是 物体反射后的颜色,也就是说不能被…...

C语言-基础了解-19-C位域
C位域 一、C位域 如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量,如下: struct {unsigned int widthValidated;unsigned int heightValidated; } status;这种结构需要 8 字节的内存空间,但在实际上,在每个变…...

MapReduce全排序和二次排序
排序是MapReduce框架中最重要的操作之一。MapTask和ReduceTask均会对数据按照key进行排序。该操作属于Hadoop的默认行为。任何应用程序中的数据均会被排序,而不管逻辑上是否需要。默认排序是按照字典顺序排序,且实现该排序的方法是快速排序。对于MapTask…...

【Vue3】封装数字框组件
数量选择组件-基本结构 (1)准备基本结构 <script lang"ts" setup name"Numbox"> // </script> <template><div class"numbox"><div class"label">数量</div><div cla…...
C++-简述strcpy、sprintf 和 memcpy 的区别
回答如下: strcpy 函数:用于将一个字符串(以 NULL 结尾)从源地址复制到目标地址。函数原型为 char* strcpy(char* destination, const char* source)。需要注意的是,该函数会复制整个字符串,包括 NULL 终止…...
用CPU大法忽悠ChatGPT写前端,油猴子工具库+1
文章目录用CPU大法忽悠ChatGPT写前端,油猴子工具库1源起对话1. 作为一名天才js程序员,开发一个油猴子脚本,实现所有浏览器网页的自动下滑功能,每一个步骤都加上中文注释2. 加一个按钮,只有我点击了按钮才会开始自动下滑…...

初识虚拟DOM渲染器
初识虚拟DOM渲染器什么是虚拟DOM什么是渲染器渲染器的实现组件是什么什么是虚拟DOM 首先简单说一下什么是虚拟DOM,虚拟DOM就是一个描述真实DOM的JS对象 例如: 真实的DOM元素 <div onClick"alert(click me)">click me</div>可以…...

工作日志day03
同时构建静态和动态库 //如果用这种方式,只会构建一个动态库,虽然静态库的后缀是.a ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC}) //修改静态库的名字,这样是可以的,但是我们往往希望他…...
【数据挖掘与商务智能分析】第三章 线性回归模型
一元线性回归 一元线性回归的代码实现 1. 绘制散点图 import matplotlib.pyplot as plt X = [[1], [2], [4], [5]] Y...

iOS开发之UIStackView基本运用
UIStackView UIStackView是基于自动布局AutoLayout,创建可以动态适应设备方向、屏幕尺寸和可用空间的任何变化的用户界面。UIStackView管理其ArrangedSubview属性中所有视图的布局。这些视图根据它们在数组中的顺序沿堆栈视图的轴排列。由axis, distribution, align…...
【java】为什么 main 方法是 public static void ?
main 方法是我们学习Java编程语言时知道的第一个方法,你是否曾经想过为什么 main 方法是 public、static、void 的。当然,很多人首先学的是C和C,但是在Java中main方法与前者有些细微的不同,它不会返回任何值,为什么 ma…...

最简单的线性回归模型-标量
首先考虑yyy为标量,www为标量的情况,那么我们的线性函数为ywxbywxbywxb。每批输入的量batch size 为111,每批输入的xxx为一个标量,设为x∗x^*x∗,标签yyy同样为一个标量,设为y∗y^*y∗。因此每批训练的损失…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...

PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...