网络命名空间

Linux的Namespace(命名空间)技术是一种隔离技术,常用的Namespace有 user namespace, process namespace, network namespace等 在Docker容器中,不同的容器通过Network namespace进行了隔离,也就是不同的容器有各自的IP地址,路由表等,互不影响。

:::info

准备一台Linux机器,会用到一个叫 brtcl 的命令,这个命令需要安装,如果是Ubuntu的系统,可以通过 apt-get install bridge-utils 安装;如果是Centos系统,可以通过 sudo yum install bridge-utils 来安装

:::

网络命名空间 - 图1

创建bridge

  1. sudo brctl addbr mydocker0
  2. brctl show

准备一个shell脚本

脚本名字叫 add-ns-to-br.sh
  1. #!/bin/bash
  2. # 定义三个传入的变量
  3. bridge=$1
  4. namespace=$2
  5. addr=$3
  6. # 网线名
  7. vethA=veth-$namespace
  8. vethB=eth00-$namespace
  9. # 创建 $namespace 网络空间
  10. sudo ip netns add $namespace
  11. # 连接 $vethA 和 $vethB
  12. sudo ip link add $vethA type veth peer name $vethB
  13. # $vethB 放入到 $namespace
  14. sudo ip link set $vethB netns $namespace
  15. # 配置 $vethB ip地址
  16. sudo ip netns exec $namespace ip addr add $addr dev $vethB
  17. # $vethB 开启
  18. sudo ip netns exec $namespace ip link set $vethB up
  19. # $vethA 开启
  20. sudo ip link set $vethA up
  21. # $vethA 添加到 $bridge
  22. sudo brctl addif $bridge $vethA

脚本执行

  1. sh add-ns-to-br.sh mydocker0 ns1 172.16.1.1/16
  2. sh add-ns-to-br.sh mydocker0 ns2 172.16.1.2/16
把mydocker0这个bridge up起来
  1. sudo ip link set dev mydocker0 up

验证

  1. sudo ip netns list
  2. sudo ip netns exec ns1 bash
  3. ip a

对外通信

NAT with Linux and iptables - Tutorial (Introduction)