精华内容
下载资源
问答
  • 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 网络命名空间 Network namespaces

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

          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设置类似的网络级别隔离。 然而,这似乎是一个更加昂贵的解决方案,在系统资源和时间投入方面来建立这样的环境。 如果您只需要网络级别的进程隔离,则网络命名空间是必须考虑的。
             完整的脚本: 待续





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

    万次阅读 2018-09-03 22:29:24
    项目中使用了网络命名空间,用来隔离不同空间中的应用。 命名空间的使用,类似虚拟化技术,在同一台物理机上,创建的多个命名空间相互独立,各个空间的进程独立运行,互不干扰。 在此作一总结,学习加深理解。 ...

    背景

    项目中使用了网络命名空间,用来隔离不同空间中的应用。

    命名空间的使用,类似虚拟化技术,在同一台物理机上,创建的多个命名空间相互独立,各个空间的进程独立运行,互不干扰。

    在此作一总结,学习加深理解。

    linux命名空间

    命名空间(Linux namespace)是linux内核针对实现容器虚拟化映入的一个特性。

    我们创建的每个容器都有自己的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样,命名空间保证了容器之间互不影响。

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

    系统中的所有进程是通过PID标识的,这意味着内核必须管理一个全局的PID列表。而且,所有调用者通过uname系统调用返回的系统相关信息(包括系统名称和有关内核的一些信息)都是相同的。用户ID的管理方式类似,即各个用户是通过一个全局唯一的UID号标识。

    全局ID使得内核可以有选择地允许或拒绝某些特权。虽然UID为0的root用户基本上允许做任何事,但其他用户ID则会受到限制。例如UID为n 的用户,不允许杀死属于用户m的进程(m≠ n)。但这不能防止用户看到彼此,即用户n可以看到另一个用户m也在计算机上活动。只要用户只能操纵他们自己的进程,这就没什么问题,因为没有理由不允许用户看到其他用户的进程。

    但有些情况下,当厂商需要向用户提供root权限时,理论上他需要向每个用户提供一台计算机。显然这代价太高,使用KVM或者VMWare提供的虚拟化环境是一种解决问题的方法,但资源分配做得不是非常好。

    命名空间提供了一种不同的解决方案,只使用一个内核在一台物理计算机上运作,所有全局资源都通过命名空间抽象起来。这使得可以将一组进程放置到容器中,各个容器彼此隔离。隔离可以使容器的成员与其他容器毫无关系。但也可以通过允许容器进行一定的共享,来降低容器之间的分隔。例如,容器可以设置为使用自身的PID集合,但仍然与其他容器共享部分文件系统。

    Linux内核提供了6种命名空间:

    命名空间描述作用备注
    进程命名空间隔离进程IDinux通过命名空间管理进程号,同一个进程,在不同的命名空间进程号不同进程命名空间是一个父子结构,子空间对于父空间可见
    网络命名空间隔离网络设备、协议栈、端口等通过网络命名空间,实现网络隔离docker采用虚拟网络设备,将不同命名空间的网络设备连接到一起
    IPC命名空间隔离进程间通信进程间交互方法PID命名空间和IPC命名空间可以组合起来用,同一个IPC名字空间内的进程可以彼此看见,允许进行交互,不同空间进程无法交互
    挂载命名空间隔离挂载点隔离文件目录进程运行时可以将挂载点与系统分离,使用这个功能时,我们可以达到 chroot 的功能,而在安全性方面比 chroot 更高
    UTS命名空间隔离Hostname和NIS域名让容器拥有独立的主机名和域名,从而让容器看起来像个独立的主机要目的是独立出主机名和网络信息服务(NIS)
    用户命名空间隔离用户和group ID每个容器内上的用户跟宿主主机上不在一个命名空间同进程 ID 一样,用户 ID 和组 ID 在命名空间内外是不一样的,并且在不同命名空间内可以存在相同的 ID

    下面主要介绍Linux网络命名空间。

    网络命名空间

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

    从逻辑上说,网络命名空间是网络栈的副本,有自己的网络设备、路由选择表、邻接表、Netfilter表、网络套接字、网络procfs条目、网络sysfs条目和其他网络资源。

    从系统的角度来看,当通过clone()系统调用创建新进程时,传递标志CLONE_NEWNET将在新进程中创建一个全新的网络命名空间。

    从用户的角度来看,我们只需使用工具ip(package is 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.

    创建netns

    • 查看是否存在命名空间:ip netns list

      • 若报错,需要更新系统内核,以及 ip 工具程序。
    • 添加命名空间:ip netns add ns1

    添加网卡

    • 列出网卡: ip link list

    • 创建新的虚拟网卡:ip link add veth0 type veth peer name veth1

      • 同时创建veth0和veth1两个虚拟网卡
      • 这个时候这两个网卡还都属于“default”或“global”命名空间,和物理网卡一样。
    • 把其中一个网卡转移到命名空间ns1中:ip link set veth1 netns ns1

    • 验证:ip netns exec ns1 ip link list
    • 删除:ip netns exec ns1 ip link del veth1

    • 配置命名空间中的端口:

    $ ip netns exec ns1 ip addr add 10.1.1.1/24 dev veth1
    $ ip netns exec ns1 ip link set veth1 up
    $ ip netns exec ns1 ip link set lo up
    • 配置主机上网卡ip:
    $ ip addr add 10.1.1.2/24 dev veth0
    $ ip link set veth0 up
    • 此时在ns1中ping自己10.1.1.1能通:
    ip netns exec ns1 ping 10.1.1.1
    PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
    64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=0.058 ms
    • 但还不能ping通10.1.1.2,因为ns1中未设置路由。

    设置命名空间路由

    • 设置默认路由
    $ ip netns exec ns1 ip route add default via 10.1.1.1
    $ ip netns exec ns1 ip route show
    default via 10.1.1.1 dev veth1
    • 此时能够ping通主机:
    $ip netns exec ns1 ping 10.1.1.2
    PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
    64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=0.086 ms

    使能IP转发

    但是到了这里依旧还不够,ns1命名空间中已经可以联通主机上的网络,但是依旧连不同主机以外的外部网络。这个时候必须在host主机上启动转发,并且在iptables中设置伪装。

    Linux系统的IP转发的意思是,当Linux主机存在多个网卡的时候,允许一个网卡的数据包转发到另外一张网卡;在linux系统中默认禁止IP转发功能,可以打开如下文件查看,如果值为0说明禁止进行IP转发:

    cat /proc/sys/net/ipv4/ip_forward

    运行如下命令:

    #使能ip转发
    
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
    #刷新forward规则
    iptables -F FORWARD
    iptables -t nat -F
    
    #刷新nat规则
    iptables -t nat -L -n
    
    #使能IP伪装
    iptables -t nat -A POSTROUTING -s 10.1.1.0/255.255.255.0 -o eth8 -j MASQUERADE # eth8连接外网
    
    #允许veth0和ens160之间的转发
    iptables -A FORWARD -i eth8 -o veth0 -j ACCEPT
    iptables -A FORWARD -o eth8 -i veth0 -j ACCEPT
    • 使能IP伪装这条语句,添加了一条规则到NAT表的POSTROUTING链中,对于源IP地址为10.1.1.0网段的数据包,用eth8网口的IP地址替换并发送。
    • iptables -A FORWARD这两条语句使能物理网口eth8和veth0之间的数据转发

    总结

    Linux网络命名空间提供了强大的虚拟化功能,使用得当能够达到事半功倍的效果。

    本文简要介绍了Linux提供的6种命名空间,对命名空间的作用和使用场景作了详细的介绍。

    着重对Linux网络命名空间进行了讲解,包括命名空间的创建、使用,与主机通信以及与外部网络的连接等。

    对于一般的应用而言,掌握网络命名空间的创建、使用、ip命令等就能顺当使用命名空间了。

    展开全文
  • linux 网络虚拟化:network namespace 简介

    万次阅读 多人点赞 2017-10-05 22:56:03
    network namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己就在独立的网络中。这篇文章介绍 network namespace 的基本概念和...

    network namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己就在独立的网络中。这篇文章介绍 network namespace 的基本概念和用法,network namespace 是 linux 内核提供的功能,这篇文章借助 ip 命令来完成各种操作。ip 命令来自于 iproute2 安装包,一般系统会默认安装,如果没有的话,请读者自行安装。

    NOTE:ip 命令因为需要修改系统的网络配置,默认需要 sudo 权限。这篇文章使用 root 用户执行,请不要在生产环境或者重要的系统中用 root 直接执行,以防产生错误。

    ip 命令管理的功能很多, 和 network namespace 有关的操作都是在子命令 ip netns 下进行的,可以通过 ip netns help 查看所有操作的帮助信息。

    默认情况下,使用 ip netns 是没有网络 namespace 的,所以 ip netns ls 命令看不到任何输出。

    [root@localhost ~]# ip netns help
    Usage: ip netns list
           ip netns add NAME
           ip netns delete NAME
           ip netns identify PID
           ip netns pids NAME
           ip netns exec NAME cmd ...
           ip netns monitor
    [root@localhost ~]# ip netns ls

    创建 network namespace 也非常简单,直接使用 ip netns add 后面跟着要创建的 namespace 名称。如果相同名字的 namespace 已经存在,命令会报 Cannot create namespace 的错误。

    [root@localhost ~]# ip netns add net1
    [root@localhost ~]# ip netns ls
    net1

    ip netns 命令创建的 network namespace 会出现在 /var/run/netns/ 目录下,如果需要管理其他不是 ip netns 创建的 network namespace,只要在这个目录下创建一个指向对应 network namespace 文件的链接就行。

    有了自己创建的 network namespace,我们还需要看看它里面有哪些东西。对于每个 network namespace 来说,它会有自己独立的网卡、路由表、ARP 表、iptables 等和网络相关的资源。ip 命令提供了 ip netns exec 子命令可以在对应的 network namespace 中执行命令,比如我们要看一下这个 network namespace 中有哪些网卡。更棒的是,要执行的可以是任何命令,不只是和网络相关的(当然,和网络无关命令执行的结果和在外部执行没有区别)。比如下面例子中,执行 bash 命令了之后,后面所有的命令都是在这个 network namespace 中执行的,好处是不用每次执行命令都要把 ip netns exec NAME 补全,缺点是你无法清楚知道自己当前所在的 shell,容易混淆。

    [root@localhost ~]# ip netns exec net1 ip addr
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    [root@localhost ~]# ip netns exec net1 bash
    [root@localhost ~]# ip addr
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    [root@localhost ~]# exit
    exit

    更新:通过修改 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

    ip netns exec 后面跟着 namespace 的名字,比如这里的 net1,然后是要执行的命令,只要是合法的 shell 命令都能运行,比如上面的 ip addr 或者 bash

    每个 namespace 在创建的时候会自动创建一个 lo 的 interface,它的作用和 linux 系统中默认看到的 lo 一样,都是为了实现 loopback 通信。如果希望 lo 能工作,不要忘记启用它:

    [root@localhost ~]# ip netns exec net1 ip link set lo up

    默认情况下,network namespace 是不能和主机网络,或者其他 network namespace 通信的。

    network namespace 之间通信

    有了不同 network namespace 之后,也就有了网络的隔离,但是如果它们之间没有办法通信,也没有实际用处。要把两个网络连接起来,linux 提供了 veth pair 。可以把 veth pair 当做是双向的 pipe(管道),从一个方向发送的网络数据,可以直接被另外一端接收到;或者也可以想象成两个 namespace 直接通过一个特殊的虚拟网卡连接起来,可以直接通信。

    使用上面提到的方法,我们再创建另外一个 network namespace,这里我们使用 net0net1 两个名字。

    我们可以使用 ip link add type veth 来创建一对 veth pair 出来,需要记住的是 veth pair 无法单独存在,删除其中一个,另一个也会自动消失。

    [root@localhost ~]# ip link add type veth
    [root@localhost ~]# ip link
    4: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
        link/ether 36:88:73:83:c9:64 brd ff:ff:ff:ff:ff:ff
    5: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
        link/ether fe:7e:75:4d:79:2e brd ff:ff:ff:ff:ff:ff

    小知识: 创建 veth pair 的时候可以自己指定它们的名字,比如 ip link add vethfoo type veth peer name vethbar 创建出来的两个名字就是 vethfoovethbar 。因为这里我们对名字没有特殊要求,所以就直接使用系统自动生成的名字。如果 pair 的一端接口处于 DOWN 状态,另一端能自动检测到这个信息,并把自己的状态设置为 NO-CARRIER

    创建结束之后,我们能看到名字为 veth0veth1 两个网络接口,名字后面的数字是系统自动生成的。接下来,要做的是把这对 veth pair 分别放到已经两个 namespace 里面,这个可以使用 ip link set DEV netns NAME 来实现:

    [root@localhost ~]# ip link set veth0 netns net0
    [root@localhost ~]# ip link set veth1 netns net1
    [root@localhost ~]# ip netns exec net0 ip addr
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    4: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
        link/ether 36:88:73:83:c9:64 brd ff:ff:ff:ff:ff:ff
    [root@localhost ~]# ip netns exec net1 ip addr
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    5: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
        link/ether fe:7e:75:4d:79:2e brd ff:ff:ff:ff:ff:ff

    最后,我们给这对 veth pair 配置上 ip 地址,并启用它们。

    [root@localhost ~]# ip netns exec net0 ip link set veth0 up
    [root@localhost ~]# ip netns exec net0 ip addr add 10.0.1.1/24 dev veth0
    [root@localhost ~]# ip netns exec net0 ip route
    10.0.1.0/24 dev veth0  proto kernel  scope link  src 10.0.1.1
    
    [root@localhost ~]# ip netns exec net1 ip link set veth1 up
    [root@localhost ~]# ip netns exec net1 ip addr add 10.0.1.2/24 dev veth1

    可以看到,最每个 namespace 中,在配置玩 ip 之后,还自动生成了对应的路由表信息,网络 10.0.1.0/24 数据报文都会通过 veth pair 进行传输。使用 ping 命令可以验证它们的连通性:

    [root@localhost ~]# 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_seq=1 ttl=64 time=0.039 ms
    64 bytes from 10.0.1.2: icmp_seq=2 ttl=64 time=0.039 ms
    64 bytes from 10.0.1.2: icmp_seq=3 ttl=64 time=0.139 ms
    
    --- 10.0.1.2 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2004ms
    rtt min/avg/max/mdev = 0.039/0.072/0.139/0.047 ms

    完成这些,我们创建的网络拓扑结构如下所示:
    这里写图片描述

    使用 bridge 连接不同的 namespace

    虽然 veth pair 可以实现两个 network namespace 之间的通信,但是当多个 namespace 需要通信的时候,就无能为力了。 讲到多个网络设备通信,我们首先想到的交换机和路由器。因为这里要考虑的只是同个网络,所以只用到交换机的功能。linux 当然也提供了虚拟交换机的功能,我们还是用 ip 命令来完成所有的操作。

    NOTE:和 bridge 有关的操作也可以使用命令 brctl,这个命令来自 bridge-utils 这个包,读者可以根据自己的发行版进行安装,使用方法请查阅 man 页面或者相关文档。

    首先我们来创建需要的 bridge,简单起见名字就叫做 br0

    [root@localhost ~]# ip link add br0 type bridge
    [root@localhost ~]# ip link set dev br0 up

    下面只演示一个 namespace 的操作,其他 namespace 要做的事情和这个类似。创建 veth pair:

    [root@localhost ~]# ip link add type veth

    把其中一个 veth(veth1) 放到 net0 里面,设置它的 ip 地址并启用它:

    [root@localhost ~]# ip link set dev veth1 netns net0
    [root@localhost ~]# ip netns exec net0 ip link set dev veth1 name eth0
    [root@localhost ~]# ip netns exec net0 ip addr add 10.0.1.1/24 dev eth0
    [root@localhost ~]# ip netns exec net0 ip link set dev eth0 up

    最后,把另一个 veth(veth0)连接到创建的 bridge 上,并启用它:

    [root@localhost ~]# ip link set dev veth0 master br0
    [root@localhost ~]# ip link set dev veth0 up

    可以通过 bridge 命令(也是 iproute2 包自带的命令)来查看 bridge 管理的 link 信息:

    [root@localhost ~]# bridge link
    17: veth0 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2

    最后通过 ping 命令来测试网络的连通性:

    [root@localhost ~]# ip netns exec net0 ping -c 3 10.0.1.3
    PING 10.0.1.3 (10.0.1.3) 56(84) bytes of data.
    64 bytes from 10.0.1.3: icmp_seq=1 ttl=64 time=0.251 ms
    64 bytes from 10.0.1.3: icmp_seq=2 ttl=64 time=0.047 ms
    64 bytes from 10.0.1.3: icmp_seq=3 ttl=64 time=0.046 ms
    
    --- 10.0.1.3 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2008ms

    下图是这部分网络的拓扑结构,如果对 docker 网络熟悉的话,其实这和 docker 默认的 bridge 网络模型非常相似。当然要实现每个 namespace 对外网的访问还需要额外的配置(设置默认网关,开启 ip_forward,为网络添加 NAT 规则等)。
    这里写图片描述


    转自:http://cizixs.com/2017/02/10/network-virtualization-network-namespace

    展开全文
  • linux命名空间(namespace)学习(三)

    千次阅读 2018-12-08 11:09:40
    LinuxPID命名空间学习 通过对于前两节的学习我们知道Linux内核使用task_struct结构来表示和管理进程,这个数据结构里面存放了很多有关于PID如何管理的数据,可以这么说,Linux内核所有有关进程管理的数据结构都和此...
  • Qt linux获取cpu使用率、内存、网络收发速度、磁盘读写速度、磁盘剩余空间
  • linux命名空间(namespace)学习(一)

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

    千次阅读 2016-04-25 10:07:27
     Linux 简化了分段机制,使得虚拟地址(逻辑地址)与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G(2^32)。  Linux内核将这4G字节的空间分为两部分。将最高的 1G字节(从虚拟地址0xC0000000到0...
  • 关于linux内核空间与用户空间的理解

    千次阅读 多人点赞 2017-10-19 09:20:41
    简介现代计算机都有两种以上的运行模式(普通模式、特权模式),...应用程序不能直接操控硬件或者调用内核函数,需借助一系列接口函数申请让系统调用相关代码在内核空间运行,获取代码运行权限。Created with Raphaël
  • df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式:df -hl显示格式为:文件系统 容量 已用 可用 已用% 挂载点Filesystem Size Used Avail Use% Mounted on/dev/hda2 45G...
  • Linux C网络编程基础

    千次阅读 2018-08-12 16:23:09
    Linux网络套接字操作函数 创建套接字描述符函数 绑定套接字函数 建立连接函数 倾听套接字切换函数 接收连接函数 关闭连接函数 套接字读写函数 套接字地址获取函数 发送和接收函数 Linux套接字结构定义 ...
  • 虽然对于网络的正式介绍一般都参考了 OSI(Open Systems Interconnection)模型,但是本文对 Linux 中基本网络栈的介绍分为四层的 Internet 模型(如图 1 所示)。 图 1. 网络栈的 Internet 模型 这个栈的最底部...
  • Linux网络设备驱动架构

    千次阅读 2018-02-01 23:10:09
    Linux网络设备驱动程序体系结构分为四层:网络协议接口层、网络设备接口层、提供实际功能的设备驱动层以及网络设备与媒介层。 (1)网络协议接口层向网络层协议提供统一的数据包收发接口,不论上层协议是ARP还是...
  • Linux用户空间与内核地址空间

    千次阅读 2017-09-02 11:35:54
    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在...
  • Linux的命名空间详解--Linux进程的管理与调度(二)

    万次阅读 多人点赞 2016-05-12 13:20:26
    日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 ... Linux-进程管理与调度 Linux Namespaces机制提供一种资源隔离方案。 PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace。每个Name
  • Preface  Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计。  Linux内核采用分层结构... 在Linux内核中,对网络部分按照网络协议层、网络设备层、设备驱动功能层和网络媒介
  • linux网络协议栈内核分析

    万次阅读 多人点赞 2016-06-04 15:21:49
    应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间网络协议栈通信的。Linux Socket 是从 BSD Socket 发展而来的,它是 Linux 操作系统的重要组成部分之一,它是网络应用程序的基础。从...
  • Linux常用网络工具总结

    万次阅读 2017-04-20 12:02:58
    本文整理了在实践过程中使用的Linux网络工具,这些工具提供的功能非常强大,我们平时使用的只是冰山一角,比如lsof、ip、tcpdump、iptables等。本文不会深入研究这些命令的强大用法,因为每个命令都足以写一篇文章,...
  • 1、学会Linux网络的基本配置; 2、掌握Linux基本的网络应用; 3、Linux启动过程 4、Linux下C语言编程 (1)说明/etc/sysconfig/network-scripts/ifcfg-ens33, /etc/resolv.conf, /etc/hosts, /etc/services四个文件...
  • Linux网络服务器管理和搭建

    千次阅读 多人点赞 2019-04-29 20:54:02
    在虚拟机中安装Linux操作系统CentOS或RedHat 。 (附上已安装系统运行的界面图) 二、 Linux用户和组及其权限管理(共20分) 请根据以下项目要求,写出操作过程和命令并上机操作验证。 项目要求: 某软件开发...
  • Linux:限制网络带宽

    千次阅读 2019-06-09 20:11:04
    在本文中,我将描述两种不同的方法来限制Linux上的网络流量。 限制Linux上的应用程序流量(Rate Limit an Application on Linux) 限制网络流量速率的一种方法是通过一个名为trickle的命令行工具。 通过在程序...
  • Linux无线网络架构

    千次阅读 2016-09-08 15:55:25
    Android中无线网络的软件涉及linux内核、supplicant、framework、wifi service,代码从c、c++、java都有,这一篇主要介绍linux内核中的无线网络。要了解linux的无线网络,首先要了解linux网络架构,接着介绍无线...
  • 简单实现linux挂载网络文件目录

    万次阅读 2018-01-07 17:30:56
    一、服务端配置 比如说想把服务端的目录/var/test共享给其他电脑 (1)首先安装nfs组件 yum install nfs-utils -y (2)配置共享目录  打开/etc/exports文件 vi /etc/exports 配置如下信息 ... 
  • 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间网络协议栈通信的。Linux Socket 是从 BSD Socket 发展而来的,它是 Linux 操作系统的重要组成部分之一,它是网络应用程序的基础。从...
  • Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在...
  • Linux网络驱动涉及到后面两层,网络协议层中需要了解skb和netif;硬件驱动层也就是mac层,需要了解dma和dec。 按内容来说,整个网络驱动又可以分为下面五个部分: a) control设置,包含控制器操作、mac属性地址,...
  • linux服务器根目录空间不足

    千次阅读 2020-06-09 10:40:52
    根据用户反馈,上传下载文件报网络错误,经过排查,发现是nginx服务器根目录已满。
  • 摘要:Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据...
  • Linux】如何查看内存空间大小?

    千次阅读 2019-12-04 11:26:44
    我发现现在网络的信息确实很多,然后很多问题打开后就是一大堆讲解,有时候其实不利于我们找到自己 想要的内容。 查看内存大小就背会两个操作: df -hl du -sh * 可以再多一个 free 没了,别看了很多命令眼花...
  •  内核空间与用户空间经常需要进行交互。举个例子:当用户空间使用一些配置命令如ifconfig或route时,内核处理程序就要响应这些处理请求。  用户空间与内核有多种交互方式,最常用的有以下四种:通过/proc虚拟...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 330,003
精华内容 132,001
关键字:

linux网络空间

linux 订阅