network namespace与veth pair

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。

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

# ip netns exec blue ip link list

配置network namespace的网口

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

# ip netns exec blue ifconfig veth1 172.17.42.2/16 up

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。如下:

# 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:

# 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

时间: 2025-01-01 13:27:51

network namespace与veth pair的相关文章

理解Docker容器网络之Linux Network Namespace

更多深度文章,请关注:https://yq.aliyun.com/cloud 由于2016年年中调换工作的原因,对容器网络的研究中断过一段时间.随着当前项目对Kubernetes应用的深入,我感觉之前对于容器网络的粗浅理解已经不够了,容器网络成了摆在前面的"一道坎".继续深入理解K8s网络.容器网络已经势在必行.而这篇文章就算是一个重新开始,也是对之前浅表理解的一个补充. 我还是先从Docker容器网络入手,虽然Docker与Kubernetes采用了不同的网络模型:K8s是Conta

【翻译】Linux网络名字空间(Network Namespace)介绍

翻译自 http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/ 在这篇文章中,我将向您介绍Linux网络名字空间的概念.虽然它现在似乎有点深奥的,但相信我,向你介绍网络名字空间是有原因的--如果你像我一样,想更好的理解OpenStack,你迟早会再次遇到网络名字空间. 那么什么是网络民资空间?一般的说法是包括了Linux共享的一组网络接口和路由表条目的装置.您可以修改路由表条目使用策略路由.(这里有我写

use process&#039;s network device namespace on CentOS 6.5+ x64 by openstack modified iproute package

在阅读docker 高级网络时, 发现原来还可以设置进程级别的网络设备namespace. 我这里的环境是CentOS 6.5 x64, 这个版本的iproute包还比较老, 不支持ip netns指令, 所以需要更新一下, 参考本文末尾, 如果你使用的也是CentOS 6.5, 请务必更新iproute后再来做这个实验. 使用ip netns自定义docker container的网络配置例子. 1. 启动2个container, 并且使用--net=none, 即不分配网络设备. # Sta

Docker 基础技术:Linux Namespace(下)

在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主要想向大家介绍Linux的User和Network的Namespace. 好,下面我们就介绍一下还剩下的这两个Namespace. User Namespace User Namespace主要是用了CLONE_NEWUSER的参数.使用了这个参数后,内部看到的UID和GID已经与外部不同了,默认显

玩转Docker Network

本文讲的是玩转Docker Network,[编者的话]关于Docker网络的文章有很多,然而,本文从基础出发,不仅搭建Docker网络,还辅助了各种实验.文章将实验步骤记录的很详细,通过阅读本文有助于增强对Docker网络的了解,读者甚至可以跟着步骤进行实验. 环境 3个节点的虚拟机,每个节点都要安装Docker. VM1/Host1: 10.32.171.202 centos7 VM2/Host2: 10.32.171.203 centos7 Vm3/Host3: 10.32.171.204

Docker应用容器基础技术:Linux Namespace 学习教程

我们开始.先从Linux Namespace开始.  简介 Linux Namespace是Linux提供的一种内核级别环境隔离的方法.不知道你是否还记得很早以前的Unix有一个叫chroot的系统调用通过修改根目录把用户jail到一个特定目录下chroot提供了一种简单的隔离模式chroot内部的文件系统无法访问外部的内容.Linux Namespace在此基础上提供了对UTS.IPC.mount.PID.network.User等的隔离机制. 举个例子我们都知道Linux下的超级父亲进程的P

add network card|interface to docker container online

本文将讲解一下如何对一个正在运行的container添加网卡.  其实就是用的netns, 使用--net=none或--net=bridge都无所谓. 启动一个容器, 默认使用bridge. 所以会自动创建一个网卡. [root@localhost ~]# docker run --name=test -t -i --rm centos:centos6 /bin/bash [root@878894e4216d /]# ip link 1: lo: <LOOPBACK,UP,LOWER_UP>

深入解析Docker背后的namespace技术

相信你在很多地方都看到过"Docker基于mamespace.cgroups.chroot等技术来构建容器"的说法,但你有没有想过为何容器的构建需要这些技术? 为什么不是一个简单的系统调用就可以搞定?原因在于Linux内核中并不存在"linux container"这个概念,容器是一个用户态的概念. Docker软件工程师Michael Crosby将撰写一些列博客,深入到Docker运行的背后,探索在 docker run这段代码的背后发生了什么,这是系列博客的第

在 ML2 中配置 OVS flat network - 每天5分钟玩转 OpenStack(133)

前面讨论了 OVS local network,今天开始学习 flat network. flat network 是不带 tag 的网络,宿主机的物理网卡通过网桥与 flat network 连接,每个 flat network 都会占用一个物理网卡. 在 ML2 配置中 enable flat network 在控制节点 /etc/neutron/plugins/ml2/ml2_conf.ini 中设置 flat network 相关参数: tenant_network_types = fl