0
点赞
收藏
分享

微信扫一扫

Docker与Linux Namespace:Network Namesapce

登高且赋 2021-09-24 阅读 66
PaaS

概述

Network namespace 是用来隔离网络设备,IP地址端口等网络栈的namespace。Network namespace 可以让每个容器拥有自己独立的网络设备(虚拟的),而且容器内的应用可以绑定到自己的端口,每个 namesapce 内的端口都不会互相冲突。在宿主机上搭建网桥后,就能很方便的实现容器之间的通信,而且每个容器内的应用都可以使用相同的端口。

源码

package main

import (
    "os/exec"
    "syscall"
    "os"
    "log"
)

func main() {
    cmd := exec.Command("sh")
    cmd.SysProcAttr = &syscall.SysProcAttr{
        Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS | syscall.CLONE_NEWUSER | syscall.CLONE_NEWNET,
    }
   cmd.SysProcAttr.Credential = &syscall.Credential{Uid: uint32(1), Gid: uint32(1)}
    cmd.Stdin = os.Stdin
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    if err := cmd.Run(); err != nil {
        log.Fatal(err)
    }
    os.Exit(1)
}

还是跟user namespace一样的问题,fork/exec /bin/sh: operation not permitted

package main

import (
"fmt"
"os"
"os/exec"
"syscall"
)

func main() {
        cmd := exec.Command("sh")

        //set identify for this demo
        cmd.Env = []string{"PS1=-[namespace-process]-# "}
        cmd.Stdin = os.Stdin
        cmd.Stdout = os.Stdout
        cmd.Stderr = os.Stderr

        cmd.SysProcAttr = &syscall.SysProcAttr{
                Cloneflags: syscall.CLONE_NEWNS |
                syscall.CLONE_NEWUTS |
                syscall.CLONE_NEWUSER |
                syscall.CLONE_NEWNET,
                UidMappings: []syscall.SysProcIDMap{
                {
                ContainerID: 0,
                HostID: os.Getuid(),
                Size: 1,
                },
                },
                GidMappings: []syscall.SysProcIDMap{
                {
                ContainerID: 0,
                HostID: os.Getgid(),
                Size: 1,
                },
                },
        }

        if err := cmd.Run(); err != nil {
                fmt.Printf("Error running the /bin/sh command - %s\n", err)
                os.Exit(1)
        }
}

测试

查看宿主机的网络:

ubuntu@VM-0-10-ubuntu:~/ux-dev$ ifconfig
eth0      Link encap:Ethernet  HWaddr 52:54:00:4c:8b:a6  
          inet addr:172.17.0.10  Bcast:172.17.15.255  Mask:255.255.240.0
          inet6 addr: fe80::5054:ff:fe4c:8ba6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:771614 errors:0 dropped:0 overruns:0 frame:0
          TX packets:737949 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:130736579 (130.7 MB)  TX bytes:46079169 (46.0 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

查看Network namespce的网络:

ubuntu@VM-0-10-ubuntu:~/ux-dev$ go run network.go 
-[namespace-process]-# ifconfig
-[namespace-process]-# 

嘛都没有!!!
在Namespace 里面什么网络设备都没有。这样就能展现 Network namespace 与宿主机之间的网络隔离。

举报

相关推荐

0 条评论