1 Linux 上的基础网络设备详解和工作原理

http://www.ibm.com/developerworks/cn/linux/1310_xiawc_networkdevice/

2 ip操作

VLANs management

ip link add link eth0 name eth0.2 type vlan id 2
ip link add link eth0 name myvlan type vlan id 2 loose_binding on
ip link delete myvlan type vlan
ip link add foo type vlan help

This replaces the obsolete vconfig(8) program and adds new features.

The loose_binding flag stops the VLAN interface from tracking the line protocol status of the underlying device.

Creation of TUN/TAP interfaces

ip tuntap add dev mytap mode tap user md

This replaces the obsolete tunctl(8) program.

Creation of dummy interfaces

ip link add mydummy type dummy

The only way to create more dummy interfaces after the dummy module has been loaded used to be loading it again with a different name, and they were all named dummyN. Since module-init-tools does not support anymore loading the same module multiple times, iproute fully replaced this method.

Ethernet in GRE tunnels

ip link add mygretun type gretap remote 192.0.2.1
ip link add foo type gretap help

A practical way to remotely bridge two Ethernet networks. The IP MTU is reduced of the expected 20 (IP) + 4 (GRE) + 14 (Ethernet II) bytes.

3 虚拟网络设备–VETH pair

Veth pair 是一对虚拟网卡,从一张veth网卡发出的数据包可以直接到达它的peer veth,两者之间存在着虚拟链路。
Veth 网卡和常规的以太网区别仅在于xmit接口:将数据发送到其peer,触发peer的Rx 过程。
Veth 的原理示意图如下:

实验:

#!/bin/sh
echo "create net namespace net0 and net1"
ip netns add net0
ip netns add net1
echo "list net namespace"
ip netns list
echo "add veth pair v1 and vp1"
ip link add veth_0 type veth peer name veth_0_peer
ip link
echo "set veth_0 in net0"
ip link set veth_0 netns net0
echo "set veth_0_peer in net1"
ip link set veth_0_peer netns net1
ip netns exec net0 ip addr add local 10.0.78.3/24 dev veth_0
ip netns exec net0 ifconfig veth_0 up
ip netns exec net1 ip addr add local 10.0.78.4/24 dev veth_0_peer
ip netns exec net1 ifconfig veth_0_peer up
echo "show ip netns net0"
ip netns exec net0 ip addr
echo "show ip netns net1"
ip netns exec net1 ip addr
ip netns exec net1 ping 10.0.78.3

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;//转发给peerif (dev_forward_skb(rcv, skb) != NET_RX_SUCCESS)goto rx_drop;

4 tun/tap

参考:
1 http://backreference.org/2010/03/26/tuntap-interface-tutorial/
2 http://blog.csdn.net/zhaihaifei/article/details/23168621

5 bridge

参考:
http://blog.csdn.net/zhaihaifei/article/details/38581247

6 vlan

参考: http://blog.csdn.net/zhaihaifei/article/details/38562047

7 network namespace

创建network namespace

# ip netns add blue
# ip netns list

添加网口到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/

