network namespace与veth pair

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介:

network namespace与veth pair

作者

digoal

日期

2016-11-10

标签

namespace , veth pair , OpenvSwitch , OVS , bridge , VLAN , VM , 虚拟化 , 虚拟网桥


背景

在Linux虚拟化技术中,网络层面,通常除了网桥或虚拟交换机技术外。

还有一个重要的就是namespace和veth pair。

net namespace主要是隔离网络设备本身,例如在Linux 中有多个容器,每个容器对应各自的namespace,我们可以把不同的网络设备指派给不同的容器。

veth pair你可以理解为使用网线连接好的两个接口,把两个端口放到两个namespace中,那么这两个namespace就能打通。

如果要把namespace和本地网络打通,也可以创建veth设备,把两端分别放入本地和namespace。

下面是例子

http://www.cnblogs.com/hustcat/p/3928261.html

network namespace

创建network namespace

# ip netns add blue

# ip netns list

blue

添加网口到namespace

先创建veth

# ip link add veth0 type veth peer name veth1

在当前namespace可以看到veth0和veth1

# ip link list

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:b2:cf:72 brd ff:ff:ff:ff:ff:ff

3: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether ae:0d:00:e1:11:38 brd ff:ff:ff:ff:ff:ff

4: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 42:e7:50:d4:bb:c5 brd ff:ff:ff:ff:ff:ff

将veth1加到namespace “blue”

# ip link set veth1 netns blue

此时,当前namepapce只能看到veth0。

pic1

通过如下命令可以查看blue namespace的网口

# ip netns exec blue ip link list

pic2

配置network namespace的网口

通过ip netns exec可以配置namespace的网口

# ip netns exec blue ifconfig veth1 172.17.42.2/16 up

pic3

network namespace的网口与物理网卡的通信

通过bridge来实现。参见veth pair一节。

主要参考

http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/

veth pair

veth pair是用于不同network namespace间进行通信的方式,veth pair将一个network namespace数据发往另一个network namespace的veth。如下:

pic4

# add the namespaces

ip netns add ns1

ip netns add ns2

# create the veth pair

ip link add tap1 type veth peer name tap2

# move the interfaces to the namespaces

ip link set tap1 netns ns1

ip link set tap2 netns ns2

# bring up the links

ip netns exec ns1 ip link set dev tap1 up

ip netns exec ns2 ip link set dev tap2 up

如果多个network namespace需要进行通信,则需要借助bridge:

pic5

# add the namespaces

ip netns add ns1

ip netns add ns2

# create the switch

BRIDGE=br-test

brctl addbr $BRIDGE

brctl stp   $BRIDGE off

ip link set dev $BRIDGE up

#

#### PORT 1

# create a port pair

ip link add tap1 type veth peer name br-tap1

# attach one side to linuxbridge

brctl addif br-test br-tap1

# attach the other side to namespace

ip link set tap1 netns ns1

# set the ports to up

ip netns exec ns1 ip link set dev tap1 up

ip link set dev br-tap1 up

#

#### PORT 2

# create a port pair

ip link add tap2 type veth peer name br-tap2

# attach one side to linuxbridge

brctl addif br-test br-tap2

# attach the other side to namespace

ip link set tap2 netns ns2

# set the ports to up

ip netns exec ns2 ip link set dev tap2 up

ip link set dev br-tap2 up

#

内核实现

veth的实现与loopback interface类似,比较简单:

//drivers/net/veth.c

static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)

