① 容器网络 - 与外网访问
在 容器间通信 一节中,由于两个 Network Namespace 与主机之间隔离,是无法访问外网的,那么如何访问外网呢。可以想到这样一种网络方案,因为 veth1 和 veth2 是连通的,所以 veth1 的数据是可以传递到 veth2 的,那么此时如果 veth2 的数据能传递给 eth0,借助 eth0 的外网访问能力,就能实现 veth1 的外网访问。
省略容器创建和链接命名空间,分别为容器中的网卡 veth1 和主机网卡 veth2 配置ip
可以看到这两块网卡能
可以看到,当我们直接 ping 时,不会有 ICMP 报文发出,提示网络不可达。这是因为 10.130.0.34和veth1不在同一网段,在没有配置网关的情况下,也不知道应该如何发出去。
正常情况下,为了让 veth1 ping 通 eth0,可以给 veth1 配置默认的路由规则,告诉它如果找不到合适的规则,就把数据包从 veth1 扔给 veth2。
配置好路由规则后,就能够 ping 通 10.130.0.34 了。
ping 通10.130.0.34 并不代表数据到达了 eth0 网卡 ,因为 linux 内部网络交换和外部不一样。梳理一下数据流程。
至此,整个 ICMP 通信完成。自始至终网卡 eth0 未参与。
上一部配置好路由,我们测试了 veth1 能够和主机升备行任意一个 IP 地址通信。本节将借助 eth0 访问到网关。
其中的关键点在于,如何把 veth2 的数据包传递给 eth0
先尝试 ping 一下网关,然后抓取 veth2 的数据包,发现只有请求报文,没有响应报文。
再抓取物理网卡(我这里是物理网卡名称是 enp0s3f0,也就是图式的 eth0,统一用 eth0 代表物理网卡)上的数据包。发现没有任何数据包。
为了让数据包从虚拟网卡 veht2 发到 eth0,需要用到 ip_forward ,也就是启用内核的数据包转发功能。数据转发功能能够让内核接收到不属于本机的数据包时,根据 数据包的目的 ip 地址将数据包通过合适的网卡转发出去。
sysctl -w net.ipv4.ip_forward=1
ping 网关测试,可以连通,抓取物理网卡信息,同时存在请求和响应报文。
既然 ping 通了网关,就意味着数据包已经转发出去了,那么可以访问局域网其滚培他主机或者公网吗。
首先测试一下局域网访问,ping 不通,我们在局域网的 179 这台主机上抓包。可以看到 179 收到了 ICMP 请求包,也将应答包发给了网关。
再抓取一下本机网卡,可以看见本机确实没有收到 ICMP 应答包。
这个问题就比较有意思,前一节,网关收到了 ICMP 请求,能够封装 ICMP 应答包回复给主机,而如果网关收到其他主机的 ICMP 回程报文,则由于网关不能正确传递。
其实不传递才是正常的,当网关收到 179 发来的 ICMP 应吵哗答报文时,需要投递给 192.168.0.101,但是网关上没有这样一个匹配的规则,只能走默认路由或者丢弃。
当我们 ping 网关时,猜测应答有一些特殊操作,能够正确将应答包原路返回 这个问题我暂时也不清楚 。
为了让数据包能正确的被路由,需要使用到 SNAT 技术。
SNAT 功能比较简单,就是将源地址在 192.168.0.0/24 这个网段的数据包,将其源地址转换以后,发送出去,用 iptables 规则就可以实现。
root@merore ~$ iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
此时再 ping 一下其他主机和公网。均能正常访问。
抓取本机网卡数据包,可以看到发出去的数据包源ip地址都被替换为了实际的物理网卡地址 10.130.0.34
至此,就手动完成了单主机下容器与外网通信的整个流程。
容器网络与外网通信用到的技术
其实这里还遗留了一个问题,在配置 SNAT 之后, 我们能够理解数据包能正确的发出去,eth0 网卡也能正确的收到回程报文,但此时回程报文的源地址是 10.130.0.179,目的地址是 10.130.0.34 。这样一个数据包又是如何正确的回传给 虚拟网卡veth2,然后传递 veth1 的呢。可以参考以下链接。
https://blog.csdn.net/sinat_33822516/article/details/81088724
② docker从容器中怎么访问宿主机
例如你的docker环境的虚拟IP是192.168.99.100,那么宿主机同样会托管一个和192.168.99.100同网段的虚拟IP,并且会是主IP:192.168.99.1,那么就简单了,在容器中访问192.168.99.1这个地址就等于访问宿主机。
注意,通过192.168.99.1访问宿主机,等于换了一个ip,如果数据库或中间件限制了本机访问或者做了ip段限制,要记得添加192.168.99.1到白名单。
Docker容器运行的时候有 host 、 bridge 、 none 三种网络可供配置。默认是 bridge ,即桥接网络,以桥接模式连接到宿主机; host 是宿主网络,即与宿主机共用网络; none 则表示无网络,容器将无法联网。
当容器使用 host 网络时,容器与宿主共用网络,这样就能在容器中访问宿主机网络,那么容器的 localhost 就是宿主机的 localhost 。
(2)虚拟机与容器之间的网络访问扩展阅读
宿主机和容器通信原理的问题:
考虑重启速度:在实际的运维过程中,部分场景下,会出现主机卡死,或者docker进程卡死, 这时,最快恢复业务的方法是重启主机。
容器在主机重启后,可以自动恢复,因此可以做到在1到2分钟内快速恢复业务。这一点太重要了,物理机重启由于需要做各种硬件检测,重启时间一般在5到10分钟, 虚拟机重启一般在1分钟以内 , 物理机显然无法满足需求。
重建能力很重要:
容器平台经常需要更新操作系统,或者根据需要调整主机规格。
运行一段时间后,发现内存配置偏少了, 需要添加内存。这时候申请一台新的机器加入到集群中,将旧机器下线即可。
运行多年的 ubuntu 12.04 官方已经不再维护, 需要全量替换,工作量相当大。好的方法就是使用全新的服务器替换旧服务器。
当发生故障,主机无法恢复时, 直接申请新服务器加入集群即可。
③ 2个VMware虚拟机怎么进行网络连接
首先将所有的虚拟机网络连接方式设为vmnet0,也就是桥接方式!
第二将所有的网卡设在清桥同一网段内,也就是说网络ip和子网掩码与得到的结果子网号是一个网段。
第三就可以再启动各个虚拟机的情况之下,互相访问了,可以ping彼铅老此应该没有问题,如果防火槐正升墙没有问题的话。
④ VMware 下,如何让虚拟机访问本地网络
VMWare提供了三种工作模式,它们是bridged(桥接模式)、NAT(网络地址转换模式)和host-only(主机模式)。要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式。
1.bridged(桥接模式)
在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器。在桥接模式下,你需要手工为虚拟 系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。同时,由于这个虚拟系统是局域网中的一个独立的主机 系统,那么就可以手工配置它的TCP/IP配置信息,以实现通过局域网的网关或路由器访问互联网。
使用桥接模式的虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑。想让它们相互通讯,你就需要为虚拟系统配置IP地址和子网掩码,否则就无法通信。
如果你想利用VMWare在局域网内新建一个虚拟服务器,为局域网用户提供网络服务,就应该选择桥接模式。
2.host-only(主机模式)
在某些特殊的网络调试环境中,要求将真实环境和虚拟环境隔离开,这时你就可采用host-only模式。在host-only模式中,所有的虚拟系统是可以相互通信的,但虚拟系统和真实的网络是被隔离开的。
提示:在host-only模式下,虚拟系统和宿主机器系统是可以相互通信的,相当于这两台机器通过双绞线互连。
在host-only模式下,虚拟系统的TCP/IP配置信息(如IP地址、网关地址、DNS服务器等),都是由VMnet1(host-only)虚拟网络的DHCP服务器来动态分配的。
如果你想利用VMWare创建一个与网内其他机器相隔离的虚拟系统,进行某些特殊的网络调试工作,可以选择host-only模式。
3.NAT(网络地址转换模式)
使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式可以实现在虚拟 系统里访问互联网。NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCP服务器提供的,无法进行手工修改,因此虚 拟系统也就无法和本局域网中的其他真实主机进行通讯。采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机 器能访问互联网即可。
如果你想利用VMWare安装一个新的虚拟系统,在虚拟系统中不用进行任何手工配置就能直接访问互联网,建议你采用NAT模式。
提示:以上所提到的NAT模式下的VMnet8虚拟网络,host-only模式下的VMnet1虚拟网络,以及bridged模式下的 VMnet0虚拟网络,都是由VMWare虚拟机自动配置而生成的,不需要用户自行设置。VMnet8和VMnet1提供DHCP服务,VMnet0虚拟 网络则不提供
⑤ 如何设置实现虚拟机与主机之间相互通信
1、Bridged方式
虚拟系统的IP可以设置成与本机系统在同一个网段,虚拟机相当于网络内部一个独立的机器,与本机共同插在一个Hub上,网络内的其他机器可以访问虚拟机,虚拟机也可以访问做此网络内其他机器,当然与本机的互访也不成问题。
主机拔掉网线后,虚拟机无法与主机通过网络的方式进行通讯。
2、NAT方式(需要用vmnet8)
使用VMware提供的NAT和DHCP服务,虚拟机使用主机中过的虚拟网卡Vmnet8作为网关,这种方式可以实现主机和虚拟机通信基胡埋,虚拟机也能够访问互联网,但是互联网不能访问虚拟机。
只需要设置虚拟机的网络为DHCP,就可以ping通Vmnet8了。
也可以手动设置IP,ip设置与vmnet8同网段,gateway,netmask,broadcast设置与vmnet8相同,dns设置与主机相同。
如果使用NAT方式:确保Eidt-Virtual Network Editor中的DHCP处于Start状态
3、host-only方式(需要用vmnet1)
只能进行虚搏蚂拟机和主机之间的网络通信,虚拟机不能访问外部网络。
将虚拟机ip设置与vmnet1同网段,gateway设置成vmnet1的ip,其余设置与vmnet1相同,dns设置与主机相同
对于所有的联网方式:注意关闭防火墙
⑥ VirtualBox四种网络连接方式
VirtualBox中有4种网络连接方式:
VMWare中有三种,其实他跟VMWare 的网络连接方式都是一样概念,只是比VMWare多了Internal方式。
下图说明了这四种方式的区别:
NAT:Network Address Translation,网络地址转换
NAT模式是最简单的实现虚拟机上网的方式,可以这样理解:
虚拟机与主机的关系 :只能单向访问,虚拟机可以通过网络访问到主机,主机无法通过网络访问到虚拟机。
虚拟机与网络中其他主机的关系 :只能单向访问,虚拟机可以访问到网络中其他主机,其他主机不能通过网络访问到虚拟机。
虚拟机与虚拟机的关系 :相互不能访问,虚拟机与虚拟机各自完全独立,相互间无法通过网络访问彼此。
特点 :
1、如果主机可以上网,虚拟机可以上网
2、虚拟机之间不能ping通
3、虚拟机可以ping通主机(此时ping虚拟机的网关,即是ping主机)
4、主机不能ping通虚拟机
应用场景 :
虚拟机只要求可以上网,无其它特殊要求,满足最一般需求。
ip样式 :
ip 10.0.2.15
网关 10.0.2.2
注意此处的网关在不同虚拟机中可能是同答档一个值,但是这归属于不同的NAT Engine,因此实际上各个虚拟机用的不是同一个网关。
原理 :
虚拟机的请求传递给NAT Engine,由它来利用主机进行对外的网络访问,返回的数据包再由NAT Engine给虚拟机。
网桥模式,可以这样理解:
虚拟机与主机的关系 :可以相互访问,因为虚拟机在真实网络段中有独立IP,主机与虚拟机处于同一网络段中,彼此可以通过各自IP相互访问。
虚拟机于网络中其他主机的关系 :可以相互访问,同样因为虚拟机在真实网络段中有独立IP,虚拟机与所有网络其他主机处于同一网络段中,彼此可以通过各自IP相互访问。
虚拟机与虚拟机的关系 :可以相互访问,原因同上。
特点 :
1、如果主机可以上网,虚拟机可以上网
2、虚拟机之间可以ping通
3、虚拟机可以ping通主机
4、主机可以ping通虚拟机
以上各点基于一个前提:主机可以上网
5、如果主机不可以上网,所有1-4特点均无
应用场景 :
虚拟机要求可以上网,且虚拟机完全模拟一台实体机。
ip样式 :
ip 与本机ip在同一网段内
网关 与本机网关相同
原理 :
通过主机网卡,架设一条桥,直接连入到网络中。它使得虚拟机能被分配到一个网络中独立的IP,所有网络功能完全和在网络中的真实机器一样扒厅。
(虚拟机是通过主机所在网络中的DHCP服务得到ip地址的,所以按理来说,两者是完全独立的,但事实却是虚拟机是没有独立硬件的,它还是要依靠主机的网卡,因此,主机要断开网络,虚拟机也就没法拿到ip了,所以所有特点就全消失了)
内网模式,顾名思义就是内部网络模式:
虚拟机与网络中其他主机的关系:不能相互访问,理由同上。
虚拟机与虚拟机的关系 :可以相互访问,前提是在设置网络时,两台虚拟机设置同一网络名称。如上配置图中,名称为intnet。
特清此乱点 :
1、虚拟机不可以上网
2、虚拟机之间可以ping通
3、虚拟机不能ping通主机
4、主机不能ping通虚拟机
应用场景 :
让各台虚拟机处于隔离的局域网内,只让它们相互通信,与外界(包括主机)隔绝。
虚拟机ip配置要点 :
对于XP自动获取ip即可,但对于linux,必须 手动配置ip和子网掩码 ,手动配置时需保证各个虚拟机ip在同一网段。
ip样式 :
ip 169.254.147.9
子网掩码 255.255.0.0
默认网关 无
原理 :
各个虚拟机利用VirtualBox 内置的DHCP服务器 得到ip,数据包传递不经过主机所在网络,因此安全性高,防止外部抓包。
主机模式,这是一种比较复杂的模式,需要有比较扎实的网络基础知识才能玩转。可以说前面几种模式所实现的功能,在这种模式下,通过虚拟机及网卡的设置都可以被实现。
我们可以理解为Guest在主机中 模拟出一张专供虚拟机使用的网卡 ,所有虚拟机都是连接到该网卡上的,我们可以通过设置这张网卡来实现上网及其他很多功能,比如(网卡共享、网卡桥接等)。
虚拟机与主机的关系 :默认不能相互访问,双方不属于同一IP段,host-only网卡默认IP段为192.168.56.X 子网掩码为255.255.255.0,后面的虚拟机被分配到的也都是这个网段。通过网卡共享、网卡桥接等,可以实现虚拟机于主机相互访问。
虚拟机与网络主机的关系 :默认不能相互访问,原因同上,通过设置,可以实现相互访问。
虚拟机与虚拟机的关系 :默认可以相互访问,都是同处于一个网段。
特点 :
1、虚拟机不可以上网。
2、虚拟机之间可以ping通。
3、虚拟机可以ping通主机。(注意这里虚拟机与主机ping通是指通过主机的名为VirtualBox Host-Only Network的网卡,因此ip是该网卡ip 192.168.56.1,而不是你现在正在上网所用的ip。)
4、主机可以ping通虚拟机。(注意这里是指主机通过VirtualBox Host-Only Network的网卡ping通虚拟机,使用你现在正在上网所用的网卡是ping不通的。)
应用场景 :
在主机无法上网的情况下(主机可以上网的情况下可以用host-only,也可以用桥接),需要搭建一个模拟局域网,所有机器可以互访。
ip样式 :
ip 与本机VirtualBox Host-Only Network的网卡ip在同一网段内(默认192.168.56.*)
网关 本机VirtualBox Host-Only Network的网卡ip(默认192.168.56.1)
原理 :
通过VirtualBox Host-Only Network网卡进行通信,虚拟机以此ip作为网关,因此模拟了一个本机与各个虚拟机的局域网,如名称所指。