我有一台运行 KVM 的机器,并在 eth0 上设置了一台桥接器,该桥接器具有该机器的 IP 地址。该机器的 IP 地址处于一个范围内,没有其他可用的 IP 地址。我正在尝试为 KVM 客户端创建第二个子网,以供其 IP 地址使用。
network -- eth0 --- bridge0 --|
(x.x.x.75/26) |-- guest0:eth0 (x.x.y.213/28)
|
|-- guest1:eth0 (x.x.y.214/28)
我通过在主机上创建 ifcfg-bridge0 文件来创建桥接,它通常似乎可以正常工作,但是我无法从外部世界启动与客户机的连接。奇怪的是,客户机可以访问互联网,因此返回的数据包显然可以到达目的地,但无法建立新的连接。这种情况的示例是,如果我使用 VNC 连接到其中一个客户机,我可以执行wget http://google.com/
并获取页面。
主机和客户机上的 iptables 都已刷新,因此没有 iptables 规则。在主机上,route 命令的输出为
host# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
x.x.x.64 0.0.0.0 255.255.255.224 U 0 0 0 bridge0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
169.254.0.0 0.0.0.0 255.255.0.0 U 1004 0 0 bridge0
0.0.0.0 x.x.x.94 0.0.0.0 UG 0 0 0 bridge0
为了让路由正常工作,我尝试使用以下命令在桥接器上添加一条到新子网的静态路由route add --net x.x.y.208 netmask 255.255.255.240 bridge0
。添加路由后,主机上的路由表如下所示
host# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
x.x.y.208 0.0.0.0 255.255.255.240 U 0 0 0 bridge0
x.x.x.64 0.0.0.0 255.255.255.224 U 0 0 0 bridge0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
169.254.0.0 0.0.0.0 255.255.0.0 U 1004 0 0 bridge0
0.0.0.0 x.x.x.94 0.0.0.0 UG 0 0 0 bridge0
但是,主机仍然无法访问客户机。如果我对客户机进行跟踪路由,则看不到连接出去,我只是看到
host# traceroute x.x.y.213
traceroute to x.x.y.213, 30 hops max, 60 byte packets
1 x.x.y.213 0.639 ms 0.771 ms 0.784 ms
但是当我尝试连接到机器(例如telnet x.x.y.213 22
)时,我没有连接(相比之下,在客户机上如果我运行telnet x.x.y.213 22
或telnet x.x.x.75 22
得到结果)。
答案1
如果两个子网(/28 和 /26)都桥接到同一个接口,那么您需要上游网络上两个网络中的地址(即路由器上整个网络的辅助地址)。
可以将网桥上的虚拟主机想象成与主机的 NIC 连接到同一个交换机。主机(即 bridge0)位于不同的 IP 子网中,这意味着两者之间需要某种网关。
两个选项 - 将所有主机重新编号到同一个网络中或在两者之间提供某种路由接口。