给bridge配上IP
发布时间:2023-05-11 13:51:35 所属栏目:Linux 来源:
导读:通过上面的分析可以看出,给veth0配置IP没有意义,因为就算协议栈传数据包给veth0,应答包也回不来。这里我们就将veth0的IP让给bridge。
dev@debian:~$ sudo ip addr del 192.168.3.101/24 dev veth0
dev@debian
dev@debian:~$ sudo ip addr del 192.168.3.101/24 dev veth0
dev@debian
通过上面的分析可以看出,给veth0配置IP没有意义,因为就算协议栈传数据包给veth0,应答包也回不来。这里我们就将veth0的IP让给bridge。 dev@debian:~$ sudo ip addr del 192.168.3.101/24 dev veth0 dev@debian:~$ sudo ip addr add 192.168.3.101/24 dev br0 于是网络变成了这样子: +----------------------------------------------------------------+ | | | +------------------------------------------------+ | | | Newwork Protocol Stack | | | +------------------------------------------------+ | | ↑ ↑ ↑ | |............|............|...........................|..........| | ↓ ↓ ↓ | | +------+ +--------+ +-------+ +-------+ | | | .3.21| | .3.101 | | | | .3.102| | | +------+ +--------+ +-------+ +-------+ | | | eth0 | | br0 |<--->| veth0 | | veth1 | | | +------+ +--------+ +-------+ +-------+ | | ↑ ↑ ↑ | | | | | | | | +------------+ | | | | +------------|---------------------------------------------------+ ↓ Physical Network 其实veth0和协议栈之间还是有联系的,但由于veth0没有配置IP,所以协议栈在路由的时候不会将数据包发给veth0,就算强制要求数据包通过veth0发送出去,但由于veth0从另一端收到的数据包只会给br0,所以协议栈还是没法收到相应的arp应答包,导致通信失败。 这里为了表达更直观,将协议栈和veth0之间的联系去掉了,veth0相当于一根网线。 再通过br0 ping一下veth1,结果成功 dev@debian:~$ ping -c 1 -I br0 192.168.3.102 PING 192.168.3.102 (192.168.3.102) from 192.168.3.101 br0: 56(84) bytes of data. 64 bytes from 192.168.3.102: icmp_seq=1 ttl=64 time=0.121 ms --- 192.168.3.102 ping statistics --- 1 packets transmitted,1 received,0% packet loss,time 0ms rtt min/avg/max/mdev = 0.121/0.121/0.121/0.000 ms 但ping网关还是失败,因为这个bridge上只有两个网络设备,分别是192.168.3.101和192.168.3.102,br0不知道192.168.3.1在哪。 dev@debian:~$ ping -c 1 -I br0 192.168.3.1 PING 192.168.3.1 (192.168.3.1) from 192.168.3.101 br0: 56(84) bytes of data. From 192.168.3.101 icmp_seq=1 Destination Host Unreachable --- 192.168.3.1 ping statistics --- 1 packets transmitted,time 0ms 将物理网卡添加到bridge 将eth0添加到br0上: dev@debian:~$ sudo ip link set dev eth0 master br0 dev@debian:~$ sudo bridge link 2: eth0 state UP : <broADCAST,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4 6: veth0 state UP : <broADCAST,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2 br0根本不区分接入进来的是物理设备还是虚拟设备,对它来说都一样的,都是网络设备,所以当eth0加入br0之后,落得和上面veth0一样的下场,从外面网络收到的数据包将无条件的转发给br0,自己变成了一根网线。 这时通过eth0来ping网关失败,但由于br0通过eth0这根网线连上了外面的物理交换机,所以连在br0上的设备都能ping通网关,这里连上的设备就是veth1和br0自己,veth1是通过veth0这根网线连上去的,而br0可以理解为自己有一块自带的网卡。 #通过eth0来ping网关失败 dev@debian:~$ ping -c 1 -I eth0 192.168.3.1 PING 192.168.3.1 (192.168.3.1) from 192.168.3.21 eth0: 56(84) bytes of data. From 192.168.3.21 icmp_seq=1 Destination Host Unreachable --- 192.168.3.1 ping statistics --- 1 packets transmitted,time 0ms #通过br0来ping网关成功 dev@debian:~$ ping -c 1 -I br0 192.168.3.1 PING 192.168.3.1 (192.168.3.1) from 192.168.3.101 br0: 56(84) bytes of data. 64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=27.5 ms --- 192.168.3.1 ping statistics --- 1 packets transmitted,time 0ms rtt min/avg/max/mdev = 27.518/27.518/27.518/0.000 ms #通过veth1来ping网关成功 dev@debian:~$ ping -c 1 -I veth1 192.168.3.1 PING 192.168.3.1 (192.168.3.1) from 192.168.3.102 veth1: 56(84) bytes of data. 64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=68.8 ms --- 192.168.3.1 ping statistics --- 1 packets transmitted,time 0ms rtt min/avg/max/mdev = 68.806/68.806/68.806/0.000 ms 由于eth0已经变成了和网线差不多的功能,所以在eth0上配置IP已经没有什么意义了,并且还会影响协议栈的路由选择,比如如果上面ping的时候不指定网卡的话,协议栈有可能优先选择eth0,导致ping不通,所以这里需要将eth0上的IP去掉。 #在本人的测试机器上,由于eth0上有IP, #访问192.168.3.0/24网段时,会优先选择eth0 dev@debian:~$ sudo route -v Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 192.168.3.1 0.0.0.0 UG 0 0 0 eth0 link-local * 255.255.0.0 U 1000 0 0 eth0 192.168.3.0 * 255.255.255.0 U 0 0 0 eth0 192.168.3.0 * 255.255.255.0 U 0 0 0 veth1 192.168.3.0 * 255.255.255.0 U 0 0 0 br0 #由于eth0已结接入了br0,所有它收到的数据包都会转发给br0, #于是协议栈收不到arp应答包,导致ping失败 dev@debian:~$ ping -c 1 192.168.3.1 PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data. From 192.168.3.21 icmp_seq=1 Destination Host Unreachable --- 192.168.3.1 ping statistics --- 1 packets transmitted,time 0ms #将eth0上的IP删除掉 dev@debian:~$ sudo ip addr del 192.168.3.21/24 dev eth0 #再ping一次,成功 dev@debian:~$ ping -c 1 192.168.3.1 PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data. 64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=3.91 ms --- 192.168.3.1 ping statistics --- 1 packets transmitted,time 0ms rtt min/avg/max/mdev = 3.916/3.916/3.916/0.000 ms #这是因为eth0没有IP之后,路由表里面就没有它了,于是数据包会从veth1出去 dev@debian:~$ sudo route -v Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.3.0 * 255.255.255.0 U 0 0 0 veth1 192.168.3.0 * 255.255.255.0 U 0 0 0 br0 #从这里也可以看出,由于原来的默认路由走的是eth0,所以当eth0的IP被删除之后, #默认路由不见了,想要连接192.168.3.0/24以外的网段的话,需要手动将默认网关加回来 #添加默认网关,然后再ping外网成功 dev@debian:~$ sudo ip route add default via 192.168.3.1 dev@debian:~$ ping -c 1 baidu.com PING baidu.com (111.13.101.208) 56(84) bytes of data. 64 bytes from 111.13.101.208: icmp_seq=1 ttl=51 time=30.6 ms --- baidu.com ping statistics --- 1 packets transmitted,time 0ms rtt min/avg/max/mdev = 30.690/30.690/30.690/0.000 ms 经过上面一系列的操作后,网络变成了这个样子: +----------------------------------------------------------------+ | | | +------------------------------------------------+ | | | Newwork Protocol Stack | | | +------------------------------------------------+ | | ↑ ↑ | |.........................|...........................|..........| | ↓ ↓ | | +------+ +--------+ +-------+ +-------+ | | | | | .3.101 | | | | .3.102| | | +------+ +--------+ +-------+ +-------+ | | | eth0 |<--->| br0 |<--->| veth0 | | veth1 | | | +------+ +--------+ +-------+ +-------+ | | ↑ ↑ ↑ | | | | | | | | +------------+ | | | | +------------|---------------------------------------------------+ ↓ Physical Network 上面的操作中有几点需要注意: 如果是在虚拟机上做上述操作,记得打开网卡的混杂模式(不是在Linux里面,而是在虚拟机的配置上面,如VirtualBox上相应虚拟机的网卡配置项里面),不然veth1的网络会不通,因为eth0不在混杂模式的话,会丢掉目的mac地址是veth1的数据包 上面虽然通了,但由于Linux下arp的特性,当协议栈收到外面的arp请求时,不管是问101还是102,都会回复两个arp应答,分别包含br0和veth1的mac地址,也即Linux觉得外面发给101和102的数据包从br0和veth1进协议栈都一样,没有区别。由于回复了两个arp应答,而外面的设备只会用其中的一个,并且具体用哪个会随着时间发生变化,于是导致一个问题,就是外面回复给102的数据包可能从101的br0上进来,即通过102 ping外面时,可能在veth1抓不到回复包,而在br0上能抓到回复包。说明数据流在交换机那层没有完全的隔离开,br0和veth1会收到对方的IP应答包。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |