[svc]通过bridge连接单机的多个网络namespace
ip操作物理网卡
参考: http://www.cnblogs.com/iiiiher/p/8056930.html
- 查看mac/操作物理网卡
ip link
- 查看ip/mac
ip a
- 查看路由表
ip route
ip操作netns
- 操作netns
$ ip netns help
Usage: ip netns list
ip netns add NAME
ip netns set NAME NETNSID
ip [-all] netns delete [NAME]
ip netns identify [PID]
ip netns pids NAME
ip [-all] netns exec [NAME] cmd ...
ip netns monitor
ip netns list-id

- 创建两个ns
ip netns add red
ip netns add green
- 查看/删除ns
ip netns
ll /var/run/netns
ip netns del red
- 查看ns里的配置-网卡
里面只有个lo接口,且处于down状态
$ ip netns exec red ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
$ ip netns exec red ip link set lo up
- 进入ns执行命令
ip netns exec net1 bash
exit
参考: http://cizixs.com/2017/02/10/network-virtualization-network-namespace
network namespace 之间通信
实现如下图所示

- 创建两个ns
ip netns add net0
ip netns add net1
1. 有了不同 network namespace 之后,也就有了网络的隔离,但是如果它们之间没有办法通信,也没有实际用处。
2. 要把两个网络连接起来,linux 提供了 veth pair
3. 可以把 veth pair 当做是双向的 pipe(管道),从一个方向发送的网络数据,可以直接被另外一端接收到;
- 创建管道(一对 veth pair)
$ ip link add type veth
$ ip link
4: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 36:88:73:83:c9:64 brd ff:ff:ff:ff:ff:ff
5: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether fe:7e:75:4d:79:2e brd ff:ff:ff:ff:ff:ff
注意:
1. veth pair 无法单独存在,删除其中一个,另一个也会自动消失。
2. 创建 veth pair 的时候可以自己指定它们的名字,比如 ip link add vethfoo type veth peer name vethbar 创建出来的两个名字就是 vethfoo 和 vethbar
3. 如果未指定名字,使用系统自动生成的名字
4. 如果 pair 的一端接口处于 DOWN 状态,另一端能自动检测到这个信息,并把自己的状态设置为 NO-CARRIER。
- 把这对 veth pair 分别放到已经两个 namespace 里面
$ 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
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 36:88:73:83:c9:64 brd ff:ff:ff:ff:ff:ff
$ ip netns exec net1 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether fe:7e:75:4d:79:2e brd ff:ff:ff:ff:ff:ff
- 给veth pair 配置上 ip 地址
$ ip netns exec net0 ip link set veth0 up
$ ip netns exec net0 ip addr add 10.0.1.1/24 dev veth0
$ ip netns exec net0 ip route
10.0.1.0/24 dev veth0 proto kernel scope link src 10.0.1.1
$ ip netns exec net1 ip link set veth1 up
$ ip netns exec net1 ip addr add 10.0.1.2/24 dev veth1
- 测试2个namespace之间的连通性
$ ip netns exec net0 ping -c 3 10.0.1.2
PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_seq=1 ttl=64 time=0.039 ms
使用 bridge 连接不同的 namespace
虽然 veth pair 可以实现两个 network namespace 之间的通信,但是当多个 namespace 需要通信的时候,就无能为力了。 讲到多个网络设备通信,我们首先想到的交换机和路由器。因为这里要考虑的只是同个网络,所以只用到交换机的功能。linux 当然也提供了虚拟交换机的功能,我们还是用 ip 命令来完成所有的操作。
下图是这部分网络的拓扑结构,如果对 docker 网络熟悉的话,其实这和 docker 默认的 bridge 网络模型非常相似。当然要实现每个 namespace 对外网的访问还需要额外的配置(设置默认网关,开启 ip_forward,为网络添加 NAT 规则等)。

