零入门kubernetes网络实战-20->golang编程syscall操作tun设备介绍

news2024/11/16 21:21:21

《零入门kubernetes网络实战》视频专栏地址
https://www.ixigua.com/7193641905282875942

本篇文章视频地址(稍后上传)


本篇文章主要是使用golang自带的syscall包来创建tun类型的虚拟网络设备。

注意:

目前只能使用syscall包来创建tun类型的虚拟设备。

tun虚拟网卡设备的启动,IP配置,路由配置可能需要其他方式实现。

比方说通过netlink包方式来实现。

1、golang代码

package main

import (
	"bytes"
	"fmt"
	"github.com/vishvananda/netlink"
	"net"
	"os"
	"syscall"
	"unsafe"
)

const (
	tunDevice  = "/dev/net/tun"
	ifnameSize = 16
)

type ifreqFlags struct {
	IfrnName  [ifnameSize]byte
	IfruFlags 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 ifreqFlags
	copy(ifr.IfrnName[:len(ifr.IfrnName)-1], []byte(name+"\000"))
	ifr.IfruFlags = syscall.IFF_TUN | syscall.IFF_NO_PI

	err = 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.go

scp:
	scp main root@10.211.55.122:/root

all:
	make build && make scp

在这里插入图片描述

3、远程服务器测试

route -n
å
ip a s | grep 10.211

ip link sh flannel-test

./main 

ip link sh flannel-test

ip a sh flannel-test

route -n

在这里插入图片描述

ip tuntap list

ethtool -i flannel-test

ethtool -i eth0

在这里插入图片描述

4、测试虚拟网卡flannel-test的连通性

在这里插入图片描述

5、/dev/net/tun: not pollable

在这里插入图片描述

read /dev/net/tun: not pollable

其实,曾经还出现过,此代码存在的情况下,也会报上面的错误。

可惜,已经不知道如何恢复异常场景了。


点击 下面 返回 专栏目录

<<零入门kubernetes网络实战>>技术专栏之文章目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/390800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【RockerMQ】003-Windows 安装 RocketMQ

【RockerMQ】003-Windows 安装 RocketMQ 一、准备工作 1、环境要求 64位JDK 1.8;Maven 3.2.x;64位操作系统系统&#xff0c;本文档在Windows上安装 2、下载解压 下载地址 https://archive.apache.org/dist/rocketmq/5.1.0/ 下载目标 解压 到不含中文路径的目录下 环境变…

Python进阶-----面对对象7.0(细谈__new__方法和__init__方法)

目录 前言&#xff1a; __init__方法 __new__方法&#xff08;重点!&#xff09; 1.__new__方法的调用过程 2.重写__new__方法 3.__new__方法不同返回值的情况 3.单例模式 前言&#xff1a; 上一期初步介绍了__new__()方法&#xff0c;但是实际上这个方法还有非常多的内…

操作系统——18.进程互斥的软件实现方法

这篇文章我们来讲一下进程互斥的软件实现方法 目录 1.概述 2.单标志法 3.双标志检查法 4.双标志后检查法 5.Perterson算法 6.小结 1.概述 首先&#xff0c;我们来看一下这节的大体框架 学习提示: 理解各个算法的思想、原理结合上小节学习的“实现互斥的四个逻辑部分”…

通用业务平台设计(五):预警平台建设

前言 在上家公司&#xff0c;随着业务的不断拓展(从支持单个国家单个主体演变成支持多个国家多个主体)&#xff0c;对预警的诉求越来越紧迫&#xff1b;如何保障业务的稳定性那&#xff1f;预警可以帮我们提前甄别风险&#xff0c;从而让我们可以在风险来临前将其消灭&#xff…

深度学习笔记:dropout和调优超参数方法

1 Dropout Dropout是一个常用于深度学习的减轻过拟合的方法。该方法在每一轮训练中随机删除部分隐藏层神经元。被删除的神经元不会进行正向或反向信号传递。在测试阶段所有神经元都会传递信号&#xff0c;但对各个神经元的输出要乘以训练时删除比例。 Dropout实现程序&#xf…

毕业设计 基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测

基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STM32F103C8T6核心系统电路设计2.2 光敏采集电路设计2.3 温度采集电路设计3、部分代码展示3.1 读取DS18B20温度值3.2 定时器初始化1、项目简介 选题指导&#xff0c…

Learning Typescript and React in ts

目录 Basic typescript What is typescript? Configuring the TypeScript Compiler Fundamental build in types TypeScript Simple Types TypeScript Special Types Type: unknown Type: never Type: undefined & null Arrays Tuple Enums functions Ob…

Java集合专题

文章目录框架体系CollectionListArrayListLinkedListVectorSetHashSetLinkedHashSetTreeSetMapHashMapHashtableLinkedHashMapTreeMapPropertiesCollections框架体系 1、集合主要分了两组&#xff08;单列集合&#xff0c;双列集合&#xff09; 2、Collection接口有两个重要的子…

2.SpringSecurity认证

2.1登录校验流程 2.2认证原理 *源码流程: *自定义认证流程: *校验流程: *认证和校验连接: 2.3思路分析 *登录:

SQLI-Labs通关(2)5-7关

跟之前一样首先传参&#xff0c;然后查看注入点以及闭合 用and 11 and 12都没问题&#xff0c;接下来测试单引号 利用 and 12的时候会报错 利用order by来判断列数 得出一共三列 接下来就是联合查询 但是这个并不会回显 那么就利用盲注或者报错注入 在这里我们利用报错来测…

Vue3的生命周期函数

文章目录&#x1f31f; 写在前面&#x1f31f; 生命周期钩子函数&#x1f31f; 组合式API生命周期&#x1f31f; 写在最后&#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技术文章&am…

OPPO 数据恢复:如何从 OPPO 手机恢复已删除的文件?

Oppo 手机以其精美的外观和拍摄的精美照片和视频而闻名。如果您不小心丢失了 OPPO 手机中珍贵的照片、视频等重要文件&#xff0c;并且为如何找回而苦恼&#xff0c;那么您来对地方了。我们其实有很多OPPO数据恢复方案&#xff0c;现在最重要的是尽快尝试这些方法&#xff0c;防…

Git 相关内容

目录 Git 相关流程和常用命令 Git workflow Git hooks Git 相关流程和常用命令 Git远程操作详解 - 阮一峰的网络日志 Git 使用规范流程 - 阮一峰的网络日志 常用 Git 命令清单 - 阮一峰的网络日志 Git workflow 啥玩意&#xff1a; 就是一个工作流程。可以比喻成一个河流…

用逻辑回归制作评分卡

目录 一.评分卡 二.导库&#xff0c;获取数据 三.探索数据与数据预处理 1.去除重复值 2.填补缺失值 3.描述性统计处理异常值 4.为什么不统一量纲&#xff0c;也不标准化数据分布 5.样本不均衡问题 6.分训练集和测试集 三.分箱 1.分多少个箱子才合适 2.分箱要达成什么…

Antlr4: 为parser rule添加label

1. parser rule中的label 1.1 简介 Antrl4语法文件Calculator.g4&#xff0c;stat和expr两个parser rule含有多个rule element&#xff0c;我们这两个parse rule的每个rule element添加了Alternative labels&#xff08;简称label&#xff09; 按照Antlr4的语法规则&#xff…

2022年显卡性能跑分排名表

2022年显卡性能跑分排名表&#xff08;数据来源于快科技&#xff09;这个版本的电脑显卡跑分榜第一的是NVIDIA GeForce RTX 3090 Ti显卡。由于显卡跑分受不同的测试环境、不同的显卡驱动版本以及不同散热设计而有所不同&#xff0c;所以显卡跑分会一直变化。 前二十名的台式电…

Linux(进程概念详解)

进程是如今编程领域非常重要的一个概念&#xff0c;进程是比较抽象的&#xff0c;不容易直接理解。因为进程与操作系统息息相关&#xff0c;因此在介绍进程之前&#xff0c;笔者打算先简易讲一下操作系统的工作流程&#xff0c;理解操作系统是如何管理软件和硬件的&#xff0c;…

垃圾收集器和内存分配(第五章)

《实战Java虚拟机&#xff1a;JVM故障诊断与性能优化 (第2版)》 Java 平台&#xff0c;标准版热点虚拟机垃圾回收调优指南 垃圾收集器虽然看起来数量比较多&#xff0c;但其实总体逻辑都是因为硬件环境的升级而演化出来的产品&#xff0c;不同垃圾收集器的产生总体可以划分为几…

智能优化算法应用:基于蚁狮优化算法的工程优化案例-附代码

智能优化算法应用&#xff1a;基于蚁狮算法的工程优化案例 文章目录智能优化算法应用&#xff1a;基于蚁狮算法的工程优化案例1.蚁狮算法2.压力容器设计问题3.三杆桁架设计问题4.拉压弹簧设计问题5.Matlab代码6.python代码摘要&#xff1a;本文介绍利用蚁狮搜索算法&#xff0c…

191、【动态规划】AcWing —— 900. 整数划分:完全背包解法+加减1解法(C++版本)

题目描述 参考文章&#xff1a;900. 整数划分 解题思路 因为本题中规定了数字从大到小&#xff0c;其实也就是不论是1 2 1 4&#xff0c;还是2 1 1 4&#xff0c;都会被看作是2 1 1 4这一种情况&#xff0c;因此本题是在遍历中不考虑结果顺序。 背包问题中只需考虑…