十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Linux网桥是网桥的软件实现,这是Linux内核的内核部分。与硬件网桥相类似,Linux网桥维护了一个2层转发表(也称为MAC学习表,转发数据库,或者仅仅称为FDB),它跟踪记录了MAC地址与端口的对应关系。当一个网桥在端口N收到一个包时(源MAC地址为X),它在FDB中记录为MAC地址X可以从端口N到达。这样的话,以后当网桥需要转发一个包到地址X时,它就可以从FDB查询知道转发到哪里。构建一个FDB常常称之为“MAC学习”或仅仅称为“学习”过程。
成都创新互联网站建设公司是一家服务多年做网站建设策划设计制作的公司,为广大用户提供了网站制作、网站建设,成都网站设计,一元广告,成都做网站选成都创新互联,贴合企业需求,高性价比,满足客户不同层次的需求一站式服务欢迎致电。
你可以使用以下命令来检查Linux网桥当前转发表或MAC学习表。
1.$ sudo brctl showmacs bridge-name
该命令将显示一个学习到的MAC地址与关联端口的列表。各个条目都有一个相关的附于其上的老化计时器,因此转发条目可以在一定时间后刷新,以使MAC学习表更新到最新。
有五台主机。其中一台主机装有linux ,安装了网桥模块,而且有四块物理网卡,分别连接同一网段的其他主机。我们希望其成为一个网桥,为其他四台主机(IP分别为192.168.1.2 ,192.168.1.3,192.168.1.4,192.168.1.5) 之间转发数据包。同时,为了方便管理,希望网桥能够有一个IP(192.168.1.1),那样管理员就可以在192.168.1.0/24网段内的主机上telnet到网桥,对其进行配置,实现远程管理。
前一节中提到,网桥在同一个逻辑网段转发数据包。针对上面的拓扑,这个逻辑网段就是192.168.1.0/24网段。我们为这个逻辑网段一个名称,br0。首先需要配置这样一个逻辑网段。# brctl addbr br0 (建立一个逻辑网段,名称为br0) 实际上,我们可以把逻辑网段192.168.1.0/24看作使一个VLAN ,而br0则是这个VLAN的名称。建立一个逻辑网段之后,我们还需要为这个网段分配特定的端口。在Linux中,一个端口实际上就是一个物理网卡。而每个物理网卡的名称则分别为eth0,eth1,eth2,eth3。我们需要把每个网卡一一和br0这个网段联系起来,作为br0中的一个端口。# brctl addif br0 eth0 (让eth0成为br0的一个端口)# brctl addif br0 eth1 (让eth1成为br0的一个端口)# brctl addif br0 eth0 (让eth2成为br0的一个端口)# brctl addif br0 eth3 (让eth3成为br0的一个端口) 网桥的每个物理网卡作为一个端口,运行于混杂模式,而且是在链路层工作,所以就不需要IP了。# ifconfig eth0 0.0.0.0# ifconfig eth1 0.0.0.0# ifconfig eth2 0.0.0.0# ifconfig eth3 0.0.0.0 然后给br0的虚拟网卡配置IP:192.168.1.1。那样就能远程管理网桥。# ifconfig br0 192.168.1.1 给br0配置了IP之后,网桥就能够工作了。192.168.1.0/24网段内的主机都可以telnet到网桥上对其进行配置。以上配置的是一个逻辑网段,实际上Linux网桥也能配置成多个逻辑网段(相当于交换机中划分多个VLAN)。
Neutron 默认使用 ML2 作为 core plugin,配置文件 /etc/neutron/neutron.conf 中 core_plugin
计算节点和控制节点都需要在各自的 neutron.conf 中配置 core_plugin
然后配置 ML2 的配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 中 mechanism_drivers
mechanism_drivers 可以同时指定多个。这里只指定了一个。
查看 linuxbridge 进程
控制节点:
计算节点:
在 Linux Bridge 环境中,一个数据包从 Instance 发送到物理网卡会经过下面几个类型的设备:
对于每个 local network,ML2 linux-bridge 会创建一个 bridge,Instance 的 tap 设备会连接到 bridge。位于同一个 local network 的 Instance 会连接到相同的 bridge,这样 Instance 之间就可以通讯了。
因为 local network 没有与物理网卡相连,所以 Instance 无法与宿主机之外的网络通信。
同时因为每个 local network 有自己的 bridge,bridge 之间是没有连通的,所以两个 local network 之间是不通的。
ML2 配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini
type_drivers ML2 加载网络类型。
tenant_network_types 普通用户在自己的 Tenant(Project)中创建网络时,默认创建哪种 type 的网络。
tenant_network_types = vlan, local 意思是当没有 vlan 可创建时,使用 local。
检测 Neutron Agent 是否正常 管理员 -- 系统 -- 系统信息 -- 网络代理
从用户管理创建网络
创建网络 项目 -- 网络 -- 网络
填写网络名称
填写子网信息。 网关 IP 可以不用填写。默认为子网地址的第一个 IP。即:172.16.10.1
添加子网 IP 范围。
点击网络名称,进去相信信息,可以看到子网和端口信息等。
可以看到在端口中已经创建了一个 port,名为 “(c45b69e6-04ba)”,IP 为 172.16.10.2。连接设备为 "network:dhcp"。
打开控制节点终端,使用 brctl show 查看 linux bridge 的状态。
可以看到 bridge 设备 brqd2fd4378-9e 和 tap 设备 tapc45b69e6-04
创建 Instance 并选择刚刚创建的网络。
创建 Instance 成功后可以发现已经分配 IP 地址。
在底层中 Neutron 会在 subnet 中创建一个 port,分配 IP 和 MAC 地址,并将 port 分配给 test。如下图
点进去可以看到详情
在宿主机上执行 brctl show 可以查看 bridge 的配置。
可以看到 bridge brqd2fd4378-9e 上连接了一个新的 tap 设备。
查看 Instance 信息。使用 virsh list 查看 Instance 运行中的列表。
使用 virsh edit 1 查看配置信息。
配置信息省略很多。重要的放在上面。
mac address='fa:16:3e:19:e1:57'/ 是 Instance 网卡的 MAC 地址
target dev='tapb337d11f-54'/ 是 Instance 虚拟网卡信息
ping test1 的 IP 地址发现是可以 ping 通。
查看 brctl show
发现 brqd2fd4378-9e 中又计入进来一个 VIF,因为两个 VIF 挂载在同一个 Linux Bridge 上,所以可以通讯。
结构如下:
如果新分的 Instance 在计算节点中。不在控制节点。他们之间将不在互通。
因为 DHCP agent 在控制节点上运行,test2 在计算节点的 local 网络上,两者位于不同物理节点。由于 local 网络的流量只能局限在本节点之内,发送的请求无法到达计算节点。
上图 物理网卡 eth1 桥接到 brqXXXX,为 Instance 提供 flat 网络。
下图 创建多个 flat Network,就要准备多个物理机网卡。
在 /etc/neutron/plugins/ml2/ml2.conf.ini 配置文件中,修改 tenant_network_types 参数为 flat
:这里是指定普通用户使用 flat。因为 flat 网络与物理网卡一一对应。一般情况下租户网络不采用 flat。
flat_networks 定义一个 flat 网络,label 为 “default”
通过 physical_interface_mappings 指名 default 对应的物理网卡为 ens35
例如:对于 label 为 “default” 的 flat network,节点 A 可能使用 ens35,配置为:
而 B 节点则可以使用 ens33,配置为:
创建 flat 网络
绑定子网
查看 控制节点网络状态
Neutron 自动新建了 flat_net 对应的网桥 brq9e3013c8-93,以及 dhcp 的 tap 设备 tap50802894-1a。
此时 tap50802894-1a 和物理网卡 ens35 都已经连接到网桥 brq9e3013c8-93 上。
可以看到 Instance 的 tap 设备 tapc1241c3f-cb 已经连接到网桥
配置文件 /etc/neutron/dhcp_agent.ini 中的 dhcp_driver 和 interface_driver
dnsmasq 是一个提供 DHCP 和 DNS 服务的开源软件。
在实现环境中使用 ps 命令可以查看到 dnsmasq 进程。
DHCP agent 会为每个 network 创建一个目录 /opt/stack/data/neutron/dhcp/xxxx 用于存放该 network 的 dnsmasq 配置文件。
在二层网络上,VLAN 可以将一个交换机分割成几个独立的虚拟交换机。
类似,在三层网络上,Linux Network Namespace 可以将一个物理三层网络分割成几个独立的虚拟三层网络。
每个 namespace 都有自己独立的网络栈,包括 route table,firewall rule,network interface device等
Neutron 通过 dnsmasq 为每个 Network 提供单独的 DHCP 和路由服务。
使用 ip 查看所有 namespcae
使用 neutron 查看 net-list
查看某个 namespace 的详细配置
3 个 Instance 通过 tap 设备连接到名为 “vrqXXXX” 的 Linux Bridge。
在物理网卡 eth1 上创建 eth1.100 的 valn interface,eth1.100 连接到 brqXXXX。
这样,Instance 通过 eth1.100 发送到 eth1 的数据包就会打上 vlan100 的 tag。
如果在创建个 network vlan101,eth1 上就会相应的创建多个 vlan interface eht1.101 并连接新的 Linux Bridge “brqYYYY”。
配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 中设置 tenant_network_types 的值为 vlan
配置 vlan 的范围
意思是:配置定义了 lable 为 “default” 的 valn network,valn id 的范围是 3001~4000。这里配置的是普通用户使用的范围。
admin 可以使用 1~4096 的 valn network
再次指定 vlan network 与物理网卡的对应关系
配置子网
查看系统网桥
这里可以看到:
vlan100 对应的网桥为 brq2b85ebb9-a。
vlan interface 是 ens35.100 (我是用的是 Ubuntu 16.04 默认网卡名 ens 开始的。)
DHCP 的 tap 设备是 tapf85d61d8-c3。
在 计算节点查看 网桥信息
可以发现创建的 Instance 已经连接到 vlan100 对应的网桥 brq2b85ebb9-a 上。因为计算节点没有 DHCP 服务所以没有相应的 tap 设备。
另外 网桥的名字与控制节点是一样的,都是 brq2b85ebb9-a6,表示是在同一个 network 上。
下图是我创建 VLAN 后 两台 Instance 分别在控制节点和计算机点的网络图
此时两台 Instance 在同一 valn100 下。相互之间是可以 ping 通的。
如果在创建一个 vlan101。如果两台 Instance1 和 Instance2 分别连在 vlan100 和 vlan101。此时两台 Instance 是不能 ping 通的。
如下图两个 vlan
两台 Instance1 和 Instance2 分别连在 vlan100 和 vlan101。此时两台 Instance 是不能 ping 通的。
因为 vlan 在二层是隔离的。如果想要互通,只能在三层通过路由转发。
1、建立网桥
touch /etc/sysconfig/network-scripts/ifcfg-br0
建立网桥配置文件ifcfg-br0
vi /etc/sysconfig/network-scripts/ifcfg-br0
2、添加网卡到网桥把eth0和eth1两网卡添加到网桥中。修改eth1网卡配置文件vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改eth2网卡配置文件vi /etc/sysconfig/network-scripts/ifcfg-eth2
3. 重启网络服务
service network restart