NOTE:和 bridge 有关的操作也可以使用命令 brctl,这个命令来自 bridge-utils 这个包,读者可以根据自己的发行版进行安装,使用方法请查阅 man 页面或者相关文档。
首先我们来创建需要的 bridge,简单起见名字就叫做 br0。
$ ip link add br0 type bridge
$ ip link set dev br0 up
下面只演示一个 namespace 的操作,其他 namespace 要做的事情和这个类似。创建 veth pair:
$ ip link add type veth
下面只演示一个 namespace 的操作,其他 namespace 要做的事情和这个类似。创建 veth pair:
$ ip link add type veth
把其中一个 veth(veth1) 放到 net0 里面,设置它的 ip 地址并启用它:
$ ip link set dev veth1 netns net0
$ ip netns exec net0 ip link set dev veth1 name eth0
$ ip netns exec net0 ip addr add 10.0.1.1/24 dev eth0
$ ip netns exec net0 ip link set dev eth0 up
最后,把另一个 veth(veth0)连接到创建的 bridge 上,并启用它:
$ ip link set dev veth0 master br0
$ ip link set dev veth0 up
$ ip netns exec net0 ping -c 3 10.0.1.3
PING 10.0.1.3 (10.0.1.3) 56(84) bytes of data.
64 bytes from 10.0.1.3: icmp_seq=1 ttl=64 time=0.251 ms
参考: http://cizixs.com/2017/02/10/network-virtualization-network-namespace
实现bridge之间的通信-一台主机

############################################
ip link add br0 type bridge
ip link set dev br0 up
ip addr add 10.1.1.1/24 dev br0
ip netns add net0
ip link add type veth
ip link set dev veth1 netns net0
ip netns exec net0 ip link set dev veth1 name eth0
ip netns exec net0 ip addr add 10.1.1.2/24 dev eth0
ip netns exec net0 ip link set dev eth0 up
ip netns exec net0 ip route add default via 10.1.1.1 dev eth0
ip link set dev veth0 master br0
ip link set dev veth0 up
ip netns exec net0 ping 10.1.1.1
############################################
ip link add br1 type bridge
ip link set dev br1 up
ip addr add 20.1.1.1/24 dev br1
ip netns add net1
ip link add type veth
ip link set dev veth1 netns net1
ip netns exec net1 ip link set dev veth1 name eth0
ip netns exec net1 ip addr add 20.1.1.2/24 dev eth0
ip netns exec net1 ip link set dev eth0 up
ip netns exec net1 ip route add default via 20.1.1.1 dev eth0
ip link set dev veth0 master br1
ip link set dev veth0 up
ip netns exec net1 ping 20.1.1.1
实现bridge之间的通信-两台主机

