1、net namespace :

可以做到容器的网络隔离,不同的namespace网络协议栈(网络设备、路由表、iptables/netfilter等)是各自 独立的。
用到的命令:ip netns (管理namespace),ip link (网络设备),ip addr (设备上的协议地址)
在namespace 中操作每次需要加前缀:“ip netns exec + namespace名”再加相对应操作的命令。也可以用:ip netns exec namespace名 bash,来进入相对应的命名空间,以后每次操作就不需要加“ip netns exec + namespace名”这个前缀,但是缺点是没有提示,你最后可能会无法知道自己到底在哪个命名空间。

  • namespace有六种:网络、进程(同一个进程,在不同的命名空间进程号不同)、挂载(隔离文件目录)、ipc(隔离进程间通信:进程间交互方法)、UTS(让容器拥有独立的主机名和域名)、用户命名空间

2、veth pair:

可以让两个不同的net namespace之间通信。veth(veth0)有两端,一端连接协议栈,另一端连接设备(veth1)。
它的报文流动方向是:用ping来举例子,ping目的ip是会有一个ARP请求,先去协议栈选择一条合适的路由,然后从源网卡发到目的网卡。目的网卡接收到请求后,发到协议栈看能否匹配到本地路由表,如果可以的话会返回一个回复报文。

创建veth pair

[root@localhost zh]# ip link add veth0 type veth peer name veth1

创建net namespace

[root@localhost zh]# ip netns add ns2
[root@localhost zh]# ip netns add ns1

将veth添加到net namespace中去:

[root@localhost zh]# ip link set veth0 netns ns1
[root@localhost zh]# ip link set veth1 netns ns2

在namespcae中启动新创建的veth pair 否则不能用,在ns2中也是同样操作

[root@localhost zh]# ip netns exec ns1 ip link set veth0 up
[root@localhost zh]# ip netns exec ns1 ifconfig    //查看namespace中的vethveth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500ether 12:6a:2e:c7:62:c0  txqueuelen 1000  (Ethernet)RX packets 8  bytes 656 (656.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 8  bytes 656 (656.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

给veth配置ip

[root@localhost zh]# ip netns exec ns2 ip addr add 192.168.2.10/24 dev  veth0
[root@localhost zh]# ip netns exec ns1 ip addr add 192.168.2.11/24 dev  veth1

然后再ping,ping成功之后,两个不同namespace之间就可以通信了

[root@localhost zh]# ip netns exec ns2 ping 192.168.2.10
PING 192.168.2.10 (192.168.2.10) 56(84) bytes of data.
64 bytes from 192.168.2.10: icmp_seq=1 ttl=64 time=0.236 ms
64 bytes from 192.168.2.10: icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from 192.168.2.10: icmp_seq=3 ttl=64 time=0.074 ms
64 bytes from 192.168.2.10: icmp_seq=4 ttl=64 time=0.073 ms
^C
--- 192.168.2.10 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5005ms
rtt min/avg/max/mdev = 0.073/0.101/0.236/0.060 ms

如果要namespace能ping通宿主机,需要在veth pair(veth0,veth1)中间加bridge。veth0接入bridge,veth1接入namespace。如果ping不通,可通过"route -n"查看路由表,看有没有通往目的ip的路由表项,如果没有就不能ping通,需要手动添加(ip route add 目的ip dev 网卡)

ping通宿主机的重点是路由表,可以不加bridge, veth pair可以做到

[root@localhost zh]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.250.2   0.0.0.0         UG    100    0        0 ens33
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 veth0//看有没有本条路由[root@localhost zh]# ip netns exec ns1 route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 veth1//这儿也一样,是否存在这条记录

3、bridge:

和veth pair一起解决多个namespace之间的通信
bridge有多个端口,其中一端连接协议栈,其余的连接设备。它的从设备没有mac和ip,被弱化成了端口,数据包在bridge中进行转发等操作,选择数据包从哪个端口(网卡)流出。
创建bridge:

[root@localhost zh]# ip link add  br0 type bridge

并启动:

[root@localhost zh]# ip link set br0 up

将veth pair其中的一个关联到bridge上,将veth启动起来,并配置ip

移除添加到bridge的网卡:brctl delif br0 veth

[root@localhost zh]# ip link set veth0 master br0

可以通过“bridge link”查看bridge上关联的设备

[root@localhost zh]# bridge link
4: virbr0-nic state DOWN : <BROADCAST,MULTICAST> mtu 1500 master virbr0 state disabled priority 32 cost 100
11: veth0 state DOWN @(null): <BROADCAST,MULTICAST> mtu 1500 master br0 state disabled priority 32 cost 2

创建一个namespace,将veth pair的另一个添加到这个空间,启动起来,并配置ip,就可以ping成功了 。上面演示的是两个namespace可以ping成功,多个namespace通信就是创建namespace将veth pair的一个添加到命名空间,将另一个添加到bridge,在进行上述同样的一系列操作,就能多个namespace之间通信。

4.让命名空间能够访问外网

[root@localhost zh]# ip netns exec ns1 route -nKernel IP routing tableDestination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     0.0.0.0         UG    0      0        0 veth1
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 veth1//查看有没有这两条路由,192.168.2.1是网桥ip(veth添加到网桥上就失去了ip,所以直接将ip配置在网桥上)

在宿主机添加iptables规则:

