网站首页 > 文章精选 正文
一、 network namespace说明
network namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己就在独立的网络中。这篇文章介绍 network namespace 的基本概念和用法,network namespace 是 linux 内核提供的功能,这篇文章借助 ip 命令来完成各种操作。ip 命令来自于 iproute2 安装包,一般系统会默认安装。
ip 命令管理的功能很多, 和 network namespace 有关的操作都是在子命令 ip netns 下进行的,可以通过 ip netns help 查看所有操作的帮助信息。
简单veth pair通信机制
多Network namespace借助bridge进行通信
Docker 宿主机网络示意图
Docker使用了一个私有网段 172.40.1.0;Docker还可能会使用10.0.0.0和192.168.0.0这两个私有网段。
当启动一个容器后,可以使用 ip link show或ip addr show来查看当前宿主机的网络情况。
ip link show
(tensorflow) [root@VM_16_10_centos ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:28:4c:5c brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 20:90:6f:4e:50:69 brd ff:ff:ff:ff:ff:ff
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 02:42:91:63:b6:06 brd ff:ff:ff:ff:ff:ff
18: veth94f9941@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
link/ether 76:51:72:7c:57:d3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
(tensorflow) [root@VM_16_10_centos ~]#
二、部分网络操作命令
1. linux的 ip操作命令
ip netns add xx 创建一个 namespace#
# ip netns add net1
# ip netns ls
net1
ip netns exec xx yy 在新 namespace xx 中执行 yy 命令
# ip netns exec net1 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# ip netns exec net1 bash // 在 net1 中打开一个shell终端
# ip addr // 在net1中的shell终端
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# exit // 退出net1
上面 bash 不好区分是当前是在哪个 shell,可以采用下面的方法解决:
# ip netns exec net1 /bin/bash --rcfile <(echo "PS1=\"namespace net1> \"")
namespace net1> ping www.baidu.com
每个 namespace 在创建的时候会自动创建一个回环接口 lo ,默认不启用,可以通过 ip link set lo up 启用。
network namespace 之间的通信
新创建的 namespace 默认不能和主机网络,以及其他 namespace 通信。
可以使用 Linux 提供的 veth pair 来完成通信。下面显示两个 namespace 之间通信的网络拓扑:
ip link add type veth 创建 veth pair
# ip link add type veth
# ip link
3: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 1a:53:39:5a:26:12 brd ff:ff:ff:ff:ff:ff
4: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 46:df:46:1f:bf:d6 brd ff:ff:ff:ff:ff:ff
ip link set xx netns yy 将 veth xx 加入到 namespace yy 中
# ip link set veth0 netns net0
# ip link set veth1 netns net1
#
# ip netns exec net0 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
10: veth0@if11: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 1a:53:39:5a:26:12 brd ff:ff:ff:ff:ff:ff link-netnsid 1
其它一些命令
# 给 veth pair 配上 ip 地址
ip netns exec net0 ip link set veth0 up
ip netns exec net0 ip addr
ip netns exec net0 ip addr add 10.1.1.1/24 dev veth0
ip netns exec net0 ip route
ip netns exec net1 ip link set veth1 up
ip netns exec net1 ip addr add 10.1.1.2/24 dev veth1
2. 增加网卡步骤
## 首先,我们先增加一个网桥lxcbr0,模仿docker0
brctl addbr lxcbr0
brctl stp lxcbr0 off
ifconfig lxcbr0 192.168.10.1/24 up #为网桥设置IP地址
## 接下来,我们要创建一个network namespace - ns1
# 增加一个namesapce 命令为 ns1 (使用ip netns add命令)
ip netns add ns1
# 激活namespace中的loopback,即127.0.0.1(使用ip netns exec ns1来操作ns1中的命令)
ip netns exec ns1 ip link set dev lo up
## 然后,我们需要增加一对虚拟网卡
# 增加一个pair虚拟网卡,注意其中的veth类型,其中一个网卡要按进容器中
ip link add veth-ns1 type veth peer name lxcbr0.1
# 把 veth-ns1 按到namespace ns1中,这样容器中就会有一个新的网卡了
ip link set veth-ns1 netns ns1
# 把容器里的 veth-ns1改名为 eth0 (容器外会冲突,容器内就不会了)
ip netns exec ns1 ip link set dev veth-ns1 name eth0
# 为容器中的网卡分配一个IP地址,并激活它
ip netns exec ns1 ifconfig eth0 192.168.10.11/24 up
# 上面我们把veth-ns1这个网卡按到了容器中,然后我们要把lxcbr0.1添加上网桥上
brctl addif lxcbr0 lxcbr0.1
# 为容器增加一个路由规则,让容器可以访问外面的网络
ip netns exec ns1 ip route add default via 192.168.10.1
# 在/etc/netns下创建network namespce名称为ns1的目录,
# 然后为这个namespace设置resolv.conf,这样,容器内就可以访问域名了
mkdir -p /etc/netns/ns1
echo "nameserver 8.8.8.8" > /etc/netns/ns1/resolv.conf
- Docker的resolv.conf没有用这样的方式,而是用了Mount Namesapce的那种方式
- 另外,docker是用进程的PID来做Network Namespace的名称的。
3. 为运行中的Docker容器增加一个新的网卡
ip link add peerA type veth peer name peerB
brctl addif docker0 peerA
ip link set peerA up
ip link set peerB netns ${container-pid}
ip netns exec ${container-pid} ip link set dev peerB name eth1
ip netns exec ${container-pid} ip link set eth1 up ;
ip netns exec ${container-pid} ip addr add ${ROUTEABLE_IP} dev eth1 ;
- 这里为正在运行的docker容器,增加一个eth1的网卡,并给了一个静态的可被外部访问到的IP地址。
- 注意要把外部的“物理网卡”配置成混杂模式。
- Google为Linux内核实现了IpVlan驱动,比nat和混杂模式更高效。
猜你喜欢
- 2024-11-28 C++基础之命名空间和引用的使用方法
- 2024-11-28 Kubernetes笔记(四):详解Namespace与资源限制
- 2024-11-28 「零基础学Python」Python中变量的定义与使用
- 2024-11-28 零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就
- 2024-11-28 RocketMQ源码分析之NameServer启动流程(一)
- 2024-11-28 12.11图:蔡徐坤、杨超越、刘惜君、INTO1、时代少年团、NAME
- 2024-11-28 阅读代码深入原理22——RocketMQ之NameServer
- 2024-11-28 k8s命名空间Namespace介绍使用,以及用kubens插件管理namespace
- 2024-11-28 云计算核心技术Docker教程:解决Windows下docker端口映射问题
- 2024-11-28 “无效的用户名或密码”:这种设计真的糟透了
你 发表评论:
欢迎- 12-04关于身份证号编码规则,遇到一个奇怪的人:
- 12-04Excel如何验证身份证号码是否正确?
- 12-04网络平台常用的三种身份证验证方式
- 12-04我用 Python 算出了同事的身份证号码!| 原力计划
- 12-04关于身份证(>15位数字的计算方法)
- 12-04在wps表格中用公式校验身份证号
- 12-04Excel中身份证号录入正确性校验公式
- 12-04Ps 2021在M1 mac上导出PN 格式发生未知错误的解决方法
- 最近发表
- 标签列表
-
- react官网 (408)
- esd文件 (378)
- 更新目录 (379)
- 数据抓取 (373)
- pip换源 (412)
- display:none (369)
- img文件怎么打开 (475)
- a标签怎么去掉下划线 (376)
- git拉取代码 (435)
- 图片代码 (411)
- user-select (415)
- 访问github (415)
- 服务主机本地系统cpu占用高 (401)
- e.target (437)
- pycharm主题 (395)
- 火狐浏览器插件 (408)
- file.exists (413)
- js文件 (425)
- ip更换 (389)
- mssql和mysql区别 (366)
- 755权限 (389)
- requesttimeout (384)
- mysql默认密码 (398)
- pcm文件 (387)
- ipython和python区别 (387)
- 最新留言
-
本文暂时没有评论,来添加一个吧(●'◡'●)