#####################在n1操作######################
ip link add br0 type bridge
ip link set dev br0 up
ip addr add 10.1.1.1/24 dev br0
ip netns add net0
ip link add type veth
ip link set dev veth1 netns net0
ip netns exec net0 ip link set dev veth1 name eth0
ip netns exec net0 ip addr add 10.1.1.2/24 dev eth0
ip netns exec net0 ip link set dev eth0 up
ip netns exec net0 ip route add default via 10.1.1.1 dev eth0
ip link set dev veth0 master br0
ip link set dev veth0 up
ip r a 20.1.1.0/24 via 192.168.14.133
ip netns exec net0 ping 10.1.1.1
########################在n2操作##################
ip link add br1 type bridge
ip link set dev br1 up
ip addr add 20.1.1.1/24 dev br1
ip netns add net1
ip link add type veth
ip link set dev veth1 netns net1
ip netns exec net1 ip link set dev veth1 name eth0
ip netns exec net1 ip addr add 20.1.1.2/24 dev eth0
ip netns exec net1 ip link set dev eth0 up
ip netns exec net1 ip route add default via 20.1.1.1 dev eth0
ip link set dev veth2 master br1
ip link set dev veth2 up
ip r a 10.1.1.0/24 via 192.168.14.132
ip netns exec net1 ping 20.1.1.1
容器直接路由模式参考:
http://www.cnblogs.com/iiiiher/p/8065415.html
[svc]通过bridge连接单机的多个网络namespace的更多相关文章
- Android中判断网络连接是否可用及监控网络状态
Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android ...
- NAT模式下远程连接centos6虚拟机与虚拟机网络配置
最近装了centos,但是没有网络,也无法远程连接.关键是虚拟机中没有ip地址. 网上方法很多,但是每个人情况不一样,所以不尽适用. 1.解决这个问题,首先保证你的vmware的dhcp服务和net服 ...
- (七)使用jedis连接单机和集群(一步一个坑踩出来的辛酸泪)
环境准备: redis-4.0.9,最新版了 ruby:redis-x.x.x.gem 这个gem什么版本都行,我redis4用3.0.0的gem正常跑 jedis-2.9.0.jar,最新版 ...
- [svc]linux bridge&docker0&k8s pod网络模型通俗演义
linux namespace&bridge通俗演义 linux接口类型 br0 eth0: 一个接口 veth : 一对接口,类似一跟网线,一头有地址,另一头连到别处, linux 2个na ...
- ubuntu16.04连接android手机蓝牙共享网络热点
最近的想要用android手机蓝牙共享wifi网络给ubuntu16.04系统用,查了好多资料,发现网上很少有有用的.自己实践后分享如下. 第一步:手机与电脑配对: 该步骤比较简单,网 ...
- 运行在VMware上的Linux虚拟机如何使用NAT模式连接物理机的外部网络
在VMware Workstation中,默认有3个虚拟交换机,分别是VMnet0(使用桥接网络).VMnet1(仅主机网络)和VMnet8(NAT网络). 首先说一下为什么要用NAT模式,如果你的物 ...
- SQL Server 2008连接字符串写法大全(摘自网络)
一..NET Framework Data Provider for SQL Server 类型:.NET Framework类库使用:System.Data.SqlClient.SqlConnect ...
- [Android] [putty连接Android设备] [Android设备网络调试]
file: system/core/adb/adb.c line: 921 /* for the device, start the usb transport if the ** android u ...
- 让手机连接到指定的WIFI网络,适用于之前已经连过的网络
这个例子是从网上找的,我给重新优化了下.这里有个问题是只能连接到之前已经连接过的wifi,目前还没找到连接到陌生wifi(有/无密码)的方法.总之慢慢来吧~ 说下思路: 1.通过wifiManager ...
随机推荐
- Scrapy爬虫学习笔记 - 爬虫基础知识
一.正则表达式 二.深度和广度优先 三.爬虫去重策略
- 如何在MacBook的以太网端口上成功运行DHCP服务器?
我的目标是在我的MacBook以太网端口上安装一个以太网交换机,我将通过DHCP连接几个Raspberry Pi连接,每个都将运行VNC服务器进行远程访问,我希望我的互联网可以从我的MacBook的W ...
- mac配置php7运行环境
不用mac自带的apache和php,安装自己想要的版本.配置过程一直采坑,需要有闲时间和好的心理素质才行,哈哈,因为网上很教程都有纰漏之处,所以先把采坑无数后发现的个人认为最好的一个教程链接放在这里 ...
- Docker 配置固定IP及桥接的实现方法(转载)
这篇文章主要介绍了Docker 配置固定IP和桥接的实现方法的相关资料,这里详细介绍了Docker 的四种网络模式及如何实现桥接的案例,需要的朋友可以参考下 docker默认使用bridge模式,通过 ...
- python模块中sys.argv[]使用
一.sys 模块 sys是Python的一个「标准库」,也就是官方出的「模块」,是「System」的简写,封装了一些系统的信息和接口. 官方的文档参考:https://docs.python.org/ ...
- js类型判断-丰富加好用
一, 自己有时候写一些东西,要做类型判断,还有测试的时候,对于原生的和jQuery中的类型判断,实在不敢恭维,所以就写了一个好用的类型判断,一般情况都够用的. function test(type) ...
- 推荐一个spring cloud 学习路线,绝对合理化
最近没有时间所有没用给大家更新spring cloud 系列学习,在这先给大家奉献上我学习spring cloud 的路线 当然第一步先学习springboot然后: spring cloud eur ...
- 三篇文章带你极速入门php(一)之语法
本文适合阅读用户 有其他语言基础的童鞋 看完w3cschool语法教程来回顾一下的童鞋(传送门,想全面看一下php语法推荐这里) 毫无基础然而天资聪慧颇有慧根(不要左顾右看说的就是你,老夫这里有一本& ...
- 如何在Eclipse中查看Java类库的源代码以及相应的api
你的JDK安装目录下%Java_home%/src.zip文件就是源码,解压缩找到对应包下面的类即可. 如果是Eclipse开发,ctr+鼠标左击,出现不了源码的话,在弹出的视图中点击attach s ...
- C# 创建多级文件夹示例
string str = ""; ; i < j; i++) { str = str + "\\新建文件夹" ; } System.IO.Director ...