查看 Linux 中的 tun/tap 设备
kvm 中虚拟机网络通信的原理
虚拟机通过 tun/tap 或者其它类似的虚拟网络设备,将虚拟机内的网卡同 br0 连接起来,这样就达到和真实交换机一样的效果,虚拟机发出去的数据包先到达 br0(当前pve设置为vmbr0),然后由 br0 交给 eth0 发送出去,数据包都不需要经过 host 机器的协议栈,效率高。
Docker 就是使用 网桥
来进行容器间通讯的,我们来看看 Docker 是怎么利用 网桥
来进行容器间通讯的,原理如下图:
网桥作为二层设备可以不配 IP 地址
此时 client ping server(br0 服务器的其他ip同网段) 可以 ping 通,反之则不行。
原因在于从 server ping 时,出口设备没有 IP 地址, 因此 ICMP 请求中的源地址由系统随机选择,
当选择不合适时,造成网络不通
解决方案有两种:1) ping 的时候指定源 IP ,比如: ping -I 10.74.68.100 10.74.68.10 。
或者添加路由时指定 src IP : ip route add 10.74.68.0/24 dev br0 src 10.74.68.100 。
将目的地为 10.74.68.0/24 网络的所有数据包通过网络接口 br0 发送,
并且设置数据包的源 IP 地址为 10.74.68.100
IP 包从物理网卡发出前需要通过 ARP 请求获取 MAC 地址,而此时物理网卡作为网桥的 Slave ,已不能处理 ARP Reply 消息了, 只能转发给网桥进行处理,因此物理网卡的邻居表一直得不到更新 (如果eth0从属br0,且eth0配置ip),IP 包就无法发送出去