精华内容
下载资源
问答
  • Linux 网络命名空间

    千次阅读 2017-04-09 09:59:58
    网络命名空间 虚拟网络创建 iproute2 创建新的网络命名空间 显示所有的虚拟网络命名空间 进入虚拟网络环境 设置虚拟网络环境net0的veth0设备处于激活状态 为虚拟网络环境net0的veth0设备增加IP地址 连接两个网络环境...

    虚拟网络基础

    和磁盘设备类似,Linux 用户想要使用网络功能,不能通过直接操作硬件完成,而需要直接或间接的操作一个 Linux 为我们抽象出来的设备,既通用的Linux网络设备来完成。一个常见的情况是,系统里装有一个硬件网卡,Linux 会在系统里为其生成一个网络设备实例,如eth0,用户需要对eth0发出命令以配置或使用它了。更多的硬件会带来更多的设备实例,虚拟的硬件也会带来更多的设备实例。
    随着网络技术,虚拟化技术的发展,更多的高级网络设备被加入了到了Linux中,使得情况变得更加复杂。
    在本节中,将一一分析在虚拟化技术中经常使用的几种 Linux 网络设备抽象类型:Bridge、802.1.q VLAN device、VETH、TAP,详细解释如何用它们配合 Linux 中的 Route table、IP table简单的创建出本地虚拟网络。
    Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等。

    bridge

    Bridge(桥)是 Linux 上用来做 TCP/IP 二层协议交换的设备,与现实世界中的交换机功能相似。Bridge 设备实例可以和 Linux 上其他网络设备实例连接,既attach一个从设备,类似于在现实世界中的交换机和一个用户终端之间连接一根网线。当有数据到达时,Bridge会根据报文中的MAC信息进行广播、转发、丢弃处理。
    图 1.Bridge 设备工作过程
    Bridge 设备工作过程
    如图所示,Bridge 的功能主要在内核里实现。当一个从设备被 attach 到 Bridge 上时,相当于现实世界里交换机的端口被插入了一根连有终端的网线。这时在内核程序里,netdev_rx_handler_register()被调用,注册一个用于接受数据的回调函数。以后每当这个从设备收到数据时都会调用这个函数可以把数据转发到 Bridge 上。当 Bridge 接收到此数据时,br_handle_frame()被调用,进行一个和现实世界中的交换机类似的处理过程:
    1. 判断包的类别(广播/单点)
    1. 查找内部 MAC 端口映射表
    1. 定位目标端口号
    1. 将数据转发到目标端口或丢弃
    1. 自动更新内部 MAC 端口映射表以自我学习

    Bridge和现实世界中的二层交换机有一个==区别==,图中左侧画出了这种情况:数据被直接发到Bridge上,而不是从一个端口接受。这种情况可以看做Bridge自己有一个MAC可以主动发送报文,或者说Bridge自带了一个隐藏端口和寄主 Linux 系统自动连接,Linux 上的程序可以直接从这个端口向 Bridge 上的其他端口发数据。所以当一个 Bridge 拥有一个网络设备时,如 bridge0 加入了 eth0 时,实际上 bridge0 拥有两个有效 MAC 地址,一个是 bridge0 的,一个是 eth0 的,他们之间可以通讯。
    由此带来一个有意思的事情是,Bridge 可以设置 IP 地址。通常来说 IP 地址是三层协议的内容,不应该出现在二层设备 Bridge 上。但是 Linux 里 Bridge 是通用网络设备抽象的一种,只要是网络设备就能够设定 IP 地址。当一个 bridge0 拥有 IP 后,Linux 便可以通过路由表或者IP表规则在三层定位bridge0,此时相当于Linux拥有了另外一个隐藏的虚拟网卡和 Bridge 的隐藏端口相连,这个网卡就是名为bridge0的通用网络设备,IP可以看成是这个网卡的。当有符合此 IP 的数据到达 bridge0 时,内核协议栈认为收到了一包目标为本机的数据,此时应用程序可以通过 Socket接收到它。
    一个更好的对比例子是==现实世界中的带路由的交换机设备==,它也拥有一个隐藏的 MAC 地址,供设备中的三层协议处理程序和管理程序使用。设备里的三层协议处理程序,对应名为 bridge0 的通用网络设备的三层协议处理程序,即寄主Linux系统内核协议栈程序。设备里的管理程序,对应bridge0寄主Linux系统里的应用程序。
    Bridge 的实现当前有一个==限制==:当一个设备被 attach 到 Bridge 上时,那个设备的 IP 会变的无效,Linux 不再使用那个 IP 在三层接受数据。举例如下:如果 eth0 本来的 IP 是 192.168.1.2,此时如果收到一个目标地址是 192.168.1.2 的数据,Linux 的应用程序能通过 Socket 操作接受到它。而当 eth0 被 attach 到一个 bridge0 时,尽管 eth0 的 IP 还在,但应用程序是无法接受到上述数据的。此时应该把 IP 192.168.1.2 赋予 bridge0。
    另外需要注意的是==数据流的方向==。对于一个被attach到Bridge上的设备来说,只有它收到数据时,此包数据才会被转发到Bridge上,进而完成查表广播等后续操作。当请求是发送类型时,数据是不会被转发到 Bridge 上的,它会寻找下一个发送出口。用户在配置网络时经常忽略这一点从而造成网络故障。

    TAP 设备与 VETH 设备

    TUN/TAP 设备是一种让用户态程序向内核协议栈注入数据的设备,一个工作在三层,一个工作在二层,使用较多的是 TAP 设备。VETH设备出现较早,它的作用是反转通讯数据的方向,需要发送的数据会被转换成需要收到的数据重新送入内核网络层进行处理,从而间接的完成数据的注入。
    图 2 .TAP 设备和 VETH 设备工作过程

    当一个TAP设备被创建时,在Linux设备文件目录下将会生成一个对应char设备,用户程序可以像打开普通文件一样打开这个文件进行读写。当执行 write()操作时,数据进入 TAP 设备,此时对于 Linux 网络层来说,相当于 TAP 设备收到了一包数据,请求内核接受它,如同普通的物理网卡从外界收到一包数据一样,不同的是其实数据来自Linux上的一个用户程序。Linux收到此数据后将根据网络配置进行后续处理,从而完成了用户程序向Linux内核网络层注入数据的功能。当用户程序执行read()请求时,相当于向内核查询 TAP 设备上是否有需要被发送出去的数据,有的话取出到用户程序里,完成 TAP 设备的发送数据功能。
    针对 TAP 设备的一个形象的比喻是:使用 TAP 设备的应用程序相当于另外一台计算机,TAP 设备是本机的一个网卡,他们之间相互连接。应用程序通过 read()/write()操作,和本机网络核心进行通讯。

    VETH 设备总是成对出现,送到一端请求发送的数据总是从另一端以请求接受的形式出现。该设备不能被用户程序直接操作,但使用起来比较简单。创建并配置正确后,向其一端输入数据,VETH 会改变数据的方向并将其送入内核网络核心,完成数据的注入。在另一端能读到此数据。

    netns

    netns是在linux中提供网络虚拟化的一个项目,使用netns网络空间虚拟化可以在本地虚拟化出多个网络环境,目前netns在lxc容器中被用来为容器提供网络。
    使用netns创建的网络空间独立于当前系统的网络空间,其中的网络设备以及iptables规则等都是独立的,就好像进入了另外一个网络一样。不同网络命名空间中的设备是不同的,之间不能互相直接通讯。

    网络命名空间

    在 Linux 中,网络名字空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。

    虚拟网络创建

    iproute2

    iproute2 is usually shipped in a package called iproute or iproute2 and consists of several tools, of which the most important are ip and tc. ip controls IPv4 and IPv6 configuration and tc stands for traffic control. Both tools print detailed usage messages and are accompanied by a set of manpages.

    创建新的网络命名空间

    使用命令

    $ ip netns add net0

    可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables,ebtables,等等。总之,与网络有关的组件都是独立的。

    ip命令需要root权限的,但是由于本文大量使用ip命令,于是笔者给ip命令添加了capability,使普通用户也能使用ip命令

    显示所有的虚拟网络命名空间

    ip netns list

    或者

    ls /var/run/netns/

    使用命令

    $ ip netns list
    net0

    可以看到我们刚才创建的网络环境

    通常情况下,一般我们用 ip netns add 添加新的 netns,然后我们可以用 ip netns list 查看所有的 netns。但有的时候进程的 netns 却并没有显式导出,ip netns list 无法列出它,比如 docker 的 container的网络空间。怎么办呢?答案是做个符号链接就可以了。

    ln -sf /proc/<pid>/ns/net /var/run/netns/$ns

    简要说明一下这个命令:每个进程的网络命名空间都是通过 proc 文件系统导出来了的,位于 /proc//ns/net (这个文件不可读,它只是相当于一个访问点);而 ip netns list 命令是从 /var/run/netns 这个路径读取netns列表的,因此直接将进程的命名空间链接到 /var/run/netns 目录下就可以了。

    进入虚拟网络环境

    使用命令

    $ ip netns exec net0 `command`

    我们可以在 net0 虚拟环境中运行任何命令

    $ ip netns exec net0 bash
    $ ip ad
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    这样我们可以在新的网络环境中打开一个shell,可以看到,新的网络环境里面只有一个lo设备,并且这个lo设备与外面的lo设备是不同的,之间不能互相通讯。

    设置虚拟网络环境net0的veth0设备处于激活状态

    ip netns exec net0 ip link set veth0 up

    为虚拟网络环境net0的veth0设备增加IP地址

    ip netns exec net0 ip address add 10.0.1.1/24 dev veth0

    连接两个网络环境

    新的网络环境里面没有任何网络设备,并且也无法和外部通讯,就是一个孤岛,通过下面介绍的这个方法可以把两个网络环境连起来,简单的说,就是在两个网络环境之间拉一根网线

    $ ip netns add net1

    先创建另一个网络环境net1,我们的目标是把net0与net1连起来

    $ ip link add type veth
    $ ip ad # address, show protocol (IP or IPv6) address on a device.
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    81: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
        link/ether 12:39:09:81:3a:dd brd ff:ff:ff:ff:ff:ff
    82: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
        link/ether 32:4f:fd:cc:79:1b brd ff:ff:ff:ff:ff:ff

    这里创建连一对veth虚拟网卡,类似pipe,发给veth0的数据包veth1那边会收到,发给veth1的数据包veth0会收到。就相当于给机器安装了两个网卡,并且之间用网线连接起来了

    $ ip link set veth0 netns net0
    $ ip link set veth1 netns net1

    这两条命令的意思就是把veth0移动到net0环境里面,把veth1移动到net1环境里面,我们看看结果

    $ ip ad
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    $ ip netns exec net0 ip ad
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    81: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
        link/ether 12:39:09:81:3a:dd brd ff:ff:ff:ff:ff:ff
    $ ip netns exec net1 ip ad
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    82: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
        link/ether 32:4f:fd:cc:79:1b brd ff:ff:ff:ff:ff:ff

    veth0 veth1已经在我们的环境里面消失了,并且分别出现在net0与net1里面。下面我们简单测试一下net0与net1的联通性

    $ ip netns exec net0 ip link set veth0 up
    $ ip netns exec net0 ip address add 10.0.1.1/24 dev veth0
    $ ip netns exec net1 ip link set veth1 up
    $ ip netns exec net1 ip address add 10.0.1.2/24 dev veth1

    分别配置好两个设备,然后用ping测试一下联通性:

    $ ip netns exec net0 ping -c 3 10.0.1.2
    PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
    64 bytes from 10.0.1.2: icmp_req=1 ttl=64 time=0.101 ms
    64 bytes from 10.0.1.2: icmp_req=2 ttl=64 time=0.057 ms
    64 bytes from 10.0.1.2: icmp_req=3 ttl=64 time=0.048 ms
    
    --- 10.0.1.2 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 1999ms
    rtt min/avg/max/mdev = 0.048/0.068/0.101/0.025 ms

    实践:一个稍微复杂的网络环境

    graph TD
    A[bridge] -->|10.0.1.1| B[net0]
    A[bridge] -->|10.0.1.2| C[net1]

    创建虚拟网络环境并且连接网线

    ip netns add net0
    ip netns add net1
    ip netns add bridge
    
    ip link add type veth
    ip link set dev veth0 name net0-bridge netns net0
    ip link set dev veth1 name bridge-net0 netns bridge
    
    ip link add type veth
    ip link set dev veth0 name net1-bridge netns net1
    ip link set dev veth1 name bridge-net1 netns bridge

    在bridge中创建并且设置br设备

    ip netns exec bridge brctl addbr br
    ip netns exec bridge ip link set dev br up
    ip netns exec bridge ip link set dev bridge-net0 up
    ip netns exec bridge ip link set dev bridge-net1 up
    ip netns exec bridge brctl addif br bridge-net0
    ip netns exec bridge brctl addif br bridge-net1

    然后配置两个虚拟环境的网卡

    ip netns exec net0 ip link set dev net0-bridge up
    ip netns exec net0 ip address add 10.0.1.1/24 dev net0-bridge
    
    ip netns exec net1 ip link set dev net1-bridge up
    ip netns exec net1 ip address add 10.0.1.2/24 dev net1-bridge

    测试

    $ ip netns exec net0 ping -c 3 10.0.1.2
    PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
    64 bytes from 10.0.1.2: icmp_req=1 ttl=64 time=0.121 ms
    64 bytes from 10.0.1.2: icmp_req=2 ttl=64 time=0.072 ms
    64 bytes from 10.0.1.2: icmp_req=3 ttl=64 time=0.069 ms
    
    --- 10.0.1.2 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 1999ms
    rtt min/avg/max/mdev = 0.069/0.087/0.121/0.025 ms

    配置lldpd检查线路链接情况

    随着虚拟网络环境增加,环境中网卡数量也在不断增加,经常会忘记环境中哪些网卡连接到哪里,通过 Link Layer Discovery Protocol,我们可以清楚看到每个网卡连接到了哪些环境中的哪个网卡。

    github 上有一个 lldp 在 linux 下的开源实现 implementation of IEEE 802.1ab (LLDP),通过在每个环境中起一个 lldp daemon,我们就可以实时查看每个网卡的连接情况。

    Bridge 上 lldp 的数据

    $ lldpcli show neighbors
    
    LLDP neighbors:
    
    Interface:    bridge-net0, via: LLDP, RID: 2, Time: 0 day, 00:06:53
      Chassis:
        ChassisID:    mac 82:be:2a:ec:70:69
        SysName:      localhost
        SysDescr:     net0
        Capability:   Bridge, off
        Capability:   Router, off
        Capability:   Wlan, off
      Port:
        PortID:       mac 82:be:2a:ec:70:69
        PortDescr:    net0-bridge
    
    Interface:    bridge-net1, via: LLDP, RID: 1, Time: 0 day, 00:06:53
      Chassis:
        ChassisID:    mac b2:34:28:b1:be:49
        SysName:      localhost
        SysDescr:     net1
        Capability:   Bridge, off
        Capability:   Router, off
        Capability:   Wlan, off
      Port:
        PortID:       mac b2:34:28:b1:be:49
        PortDescr:    net1-bridge

    参考文献

    1. Linux容器
    2. 网络虚拟化技术(一): Linux网络虚拟化
    3. Linux 上的基础网络设备详解-抽象网络设备的原理及使用
    4. Linux命名空间学习教程(一) UTS
    5. Linux命名空间学习教程(二) IPC
    6. Linux命名空间学习教程(三) PID
    7. Linux命名空间学习教程(四)NS(FS)
    8. Linux命名空间学习教程(五)NET
    9. iproute2
    10. Introduction to Linux namespaces – Part 5: NET
    展开全文
  • linux网络命名空间.docx

    2020-01-03 15:32:28
    linux网络命名空间.doc
  • linux 网络命名空间.doc
  • linux网络命名空间及使用.pdf
  • Linux网络命名空间

    千次阅读 2013-03-11 22:07:20
    网络命名空间,可以具有网络接口和操作彼此独立的 不同 路由表和单独的实例。 创建网络空间: ip netns add 查看网络空间列表: ip netns list 接口分配给命名空间 配置...

    网络的命名空间,可以具有网络接口和操作彼此独立的不同路由表和单独的实例。

    创建网络空间:

    ip netns add <new namespace name>
    查看网络空间列表:

    ip netns list

    接口分配给命名空间

    配置网络连接的接口使用虚拟以太网VETH接口通过“默认”或“全局”命名空间,其中物理接口存在的网络空间连接到外面的世界

    创建VETH对:

    ip link add veth0 type veth peer name veth1

    查看VETH对列表:

    ip link list [名称]
    移动VETH接口到某命名空间中

    ip link set veth1 netns <namespace name>
    在命名空间中显示

    ip netns exec <namespace name> ip link list
    配置命名空间的veth1接口

    ip netns exec <namespace name> ifconfig veth1 10.1.1.1/24 up
    ip route list 在每个命名空间将显示不同的路由表项,包括不同的默认网关。

    ip netns exec<namespace name>ip addr list将显示在10.1.1.0/24-related接口和地址

    ip addr list全局命名空间


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

    展开全文
  • Docker基础-16-网络-Linux网络命名空间.pdf
  • linux 网络命名空间 Network namespaces

    万次阅读 2017-04-19 16:20:01
    在本文中,我将讨论网络命名空间并展示一个实际的例子。  命名空间和cgroups是软件集装箱化(Docker)的大部分新趋势的主要内核技术之一。 简单来说,cgroups是一种计量和限制机制,它们控制您可以使用多少系统...

          Linux命名空间是一个相对较新的内核功能,对于实现容器至关重要。 命名空间将全局系统资源包装到一个抽象中,该抽象只会与命名空间中的进程绑定,从而提供资源隔离。 在本文中,我将讨论网络命名空间并展示一个实际的例子。

          命名空间和cgroups是软件集装箱化(Docker)的大部分新趋势的主要内核技术之一。 简单来说,cgroups是一种计量和限制机制,它们控制您可以使用多少系统资源(CPU,内存)。 另一方面,命名空间限制了您可以看到的内容。 由于命名空间进程有自己的系统资源视图。

           Linux内核提供了6种类型的命名空间:pid,net,mnt,uts,ipc和user。 例如,pid命名空间中的进程只能看到同一命名空间中的进程。 感谢mnt命名空间,可以将进程附加到自己的文件系统(如chroot)。 在本文中,我仅关注网络命名空间。

           如果您已经掌握了命名空间的概念,您可能在这一点上可以直观地了解网络命名空间可能提供的内容。 网络命名空间为命名空间中的所有进程提供了全新的网络堆栈。 这包括网络接口,路由表和iptables规则。


    网络命名空间

       从系统的角度来看,当通过clone()syscall创建新进程时,传递标志CLONE_NEWNET将在新进程中创建一个全新的网络命名空间。 从用户的角度来看,我们只需使用工具ip(package is iproute2)来创建一个新的持久网络命名空间:

    $ ip netns add ns1

            该命令将创建一个名为ns1的新网络命名空间。 当创建命名空间时,ip命令在/ var / run / netns下为其添加绑定挂载点。 这允许命名空间持续存在,即使没有进程附加它。 列出系统中可用的命名空间:

    $ ls /var/run/netns
    ns1

    或者 使用 ip:

    $ ip netns
    ns1
       如前所述,网络命名空间包含自己的网络资源:接口,路由表等。我们为ns1添加一个环回接口:
    $ ip netns exec ns1 ip link set dev lo up
    $ ip netns exec ns1 ping 127.0.0.1
    PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
    64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.115 ms
    • 第1行在网络名称空间ns1中显示回环接口
    • 第2行在网络命名空间内执行ping 127.0.0.1命令。
    启动环回接口的另一种语法可能是:
    $ ip netns exec ns1 ifconfig lo up
            然而,我倾向于使用ip命令,因为它已成为Linux中首选的网络工具,废弃旧的但更熟悉的命令ifconfig,route等。请注意,ip需要root权限,因此以root或prepend sudo运行。
            网络命名空间也有自己的路由表:

    $ ip netns exec ns1 ip route show

    在这一点上,什么也没有返回,因为我们还没有添加任何路由表规则。 一般来说,在网络命名空间中运行的任何命令都由前序开始:

    $ ip netns exec <network-namespace>
    一个实际的例子
    网络命名空间的后果之一是一次只能将一个接口分配给命名空间。 如果根命名空间拥有eth0,它提供对外部世界的访问,则只有根命名空间内的程序可以访问Internet。 解决方案是通过veth对将命名空间与根命名空间进行通信。 vuit对的工作方式就像一条连接两边的跳线。 它由两个虚拟接口组成,其中一个分配给根网络命名空间,另一个生命在网络命名空间中。 相应地设置其IP地址和路由规则,以及在主机端启用NAT将足以提供Internet访问网络命名空间。
          此外,我觉得我现在需要澄清。 我已经阅读了关于物理设备接口只能生活在根命名空间中的网络命名空间的几篇文章。 至少这不是我现在的内核(Linux 3.13)。 我可以将eth0分配给除root之外的命名空间,并且在正确设置时可以从命名空间访问Internet。 然而,一次只能在单个命名空间中生活的界面的限制仍然适用,这是强大到足以通过veth对连接网络命名空间的原因。
           首先,我们来创建一个名为ns1的新的网络命名空间。
    # Remove namespace if it exists.
    ip netns del ns1 &>/dev/null
    
    # Create namespace
    ip netns add ns1
    接下来,创建一个veth对。 接口v-eth1将保留在根网络名称空间内,而其对等体v-peer1将被移动到ns1命名空间。
        
    # Create veth link.
    ip link add v-eth1 type veth peer name v-peer1
    
    # Add peer-1 to NS.
    ip link set v-peer1 netns ns1
    接下来,为两个接口设置IPv4地址,并将其启动。
    # Setup IP address of v-eth1.
    ip addr add 10.200.1.1/24 dev v-eth1
    ip link set v-eth1 up
    
    # Setup IP address of v-peer1.
    ip netns exec ns1 ip addr add 10.200.1.2/24 dev v-peer1
    ip netns exec ns1 ip link set v-peer1 up
    ip netns exec ns1 ip link set lo up
    另外我提出了ns1内的loopback接口。
       现在有必要让离开ns1的所有外部流量通过v-eth1。
    ip netns exec ns1 ip route add default via 10.200.1.1
    但是这还不够。 与任何主机共享其互联网连接,必须在主机中启用IPv4转发,并启用伪装。
    # Share internet access between host and NS.
    
    # Enable IP-forwarding.
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
    # Flush forward rules, policy DROP by default.
    iptables -P FORWARD DROP
    iptables -F FORWARD
    
    # Flush nat rules.
    iptables -t nat -F
    
    # Enable masquerading of 10.200.1.0.
    iptables -t nat -A POSTROUTING -s 10.200.1.0/255.255.255.0 -o eth0 -j MASQUERADE
    
    # Allow forwarding between eth0 and v-eth1.
    iptables -A FORWARD -i eth0 -o v-eth1 -j ACCEPT
    iptables -A FORWARD -o eth0 -i v-eth1 -j ACCEPT
    如果一切正常,可以从ns1 ping一个外部主机。

    $ ip netns exec ns1 ping 8.8.8.8
    PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=50 time=48.5 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=50 time=50.8 ms
    这是ns1中的路由表在安装后如何看起来:
    $ ip netns exec ns1 ip route sh
    default via 10.200.1.1 dev v-peer1 
    10.200.1.0/24 dev v-peer1  proto kernel  scope link  src 10.200.1.2 

    为命名空间运行的每个命令准备ip netns exec序言可能有点乏味。 一旦命名空间中最基本的功能被设置,一个更有趣的可能性是运行一个bash shell并将其附加到网络命名空间中:
    $ ip netns exec ns1 /bin/bash --rcfile <(echo "PS1=\"namespace ns1> \"")
    namespace ns1> ping www.google.com
    PING www.google.com (178.60.128.38) 56(84) bytes of data.
    64 bytes from cache.google.com (178.60.128.38): icmp_seq=1 ttl=58 time=17.6 ms
    键入exit以结束bash进程并离开网络命名空间。
    结论
    网络命名空间以及Linux内核提供的其他容器化技术是资源隔离的轻量级机制。 连接到网络命名空间的进程可以看到自己的网络堆栈,而不会干扰系统的其他网络堆栈。
    网络名称空间也很容易使用。 可以使用VM设置类似的网络级别隔离。 然而,这似乎是一个更加昂贵的解决方案,在系统资源和时间投入方面来建立这样的环境。 如果您只需要网络级别的进程隔离,则网络命名空间是必须考虑的。
             完整的脚本: 待续





    展开全文
  • 前面学习的Docker一些知识真的是基础中的基础,镜像...接下来几篇文章,我们重点来学习Docker里面的网络模块。学习Docker,先学习镜像操作,然后学习容器操作,剩下的网络和存储的部分,学习是有一点困难的。学习网...

           前面学习的Docker一些知识真的是基础中的基础,镜像的制作过程,简单的Dockerfile你会写一些,镜像的操作和容器操作那几个常见的命令也基本上都介绍过了。如果你知识想简单了解并玩一玩Docker,到这里,差不多学习完了。接下来几篇文章,我们重点来学习Docker里面的网络模块。学习Docker,先学习镜像操作,然后学习容器操作,剩下的网络和存储的部分,学习是有一点困难的。学习网络和存储,需要一些网络和文件系统的专业的知识,其实更加需要linux的知识。我们先学习Docker的网络部分,慢慢学习,我们毕竟只需要学习基础就好。

    本篇,先介绍Docker网络有哪几种模式,然后解释多个容器之间的通信如何实现,以及一个容器为什么可以连接外部的英特网。

     

    Docker网络

     

    在Docker中,网络有单机网络和多机网络区分。在单机网络又有几种网络模式或者接口,请看下图。

    我们重点学习单机网络,而且重点学习Bridge Network这个类型。这几种分类,这里不介绍,后面慢慢来学习。在本篇,知道有这几种网络模式就好了。

     

    网络通信方式

    在网络中,两台不同的节点是通过数据包来通信。不管是发送请求还是接收响应,都是数据包的形式。

     

    网络分层

    网络分层用下面一张图来表示,这个网络专业同学可能记得比较清楚,这里先放一张图这里,把一些概念,名词拿出来,后面文章可能需要用到。

    网络中几个重要的名词

    1. 路由
    2. IP地址
    3. 端口
    4. 公有IP和私有IP
    5. 网络地址转换NAT
    6. Ping
    7. telnet

    这里说下Ping和telnet这两个命令,Ping是验证IP是否可达,telnet是验证服务的可用性。举例来解释这句话意思,你电脑能不能上网,你可能会在命令输入ping baidu.com,如果接收数据正常,说明你电脑能上百度。这个过程验证了你电脑到百度服务器的IP,两者之间是可达的。假如,百度服务器有一个服务的端口是8090,地址和baidu.com一样。这个时候你就可以输入telnet来验证你机器是否能访问这个百度的8090这个服务,以上都是在linux环境下。

     

    Linux网络命名空间

    命名空间对应英文单词就是namespace,在linux机器上,关于网络网卡,你可能看到过eth0 eth1等,这个eth0指的是使用了eth0这块网卡,还有这个机器的IP地址和MAC地址,这些信息其实就是网络命名空间。

     

    我们来启动一个busybox的容器,看看网络命名空间具体一些信息。

    如果你Docker机器环境没有拉取busybox,你先去pull一个到本地,为了方便我们练习,这里介绍一个让容器一直运行的命令。

    docker run -d --name=test1 busybox /bin/sh -c "while true; do sleep 3600; done"

    上面参数-c 其实就是一个shell脚本代码,如果为真,睡眠3600秒,其实就是一个无限循环,这个容器一直在UP状态,方便我们操作这个容器。

    下面输入ip a 或者ip addr就能或者这个test1容器的网络命名空间信息。

    这个ip是一个在busybox镜像已经安装好的软件,如果是centos,你可以通过yum install ip来安装这个组件。这个linux网络命名空间有什么用呢,就是用来隔离多个容器的网络命名空间,下篇我们来学习Docker里面的网络命名空间和本机linux网络命名空间有什么关系。

    展开全文
  • linux中的网络命名空间的使用

    千次阅读 2018-09-03 22:29:24
    项目中使用了网络命名空间,用来隔离不同空间中的应用。 命名空间的使用,类似虚拟化技术,在同一台物理机上,创建的多个命名空间相互独立,各个空间的进程独立运行,互不干扰。 在此作一总结,学习加深理解。 ...
  • 而《linuxnamespace-之使用》包括了网络命名空间管理、配置以及使用,这比LXC译文更接近网络命名空间的实现,但是都是基于用户空间的,这章是关于Linux网络命名空间内核源码。在Linux中,每一个网络空
  • 命名空间 Linux

    2014-11-21 22:21:57
    目前Linux实现了六种类型的namespace 每一个namespace是包装了一些全局系统资源的抽象集合 这一抽象集合使得在进程的命名空间中可以看到全局系统资源 命名空间的一个总体目标是支持轻量级虚拟化工具container的实现 ...
  • 命名空间(namespace)的概念已经非常常见了,通常用以区分不同范畴内的各种资源。在Linux内核中,命名空间用以隔离多种Linux内核的资源,如进程、...Linux网络命名空间(network namespace)用以在一个Linux主...
  • 网络命名空间(一)

    千次阅读 2018-02-25 18:55:50
    Linux网络命名空间 为了支持网络协议栈的多实例,Linux引入了网络命名空间这个概念,这些协议栈的隔离就是通过命名空间实现的,进而起到了隔离Linux内部网络的作用。 基本操作 [root@localhost ~]# ip netns ...
  • linux命名空间(namespace)学习(一)

    千次阅读 2018-12-05 20:42:53
    关于linux命名空间网络上有很多是关于docker 的,也有关于linux的专门的linux的namespace介绍的,没有专门介绍Linux命名空间的应用的。所以我想先介绍一下linux命名空间的应用,然后再介绍linux内核对于命名空间的...
  • 网络命名空间(内核源码实现)

    千次阅读 2017-05-09 17:07:38
    而《linuxnamespace-之使用》包括了网络命名空间管理、配置以及使用,这比LXC译文更接近网络命名空间的实现,但是都是基于用户空间的,这章是关于Linux网络命名空间内核源码。在Linux中,每一个网络空间都使用struct...
  • 内核网络命名空间

    千次阅读 2018-10-31 14:55:21
    网络命名空间将内核网络协议栈(路由、流控、Netfilter、网桥等系统)虚拟成多个。内核默认创建的网络命名空间init_net。 struct net init_net = {  .count = ATOMIC_INIT(1),  .dev_base_head = LIST_HEAD_INIT...
  • 命名空间是一种用于定义特定标识符集合的方式。 使用命名空间,可以在不同的命名空间中多次使用相同的标识符。 您还可以将标识符集限制为对特定进程可见。 例如,Linux为网络和进程提供...Linux网络命名空间在网络命
  • linux命名空间(namespace)学习(三)

    千次阅读 2018-12-08 11:09:40
    LinuxPID命名空间学习 通过对于前两节的学习我们知道Linux内核使用task_struct结构来表示和管理进程,这个数据结构里面存放了很多有关于PID如何管理的数据,可以这么说,Linux内核所有有关进程管理的数据结构都和此...
  • https://blog.csdn.net/gatieme/article/details/51383322 Linux命名空间详解--Linux进程的管理与调度(二) 传统上,在Linux以及其他衍生的UNIX变体中,许多资源是全局管理的。命名空间提供了一种不同的解决方案...
  • 作为开源Container技术代表的Docker,它跟Linux内核的Namespace和...在前面的文章中,我们曾经体验过如何使用chroot和LXC,在接下来几篇文章中,我们将会使用unshare命令来演示Linux内核的命名空间到底是怎么玩的。
  • Linux命名空间详解--Linux进程的管理与调度(二)

    万次阅读 多人点赞 2016-05-12 13:20:26
    日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 ... Linux-进程管理与调度 Linux Namespaces机制提供一种资源隔离方案。 PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace。每个Name
  • 文章目录前言一、网络命名空间(netwrok namespace)是什么?二、使用步骤1.ip netns exec2. ip netns list - show all of the named network namespaces3. ip netns add NAME - create a new named network ...
  • 容器中网络命名空间与宿主机的网络命名空间是隔离开的 容器之间的独立命名空间是可以通讯的 两个独立的网络命名空间进行通讯的原理 ##相关命令 执行sudo ip netns list 查看独立的网络命名空间 sudo ip netns ...
  • 时间 2014-12-25 16:26:47 极客头条 ...主题 Linux 【编者的话】Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。而 LXC所实现
  • Firejail是一个SUID沙箱程序,它使用Linux名称空间,seccomp-bpf和Linux功能来限制不受信任的应用程序的运行环境,从而降低了违反安全性的风险。 它允许进程及其所有后代对全局共享的内核资源(例如,网络堆栈,进程...
  • 作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。 在本文中我们将会...
  • 作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。 在本文中我们将会...
  • 作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。 在本文中我们将会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 74,210
精华内容 29,684
关键字:

linux网络命名空间

linux 订阅