Linux上的基础网络设备总结相关推荐

  1. Linux 上的基础网络设备详解

    http://www.ibm.com/developerworks/cn/linux/1310_xiawc_networkdevice/ 抽象网络设备的原理及使用 网络虚拟化是 Cloud 中的一个重 ...

  2. 云计算底层技术--linux上的虚拟网络设备

    Linux 用户想要使用网络功能,不能通过直接操作硬件完成,而需要直接或间接的操作一个 Linux 为我们抽象出来的虚拟网络设备来完成. 一个常见的情况是,系统里装有一个硬件网卡,Linux 会在系统 ...

  3. TCP/IP原理、基础以及在Linux上的实现

    [转载]TCP/IP原理.基础以及在Linux上的实现 导言:本篇作为理论基础,将向我们讲述TCP/IP的基本原理以及重要的协议细节,并在此基础上介绍了TCP/IP在LINUX上的实现. OSI参考模 ...

  4. [转] TCP/IP原理、基础以及在Linux上的实现

    导言:本篇作为理论基础,将向我们讲述TCP/IP的基本原理以及重要的协议细节,并在此基础上介绍了TCP/IP在LINUX上的实现. OSI参考模型及TCP/IP参考模型 OSI模型(open syst ...

  5. Linux 上配置网络设备命令举例

    Linux 上配置网络设备命令举例 PS:本来内容来自http://www.ibm.com/developerworks/cn/linux/1310_xiawc_networkdevice/ 以 Re ...

  6. Linux从头开始学--学习笔记9知识点补充-ubuntu,centos;在linux上创建c程序;linux基础命令,shell命令,vi命令,man帮助手册

    这是我从头开始学习Linux的学习笔记,后续还会更新. 记录自己的技术成长,也希望和大家分享交流,欢迎关注~ 本笔记为coursera网站课程<Linux for Developers>的 ...

  7. 鸟哥的Linux私房菜(基础篇)- 第二十六章、Linux 核心编译与管理

    第二十六章.Linux核心编译与管理 最近升级日期:2009/09/18 我们说的 Linux 其实指的就是核心 (kernel) 而已.这个核心控制你主机的所有硬件并提供系统所有的功能,所以说,他重 ...

  8. 鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一)

    鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一) 第零章 计算机概论 0.1 电脑:辅助人脑的好工具 0.1.1 计算机硬件五大组成部分 0.1.2 一切设计的起点: C ...

  9. Linux网络编程基础知识

    Linux网络编程基础知识 1. 协议的概念 1.1 什么是协议 1.2 典型协议 2 网络应用程序设计模式 2.1 C/S模式 2.2 B/S模式 2.3 优缺点 3 分层模型 3.1 OSI七层模 ...

最新文章

  1. [Web 前端] react-router4-0中文文档
  2. [转]oracle中查询指定行数的记录
  3. 信号量、互斥体和自旋锁
  4. STM32很难?这些工具可以帮大忙!
  5. 关于一致/非一致代码段与TSS 关系的个人看法
  6. 【MM系列】SAP里批量设置采购信息记录删除标记
  7. Fedora 31 及以后版本将不再支持 32 位内核已实锤
  8. 布比Code Review赏金计划正式启动 让区块链回归代码本身
  9. excel如何把顺序倒过来_如何在筛选后的表里复制粘贴数据到同行
  10. QT学习资料博客:《Qt 实战一二三》和《Qt 学习之路 2》等
  11. 如何搭建一个公司网站?
  12. html甘特图制作,AnyGantt实例教程——在Web网页中快速创建甘特图
  13. 厦门防腐木生产厂家厦门木天木屋运营模拟实盘周记20220915
  14. linux双显卡配置_linux双显卡解决方案
  15. 安装gensim库的方法最终解答!
  16. WIN10家庭版安装Hvper-V
  17. ES压测工具(一):esrally工具入门与实践
  18. [激光原理与应用-21]:《激光原理与技术》-7- 激光技术大汇总与总体概述
  19. C#-串口-模拟量采集软件-1
  20. Keras-yolov3计算验证集acc一直为0

热门文章

  1. 三星s10刷android原生,Exynos版三星Galaxy S10+获得TWRP支持:刷机不怕砖
  2. python 多线程 setdaemon_python使用Thread的setDaemon启动后台线程教程
  3. 计算机与科学运用的领域,计算机的应用领域有哪些
  4. linux 解压 .tar ;.gz ; .tar.gz ; .tgz ; .bz2 ; .tar.bz2 ; .bz ; .tar.bz ;.Z ;.tar.Z ;
  5. 电脑浏览器网速变慢变卡
  6. 发布Jar包到Maven中央仓库(为开发开源中间件做准备)
  7. 无效广告流量知多少?
  8. 这批北上广人,已经开始变态了
  9. 一个JS写的许愿墙-测试
  10. 服务器2012分辨率不能修改,国家/地区特定的更新程序符合墨西哥在 Microsoft Dynamics AX 2012 中的杂项分辨率 2012年的第二个修订中的更改...