与多个子网绑定的KVM桥接器

我可以通过分配给br0:1 213.xxx.xxx.1访问主机,但是213.xxx.xxx.2br0:1上的网桥接口)的VM不起作用。

我必须为第二个子网创build另一个网桥接口,但是bond0已经连接到br0

基本上我怎么能在这种情况下使用虚拟机的第二个子网?

子网:

 213.xxx.xxx.176/28 213.xxx.xxx.0/27 routed via 213.xxx.xx.180 

build立:

EM [1-2]

 # cat /etc/sysconfig/network-scripts/ifcfg-em[1-2] DEVICE="em[1-2]" NAME="bond0-slave[1-2]" BOOTPROTO="none" NM_CONTROLLED="yes" ONBOOT="yes" TYPE="Ethernet" USERCTL=no IPV6INIT=no PEERDNS=no MASTER=bond0 SLAVE=yes 

bond0

 # cat /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE="bond0" NAME="bond0" BOOTPROTO="none" NM_CONTROLLED="yes" ONBOOT="yes" TYPE="Bond" USERCTL="no" IPV6INIT="no" PEERDNS="no" BONDING_OPTS="mode=active-backup miimon=100" BRIDGE=br0 

BR0

 # cat /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE="br0" NAME="br0" BOOTPROTO="none" IPADDR="213.xxx.xxx.180" GATEWAY="213.xxx.xxx.177" NETMASK="255.255.255.240" BROADCAST="213.xxx.xxx.191" NM_CONTROLLED="yes" ONBOOT="yes" TYPE="Bridge" USERCTL="no" IPV6INIT="no" PEERDNS="no" 

BR 0:1

 # cat /etc/sysconfig/network-scripts/ifcfg-br0:1 DEVICE="br0:1" NAME="br0:1" BOOTPROTO="none" IPADDR="213.xxx.xxx.1" NETMASK="255.255.255.224" BROADCAST="213.xxx.xxx.31" NM_CONTROLLED="yes" #ONBOOT="yes" TYPE="Bridge" USERCTL="no" IPV6INIT="no" PEERDNS="no" ONPARENT="yes" 

更新周三1月18日16:25:17 GMT 2017:

 <interface type='bridge'> <mac address='52:54:00:4c:4f:27'/> <source bridge='br0'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> 

更新1月24日星期二11:44:21 GMT 2017:

VMnetworking设置:

 # cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE="Ethernet" BOOTPROTO="none" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" NAME="eth0" DEVICE="eth0" ONBOOT="yes" IPADDR="213.xxx.xxx.2" PREFIX="27" GATEWAY="213.xxx.xxx.177" <-- not sure if this should be 213.xxx.xxx.180 instead?! 

主机上的IPTables:

 # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED ACCEPT all -- 192.168.122.0/24 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:68 # iptables -t nat -nL Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination RETURN all -- 192.168.122.0/24 224.0.0.0/24 RETURN all -- 192.168.122.0/24 255.255.255.255 MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535 MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535 MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24 

它工作时,我设置默认网关为213.xxx.xxx.1在虚拟机(从主机上的br0:1 IP) – 不知道为什么我不能只使用相同的默认网关,如主机(213.xxx.xxx .177)。

我也必须冲洗IPTables,所以我需要找出什么规则是必要的。

我也从VM获取redirect,所以不知道这个configuration是否是最佳的:

 # ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. From 213.xxx.xxx.1: icmp_seq=1 Redirect Host(New nexthop: 213.xxx.xxx.177) From 213.xxx.xxx.1 icmp_seq=1 Redirect Host(New nexthop: 213.xxx.xxx.177) 64 bytes from 8.8.8.8: icmp_seq=1 ttl=47 time=7.26 ms ... 

更新周一1月24日14:49:43 GMT 2017:

我不知道为什么即使br_netfilter模块没有加载,IPTables实际上也会过滤通过网桥的数据包

 # lsmod | grep "br_netfilter"; echo $? 1 # test -d /proc/sys/net/bridge; echo $? 1 

这条规则也没有帮助:

 # iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT 

“回答问题”的解决scheme:

  1. 如果cat /proc/sys/net/ipv4/ip_forward不是1,请确保主机上启用了IP转发,请在本站查看如何更改
  2. 将VM网关更改为vm子网上的主机ip:213.xxx.xxx.1
  3. 修复你的损坏的iptableconfiguration。 iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT看起来不错。 最终将其更改为链接iptables -I FORWARD -s 213.xxx.xxx.0/27 -j ACCEPT (这意味着:接受从vmsnetworking到其他networking的所有stream量)

这个解决scheme的想法是使用你的主机作为虚拟networking的网关。 显然,如果你已经在213.xx0networking上有其他的网关(213.xxx.xx.180),你可以直接从你的vms中使用它。

build议的iptablesconfiguration将允许从VM到外部的stream量。 如果你想允许从外部连接到虚拟机,你必须把规则看起来像iptables -I FORWARD -d 213.xxx.xxx.0/27 -j ACCEPT

build议的解决scheme:请记住,由于提问的方式,这可能只是一团糟。 在现实世界中,如果你有一个pipe理你的两个子网的路由器/防火墙,你应该采取简单的方法: – 路由器/防火墙在每个子网上都有一个IP地址。 它将成为子网中所有主机的网关 – 为每个子网分配一个vlan – 在你的主机上,你将有2个接口和网桥 – 你的vms将在“vms子网”上桥接,并使用防火墙作为网关

这样你就没有疯狂的iptables /别名/转发configuration。 您将在一个子网上有一些主机,在另一个子网上有一些主机,并在防火墙上configuration路由/ acls / nats。 你甚至不应该在“虚拟networking”上给你的主机分配一个IP地址。

在同一个广播域上合并两个networking是一个问题,如果你对networkingconfiguration不是非常自信的话,应该避免在主机上configuration多个IP地址。

维基百科:

计算机networking中的默认网关是假定知道如何将数据包转发到其他networking的节点。

这意味着网关节点必须是networking或子网中的节点。 在一个接口br0 213.xxx.xxx.0/27213.xxx.xxx.176/28上使用两个子网。

在networking213.xxx.xxx.176/28有网关主机213.xxx.xxx.177 。 而你的主机服务器通过这个网关获得互联网访问。 我认为网关主机213.xxx.xxx.177是一个路由器,这个路由器不是子网213.xxx.xxx.0/27成员(节点)。 但它知道子网213.xxx.xxx.0/27可以通过节点213.xxx.xxx.180 (您的主机服务器)访问。

您的VM有错误的网关地址。 如果虚拟机的IP地址为213.xxx.xxx.2/27则虚拟机必须具有来自相同子网213.xxx.xxx.0/27网关地址。 这就是为什么虚拟机必须具有网关地址213.xxx.xxx.1 ,您的主机服务器在br0接口上具有辅助ip地址。

如果要在子网213.xxx.xxx.176/28创build虚拟机,则必须在主机服务器上为其分配相同的网关ip 213.xxx.xxx.177 。 确保这个IP不被使用。

此外:

清除所有在这里描述的iptables规则

在这之前,必须启动iptables服务。 清除后,重新启动iptables服务将清除的规则存储在磁盘上。