sudo iptables -t filter -A FORWARD -i br0 ! -o br0 -j ACCEPT
sudo iptables -t filter -A FORWARD -i br0 -o br0 -j ACCEPT
sudo iptables -t filter -A FORWARD -o br0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/16 ! -o br-demo -j MASQUERADE

添加完了之后 就ping 外网了

5.跨主机访问命名空间

在192.168.250.148这台开启一个简单的httpserver

[root@localhost zh]# python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
[root@localhost zh]#curl -I 192.168.2.2:8000//在本机上就可以访问了

从别的机器访问本机namespace需要在本机设置
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.2.2:8000
sudo iptables -t filter -A FORWARD -p tcp -m tcp --dport 8000 -j ACCEPT(这样设置之后,DNAT做目的IP转换,从192.168.250.148:8088转换成192.168.2.2:8000)

//这是在另一台[root@localhost zh]# curl -I 192.168.250.148:8088HTTP/1.0 200 OKServer: SimpleHTTP/0.6 Python/2.7.5Date: Thu, 10 Jan 2019 09:36:35 GMTContent-type: text/html; charset=UTF-8Content-Length: 1074

=

跨namespace通信相关推荐

  1. Docker的网络模式和跨主机通信

    文章转载自:http://www.a-site.cn/article/169899.html Docker的四种网络模式Bridge模式 当Docker进程启动时,会在主机上创建一个名为docker0 ...

  2. 052、overlay如何实现跨主机通信?(2019-03-19 周二)

    参考https://www.cnblogs.com/CloudMan6/p/7305989.html 今天开始学习 overlay 网络跨主机通信的原理   root@host01:~# ufw al ...

  3. 50-overlay 如何实现跨主机通信?

    上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理. 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ...

  4. overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)

    上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理. 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ...

  5. Kubernetes K8S之Pod跨namespace名称空间访问Service服务

    Kubernetes的两个Service(ServiceA.ServiceB)和对应的Pod(PodA.PodB)分别属于不同的namespace名称空间,现需要PodA和PodB跨namespace ...

  6. 聊聊C++跨类通信机制之消息总线及其实现

    如果没有怎么写过项目,更确切地说是没有用面向对象的语言写过项目.就不会明白跨类通信这个需求是多么刚需. 为什么要跨类通信?把所有的逻辑都写在一个类中,都是一家人,那就不需要通信了啊.是,确实是这样,当 ...

  7. 跨进程通信,到底用长连接还是短连接

    一个完整的软件系统大多数情况下是由多个进程共同协作进行的,哪怕它们在同一台服务器上.所以,进程之间如何进行高效的通信至关重要. 单个应用程序+单个数据库这套基础开发套餐我相信每个人都经历过,甚至在初期 ...

  8. ZeroMq实现跨线程通信

    ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void ...

  9. 使用 JSONP 实现跨域通信,第 2 部分: 使用 JSONP、jQuery 和 Yahoo! 查询语言构建 mashup...

    使用 JSONP 实现跨域通信,第 2 部分: 使用 JSONP.jQuery 和 Yahoo! 查询语言构建 mashup 使用 JSONP 实现跨域通信,第 2 部分: 使用 JSONP.jQue ...

最新文章

  1. 精通Spring Boot —— 第十五篇:使用@ControllerAdvice处理异常
  2. 分区供水条件口诀_口诀记忆 | 消防给水和消火栓系统的“月检”(重点学习)...
  3. POJ2481-Cows【树状数组】
  4. 中国的电商发展迅速,有了取代实体的趋势
  5. 内涵! 程序员才懂的动图(太 TM 形象了)
  6. 转一段群里看到的小诗,银才啊银才!
  7. LQR 的直观推导及简单应用
  8. 搭建网站基本步骤(搭建一个网站的步骤)
  9. 增量型编码器与绝对值编码器
  10. APMSERV 配置失败 或80端口被占用最全解决办法 100%解决
  11. 如何在NLP领域做成一件事by周明ACL计算语言学会候任主席(附PDF公号发“NLP做事”下载rar讲座PPT等10文件)...
  12. 编写程序实现以下功能:计算1~n之间的素数并输出
  13. NOIP2009 普及组 复赛 poly 多项式输出
  14. 形式逻辑三大基本要素-推理的本质
  15. 苹果库乐队怎么玩_手机版决战万圣夜游戏下载了怎么玩?(安卓/苹果)
  16. 油门刹车标定表的制作
  17. python php java地铁站自动售票系统nodejs+vue+elementui
  18. 神舟z7m安装Linux,神舟战神Z7M U盘装系统win8教程
  19. 鸿蒙发布会在哪里看,华为新品发布会抢先看:Mate40+鸿蒙2.0系统齐亮相!
  20. Navicat导出数据库结构(不含数据)

热门文章

  1. php 检测英文字符,php正则验证中英文字符串 - 小俊学习网
  2. CAD梦想画图中的“阵列命令”
  3. 一张图看懂offsetX, clientX, pageX, screenX的区别
  4. java pkcs8格式的私钥_RSA加密解密中pkcs1与pkcs8格式私钥互相转换
  5. 计算机弹出虚拟U盘,怎么设置vmware虚拟机U盘启动
  6. Ryu环境搭建(Ubuntu20)
  7. Java体系知识之ElementUI
  8. 学术期刊数据库---EBSCO
  9. oracle truncate可以恢复吗,恢复truncate表
  10. 「来道题」Redis的Gossip协议