首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Linux的Namespace(网络命名空间)

Linux的Namespace(网络命名空间)

作者头像
友儿
发布于 2022-09-13 16:47:28
发布于 2022-09-13 16:47:28
2.3K0
举报
文章被收录于专栏:友儿友儿

Linux的Namespace(命名空间)技术是一种隔离技术,常用的Namespace有user namespace, process namespace, network namespace等

在Docker容器中,不同的容器通过Network namespace进行了隔离,也就是不同的容器有各自的IP地址,路由表等,互不影响。

准备一台Linux机器,用到一个叫 brtcl 的命令,这个命令需要安装,如果是Ubuntu的系统,可以通过 apt-get install bridge-utils 安装;如果是Centos系统,可以通过 sudo yum install bridge-utils 来安装。
我们要搭建一个如上图所示的网络。
代码语言:javascript
复制
# 创建bridge
vagrant@swarm2:~$ sudo brctl addbr mydocker0
# 查看创建的接口
vagrant@swarm2:~$ brctl show
bridge name     bridge id               STP enabled     interfaces
mydocker0               8000.000000000000       no

准备一个脚本文件(add-ns-to-br.sh)

代码语言:javascript
复制
#!/bin/bash

# 网桥名称
bridge=$1
# 网络命名空间 
namespace=$2
# 网络命名空间对应的IP
addr=$3

# 对应图中的veth(1/2)
vethA=veth-$namespace
# 对应图中的eth(1/2)
ethA=eth-$namespace

# 添加一个网络命名空间
sudo ip netns add $namespace
# 通俗的讲就是把veth和eth建立连接
sudo ip link add $vethA type veth peer name $ethA

# 把veth放到网络命名空间里
sudo ip link set $vethA netns $namespace
# 给网络命名空间的veth端配置一个IP地址
sudo ip netns exec $namespace ip addr add $addr dev $vethA
# 把网络命名空间的veth端启动
sudo ip netns exec $namespace ip link set $vethA up

# 把eth端启动
sudo ip link set $ethA up
# 把eth端放入bridge里面
sudo brctl addif $bridge $ethA

脚本执行
代码语言:javascript
复制
# 创建如上图所示的网络结构
vagrant@swarm2:~$ sh add-ns-to-br.sh mydocker0 ns1 172.16.1.1/16
vagrant@swarm2:~$ sh add-ns-to-br.sh mydocker0 ns2 172.16.1.2/16
# 把mydocker0这个bridge up起来
vagrant@swarm2:~$ sudo ip link set dev mydocker0 up

验证
代码语言:javascript
复制
vagrant@swarm2:~$ sudo ip netns exec ns1 bash
vagrant@swarm2:~$# 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
5: eth00@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
  link/ether f2:59:19:34:73:70 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  inet 172.16.1.1/16 scope global eth00
  valid_lft forever preferred_lft forever
  inet6 fe80::f059:19ff:fe34:7370/64 scope link
  valid_lft forever preferred_lft forever

# ns1 和 ns2 通过mydocker0 可以互相通信
vagrant@swarm2:~$# ping 172.16.1.2

bytes from 172.16.1.2: icmp_seq=1 ttl=64 time=0.029 ms

bytes from 172.16.1.2: icmp_seq=2 ttl=64 time=0.080 ms^C--- 172.16.1.2 ping statistics ---

packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.029/0.054/0.080/0.026 ms

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • Linux的Namespace(命名空间)技术是一种隔离技术,常用的Namespace有user namespace, process namespace, network namespace等
  • 在Docker容器中,不同的容器通过Network namespace进行了隔离,也就是不同的容器有各自的IP地址,路由表等,互不影响。
    • 准备一台Linux机器,用到一个叫 brtcl 的命令,这个命令需要安装,如果是Ubuntu的系统,可以通过 apt-get install bridge-utils 安装;如果是Centos系统,可以通过 sudo yum install bridge-utils 来安装。
    • 我们要搭建一个如上图所示的网络。
    • 脚本执行
    • 验证
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档