我可以通过213.xxx.xxx.1
分配给访问主机br0:1
,但带有213.xxx.xxx.2
桥接接口的虚拟机br0:1
不起作用。
我是否必须为第二个子网创建另一个桥接接口,但此时bond0
已经连接了br0
?!
基本上,在这种情况下我如何使用虚拟机的第二个子网?
子网:
213.xxx.xxx.176/28
213.xxx.xxx.0/27 routed via 213.xxx.xx.180
设置:
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"
br0: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"
更新时间:2017 年 1 月 18 日星期三 16:25:17 GMT:
<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>
更新时间:2017 年 1 月 24 日星期二 11:44:21 GMT:
虚拟机网络设置:
# 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
当我在 VM 上将默认网关设置为 213.xxx.xxx.1(主机上的 br0:1 的 IP)时,它可以工作 - 不确定为什么我不能只使用与主机(213.xxx.xxx.177)相同的默认网关。
我还必须清除 IPTables,因此我需要找出必要的规则。
我从 VM 执行 ping 操作时也遇到了重定向,因此不确定此配置是否最佳:
# 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
...
更新时间:2017 年 1 月 24 日星期二 14:49:43 GMT:
我不确定为什么 IPTables 实际上会过滤穿越网桥的数据包,即使br_netfilter
模块没有加载
# lsmod | grep "br_netfilter"; echo $?
1
# test -d /proc/sys/net/bridge; echo $?
1
这条规则也没有帮助:
# iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
答案1
“回答问题”的解决方案:
- 确保主机上启用了 IP 转发,如果
cat /proc/sys/net/ipv4/ip_forward
不是 1,请查看此网站了解如何更改它 - 将虚拟机网关更改为虚拟机子网上的主机 ip:213.xxx.xxx.1
- 修复损坏的 iptable 配置。
iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
看起来不错。最后将其更改为某个链接iptables -I FORWARD -s 213.xxx.xxx.0/27 -j ACCEPT
(这意味着:接受从 vms 网络到另一个网络的所有流量)
此解决方案的理念是使用您的主机作为虚拟机网络的网关。显然,如果您在 213.xx0 网络上已有其他网关(213.xxx.xx.180),则可以直接从虚拟机使用它。
建议的 iptables 配置将允许从虚拟机到外部的流量。如果你想允许从外部到虚拟机的连接,你必须制定一条规则,如下所示iptables -I FORWARD -d 213.xxx.xxx.0/27 -j ACCEPT
推荐的解决方案:请记住,由于问题的提出方式,所有这些可能只是一团糟。在现实世界中,如果您有一个管理两个子网的路由器/防火墙,您应该采取简单的方法:- 路由器/防火墙将在每个子网上都有一个 IP 地址。它将成为子网中所有主机的网关 - 为每个子网分配一个 VLAN - 在您的主机上,您将有 2 个接口和两个网桥 - 您的虚拟机将在“虚拟机子网”上桥接并使用防火墙作为网关
这样,您就不会有疯狂的 iptables / 别名 / 转发配置。您将在一个子网上拥有一些主机,在另一个子网上拥有其他主机,并在防火墙上配置路由 / acls / nats。您甚至不应该在“vm 网络”上为您的主机分配 IP 地址。
合并同一个广播域上的两个网络是问题的根源,如果您对网络配置不是很有信心,应该避免在主机上配置多个 IP 地址。
答案2
来自维基百科:
计算机网络中的默认网关是假定知道如何将数据包转发到其他网络的节点。
这意味着网关节点必须是网络或子网中的节点。您可以在一个接口上使用两个子网br0
213.xxx.xxx.0/27
。213.xxx.xxx.176/28
213.xxx.xxx.177
网络中有网关主机213.xxx.xxx.176/28
。您的主机服务器通过此网关访问互联网。我认为网关主机213.xxx.xxx.177
是路由器,而此路由器不是子网的成员(节点) 。但它知道可以通过节点(您的主机服务器)访问213.xxx.xxx.0/27
子网。213.xxx.xxx.0/27
213.xxx.xxx.180
您的虚拟机网关地址错误。如果虚拟机有 IP 地址,213.xxx.xxx.2/27
则虚拟机必须有来自同一子网的网关地址213.xxx.xxx.0/27
。这就是为什么虚拟机必须有网关地址213.xxx.xxx.1
,主机服务器在br0
接口上将其作为辅助 IP 地址。
如果您要在子网中创建虚拟机,213.xxx.xxx.176/28
则必须在其上分配与主机服务器相同的网关 IP 213.xxx.xxx.177
。确保此 IP 未被其他任何地方使用。
此外:
清除所有 iptables 规则,具体说明如下这里
执行此操作之前必须启动 iptables 服务。清除后重新启动 iptables 服务以将清除的规则存储在磁盘上。