KVM虚拟机无法访问互联网

KVM虚拟机无法访问互联网

我已设置 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 重启

相关内容