禁止内核创建fallback设备

2023-12-19 09:32

本文主要是介绍禁止内核创建fallback设备,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用ip link命令查看接口的时候,会发现一些系统自动创建的隧道fallback设备,如:tunl0、gre0、gretap0、sit0、ip6tnl0和ip6gre0等。

/ # ip link
14: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1link/ipip 0.0.0.0 brd 0.0.0.0
15: gre0@NONE: <NOARP> mtu 1476 qdisc noop state DOWN mode DEFAULT group default qlen 1link/gre 0.0.0.0 brd 0.0.0.0
16: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
17: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1link/sit 0.0.0.0 brd 0.0.0.0
18: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN mode DEFAULT group default qlen 1link/tunnel6 :: brd ::
19: ip6gre0@NONE: <NOARP> mtu 1448 qdisc noop state DOWN mode DEFAULT group default qlen 1link/gre6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00

PROC文件/proc/sys/net/core/fb_tunnels_only_for_init_net用于控制是否创建fallback隧道设备。默认值为0,即为所有的命名空间创建fallback设备。如下函数net_has_fallback_tunnels的实现,如果值等于1,只有init_net命名空间中创建fallback设备。如果值为2,所有命名空间都不创建fallback设备。

/*  * sysctl_fb_tunnels_only_for_init_net == 0 : For all netns*                                     == 1 : For initns only*                                     == 2 : For none.*/ 
static inline bool net_has_fallback_tunnels(const struct net *net)
{   return !IS_ENABLED(CONFIG_SYSCTL) ||!sysctl_fb_tunnels_only_for_init_net ||(net == &init_net && sysctl_fb_tunnels_only_for_init_net == 1);
}

如下,在IPv4隧道的命名空间初始化时,如果net_has_fallback_tunnels返回0,fb_tunnel_dev设置为NULL。

int ip_tunnel_init_net(struct net *net, unsigned int ip_tnl_net_id,struct rtnl_link_ops *ops, char *devname)
{struct ip_tunnel_net *itn = net_generic(net, ip_tnl_net_id);...if (!ops || !net_has_fallback_tunnels(net)) {struct ip_tunnel_net *it_init_net;it_init_net = net_generic(&init_net, ip_tnl_net_id);itn->type = it_init_net->type;itn->fb_tunnel_dev = NULL;return 0;}

如果net_has_fallback_tunnels返回0,sit隧道命名空间初始化函数,将不会创建sit0设备。

static int __net_init sit_init_net(struct net *net)
{struct sit_net *sitn = net_generic(net, sit_net_id);struct ip_tunnel *t;...if (!net_has_fallback_tunnels(net))return 0;sitn->fb_tunnel_dev = alloc_netdev(sizeof(struct ip_tunnel), "sit0",NET_NAME_UNKNOWN, ipip6_tunnel_setup);

如果net_has_fallback_tunnels返回0,vti6隧道命名空间初始化函数,将不会创建ip6_vti0设备。

static int __net_init vti6_init_net(struct net *net)
{struct vti6_net *ip6n = net_generic(net, vti6_net_id);struct ip6_tnl *t = NULL;ip6n->tnls[0] = ip6n->tnls_wc;ip6n->tnls[1] = ip6n->tnls_r_l;if (!net_has_fallback_tunnels(net))return 0;err = -ENOMEM;ip6n->fb_tnl_dev = alloc_netdev(sizeof(struct ip6_tnl), "ip6_vti0",NET_NAME_UNKNOWN, vti6_dev_setup);

如果net_has_fallback_tunnels返回0,ip6gre隧道命名空间初始化函数,将不会创建ip6gre0设备。

static int __net_init ip6gre_init_net(struct net *net)
{struct ip6gre_net *ign = net_generic(net, ip6gre_net_id);struct net_device *ndev;if (!net_has_fallback_tunnels(net))return 0;ndev = alloc_netdev(sizeof(struct ip6_tnl), "ip6gre0",NET_NAME_UNKNOWN, ip6gre_tunnel_setup);

如果net_has_fallback_tunnels返回0,ip6隧道命名空间初始化函数,将不会创建ip6tnl0设备。

static int __net_init ip6_tnl_init_net(struct net *net)
{struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);struct ip6_tnl *t = NULL;ip6n->tnls[0] = ip6n->tnls_wc;ip6n->tnls[1] = ip6n->tnls_r_l;if (!net_has_fallback_tunnels(net))return 0;err = -ENOMEM;ip6n->fb_tnl_dev = alloc_netdev(sizeof(struct ip6_tnl), "ip6tnl0",NET_NAME_UNKNOWN, ip6_tnl_dev_setup);

内核版本 5.10

这篇关于禁止内核创建fallback设备的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511700

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Java 如何创建和使用ExecutorService

《Java如何创建和使用ExecutorService》ExecutorService是Java中用来管理和执行多线程任务的一种高级工具,可以有效地管理线程的生命周期和任务的执行过程,特别是在需要处... 目录一、什么是ExecutorService?二、ExecutorService的核心功能三、如何创建

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地