• Linux cgroup & namespace - Series II NetWork Namespace


    网络命名空间允许进程使用自己的TCP/IP网络栈,包含网卡,路由表,socket。

    如何创建网络命名空间?

    创建网络命名空间对应Clone标记为CLONE_NEWNET。ip netns可以用于创建永久的网络命名空间,是通过挂载 /proc/self/ns/net/var/run/netns/${name_of_namespace}实现。

    • CLI
     ip netns add ${YOUR_NAMESPACE_NAME}
    
    • 1

    通过strace命令分析,是通过调用unshare和mount挂载实现创建永久化network namespace:

    $ strace ip netns add test
    unshare(CLONE_NEWNET)                   = 0
    mount("/proc/self/ns/net", "/var/run/netns/two", 0x453b25, MS_BIND, NULL) = 0
    
    • 1
    • 2
    • 3

    模拟容器网络隔离

    接下来创建一个veth pair对,一端连接容器的网络命名空间one, 一段连接主机命名空间,并给容器端veth分配ip。

    1. 创建一个网络命名空间
     ip netns add one 
    
    • 1
    1. 创建veth pair

    veth pair 是一个简单的两端设备,网络包从A端流入,都会从对应B端流出。

    # veth0 <-> veth1
    ip link add veth0 type veth peer name veth1
    
    • 1
    • 2
    1. 设置veth1的所属network namespace
    ip link set veth1 netns one
    
    • 1
    1. 设置 veth1 ip
    ip netns exec one ifconfig veth1 10.1.1.1/24 up
    
    • 1
    1. 查看namespace one内网络接口ip
    # 启动网络接口
    $ ifconfig veth0 10.1.1.2/24 up
    $ ip netns exec one ip a
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    3: veth1@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 12:32:e8:e2:47:67 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 10.1.1.1/24 brd 10.1.1.255 scope global veth1
           valid_lft forever preferred_lft forever
        inet6 fe80::1032:e8ff:fee2:4767/64 scope link 
           valid_lft forever preferred_lft forever
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    veth1@if4对应主机的网络接口4:

    # 主机网络namespace
    $ ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
       # .... omit for brevity
    4: veth0@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 0e:02:24:aa:4b:aa brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 10.1.1.2/24 brd 10.1.1.255 scope global veth0
           valid_lft forever preferred_lft forever
        inet6 fe80::c02:24ff:feaa:4baa/64 scope link 
           valid_lft forever preferred_lft forever
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    油猴插件(Tampermonkey)的使用教程
    Ubuntu开机自动挂载SD卡到指定挂载点并将Docker默认存储路径改为SD卡
    ubuntu20.04下Kafka安装部署及基础使用
    vue的学习
    人计与机算:为什么AI距离智能越来越远?
    【golang之路】——govaluate
    pycharm2020无法打开,点击无反应
    嵌入式Linux应用开发-驱动大全-同步与互斥③
    【源码】第10期|configstore 持久化配置存储
    计算机算法分析与设计(14)---贪心算法(会场安排问题和最优服务次序问题)
  • 原文地址:https://blog.csdn.net/qq_33745102/article/details/125496372