我已设置 KVM 以在专用服务器 (CentOS 6.3) 上运行虚拟机 (Windows Home Server 2011 充当构建代理)。最近,我在主机上运行了更新,虚拟机现在无法连接到互联网。
虚拟网络通过 NAT 运行,主机有一个设置了静态 IP 的接口(eth0:0)(virt-manager 正确显示网络及其 IP),并且到该 IP 的所有连接都应发送给客户机。
主机和客户机可以互相 ping 通,但客户机无法 ping 通主机上方的任何内容,我也无法从其他任何地方 ping 客户机(我可以 ping 通主机)。从客户机到我控制下的另一台服务器的结果以及从外部系统到客户机的结果都返回“目标端口不可达”。在主机和目标上运行 tcpdump 显示主机回复了 ping,但目标从未看到它(看起来主机甚至根本不想发送它,这让我怀疑 iptables)。ping 输出与此匹配,列出了来自 192.168.100.1 的回复。
客人能但是,解析 DNS,我觉得这很奇怪。客户机的网络设置(连接 TCP/IPv4 属性)设置为静态本地 IP(192.168.100.128),掩码为 255.255.255.0,网关和 DNS 为 192.168.100.1。
最初设置 vm/net 时,我设置了一些 iptables 规则来启用桥接,但是在我的托管公司抱怨桥接之后,我使用 NAT 设置了一个新的虚拟网络,并且相信我删除了所有规则。
虚拟机的网络在过去几个月里一直运行良好,直到昨天。我没有收到托管公司的任何消息,也没有对客户机进行任何更改,因此据我所知,其他一切都没有改变(不幸的是,更新的软件包列表已经从回滚列表中消失了,我没有记下来)。
更新:
iptables -L
:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:bootps
ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
ACCEPT tcp -- main-domain anywhere tcp dpt:mysql
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 192.168.100.0/24 state RELATED,ESTABLISHED
ACCEPT all -- 192.168.100.0/24 anywhere
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
ACCEPT all -- anywhere 192.168.100.128
ACCEPT all -- anywhere guest-subdomain
iptables -t nat -L
:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT all -- anywhere guest-subdomain to:192.168.100.128
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE tcp -- 192.168.100.0/24 !192.168.100.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192.168.100.0/24 !192.168.100.0/24 masq ports: 1024-65535
MASQUERADE all -- 192.168.100.0/24 !192.168.100.0/24
SNAT all -- 192.168.100.128 anywhere to:guest-ip
答案1
FORWARD 链中的以下几行:
ACCEPT all -- anywhere 192.168.100.128
ACCEPT all -- anywhere guest-subdomain
应该前拒绝规则。例如:
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 192.168.100.128
ACCEPT all -- anywhere guest-subdomain
ACCEPT all -- anywhere 192.168.100.0/24 state RELATED,ESTABLISHED
ACCEPT all -- 192.168.100.0/24 anywhere
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
您可以删除它们并使用以下内容在顶部插入规则。
iptables -I FORWARD -d guest-subdomain -j ACCEPT
iptables -I FORWARD -d 192.168.100.128 -j ACCEPT
而且由于您已经有 MASQUERADE 规则,因此 SNAT 规则是多余的。
答案2
重新启动 libvirtd 可能会有帮助..我曾经遇到过同样的问题,并且刚刚重新启动了 libvirtd。对应于 libvirtd 的 iptables 规则再次设置,我可以 ping 外面的世界。
sudo 服务 libvirtd 重启