{

struct net_device *rcv = NULL;

struct veth_priv *priv, *rcv_priv;



priv = netdev_priv(dev);

rcv = priv->peer;

rcv_priv = netdev_priv(rcv);



stats = this_cpu_ptr(priv->stats);



length = skb->len;

   //转发给peer

if (dev_forward_skb(rcv, skb) != NET_RX_SUCCESS)



goto rx_drop;

NETIF_F_NETNS_LOCAL

NETIF_F_NETNS_LOCAL是网络设备的一个特性,设置该特性的网络设备,不允许在不同network namespace间移动。这类设备也叫做本地设备(local devices)。

Loopback,VXLAN,PPP,bridge都是这类设备。可以通过ethtool -k,或者ethtool –show- features查看该值:

# ethtool -k br0

netns-local: on [fixed]

如果对这类设备network namespace,会报下面的错误:

# ip link set br0 netns ns1

RTNETLINK answers: Invalid argument

参考《Resource management:Linux kernel Namespaces and cgroups》

主要参考

http://www.opencloudblog.com/?p=66

目录
相关文章
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
361 20
|
5月前
|
前端开发 JavaScript Linux
用 Go 写桌面应用?试试 Wails 吧!
Wails 是一个结合 Go 语言与前端技术(如 Vue、React)开发轻量级桌面应用的框架。相比 Electron,它更轻、更快,资源占用更低,支持跨平台打包,适合熟悉 Web 开发又追求原生性能的开发者。
1323 0
|
缓存 NoSQL 程序员
高并发下的生存之道:如何巧妙化解热Key危机?
本文详细探讨了互联网高并发场景下的热Key问题及其解决方案。热Key即因频繁访问导致缓存压力激增,影响系统稳定性。作者小米介绍了多种应对策略,包括Redis集群、主从复制、本地缓存、限流及Key加随机值等技术手段,旨在帮助读者有效分散负载,确保服务稳定。此外,还提供了兜底逻辑如降级处理和预热机制,以应对突发流量。希望本文能帮助大家更好地理解和解决热Key问题。
369 1
高并发下的生存之道:如何巧妙化解热Key危机?
|
开发工具
uniapp, 短剧视频类App实现参考,支持滑动播放,仿抖音 仿陌陌 短视频 无限滑动播放 视频流
阿里云点播服务web播放器sdk,短剧视频类App实现参考。仿抖音 仿陌陌 短视频 无限滑动播放 视频流。无uniapp video 原生组件的层级、遮挡、覆盖问题,适合与不同功能视图组合使用,实现丰富的应用功能。
uniapp, 短剧视频类App实现参考,支持滑动播放,仿抖音 仿陌陌 短视频 无限滑动播放 视频流
|
存储 Kubernetes Cloud Native
云原生|kubernetes|centos下安装部署kubeapps以及简单的使用示例(一)
云原生|kubernetes|centos下安装部署kubeapps以及简单的使用示例
821 0
|
SQL 监控 安全
【阿里云云原生专栏】云原生安全体系构建:阿里云云防火墙与WAF的应用
【5月更文挑战第27天】阿里云云防火墙和WAF是构建云原生安全体系的关键产品,提供网络、主机和Web应用多维度防护。云防火墙采用分布式架构抵御网络攻击,确保应用安全稳定;WAF专注Web应用安全,防止SQL注入、XSS和DDoS等威胁。简单部署配置,结合使用可实现全面安全防护,提升企业云上应用安全性,保障业务安全运行。未来,阿里云将持续强化云原生安全建设。
711 1
|
弹性计算 安全 微服务
【阿里云云原生专栏】容器网络技术前沿:阿里云Terway网络方案详解
【5月更文挑战第26天】阿里云Terway是高性能的容器网络方案,基于ECS的ENI实现,提供低延迟高吞吐的网络服务。它简化网络管理,实现安全隔离,并与阿里云服务无缝集成。Terway由CNI、Node和Controller组成,适用于微服务、混合云和多租户环境,为企业数字化转型中的复杂网络需求提供强大支持。
904 1
|
Kubernetes 应用服务中间件 Docker
【云原生、k8s】基于Helm管理Kubernetes应用
k8s搭建、弹性伸缩、dashboard ui,基于Helm管理Kubernetes应用
|
NoSQL 网络协议 架构师
|
算法
IP子网到底怎么划分【全网最详解】!!!
IP子网到底怎么划分【全网最详解】!!!
1124 1