我有 Ubuntu 14.04(64 位)+ KVM 主机,带有 2 个 NIC:
- eth0 连接到“公共”网络
- eth1 连接到具有私有 IP 地址范围的 br0 网桥
从主机我可以访问互联网,ping VM Guest 并通过 SSH 连接到它。
从 VM Guest 我只能 ping 主机,但无法访问互联网,也无法 ping google.com
请帮助我按照下述设置将 VM Guest 连接到互联网:
在主机上:
/etc/网络/接口
自动档 iface lo inet 环回 自动 eth0 iface eth0 inet 静态 地址 192.168.2.60 网络掩码 255.255.255.0 网关 192.168.2.254 dns 名称服务器 8.8.8.8 自动 eth1 iface eth1 inet 手册 自动 br0 iface br0 inet 静态 地址 10.0.0.1 网络掩码 255.255.255.0 bridge_ports eth1 bridge_stp 关闭 bridge_maxwait 0 bridge_fd 0 # 自动创建和销毁桥梁。 预先 brctl addbr br0 ip 链路设置 dev br0 up 发布 /usr/sbin/brctl setfd br0 0 addif br0 eth1 后关闭 brctl delbr br0
KVM网络定义为:
<network>
<name>br0-net</name>
<uuid>9d24b473-0b4d-4cfa-8b12-7bf267d856ae</uuid>
<forward mode='bridge'/>
<bridge name='br0'/>
</network>
# sysctl -p /etc/sysctl.conf
net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0
# 路线 -n
内核 IP 路由表 目标网关 Genmask 标志 指标参考使用 Iface 0.0.0.0 192.168.2.254 0.0.0.0 UG 0 0 0 eth0 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 br0 192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
# iptables -t nat -vnL
链 PREROUTING(策略接受 0 个数据包,0 字节) pkts 字节数 目标 协议 选择加入 退出 源 目标 链输入(策略接受 0 个数据包,0 字节) pkts 字节数 目标 协议 选择加入 退出 源 目标 链输出(策略接受 0 个数据包,0 字节) pkts 字节数 目标 协议 选择加入 退出 源 目标 链 POSTROUTING(策略接受 0 个数据包,0 字节) pkts 字节数 目标 协议 选择加入 退出 源 目标
在虚拟机客户机上:
/etc/网络/接口
自动档 iface lo inet 环回 自动 eth0 iface eth0 inet 静态 地址 10.0.0.11 网络掩码 255.255.255.0
Guest xml 定义为
<interface type='bridge'>
<mac address='52:54:00:6b:93:69'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</interface>
# 路线 -n
内核 IP 路由表 目标网关 Genmask 标志 指标参考使用 Iface 0.0.0.0 10.0.0.1 0.0.0.0 UG 0 0 0 eth0 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
# iptables -t nat -vnL
链 PREROUTING(策略接受 0 个数据包,0 字节) pkts 字节数 目标 协议 选择加入 退出 源 目标 链输入(策略接受 0 个数据包,0 字节) pkts 字节数 目标 协议 选择加入 退出 源 目标 链输出(策略接受 0 个数据包,0 字节) pkts 字节数 目标 协议 选择加入 退出 源 目标 链 POSTROUTING(策略接受 0 个数据包,0 字节) pkts 字节数 目标 协议 选择加入 退出 源 目标
从 Guest ping KVM Host 对于 10.0.0.1 和 192.168.2.60 有效:
$ ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84)字节数据。 来自 10.0.0.1 的 64 字节:icmp_seq=1 ttl=64 时间=0.555 毫秒
$ ping 192.168.2.60
PING 192.168.2.60 (192.168.2.60) 56(84) 字节数据。 来自 192.168.2.60 的 64 字节:icmp_seq=1 ttl=64 时间=0.772 毫秒
从 Guest ping 另一台计算机 192.168.2.3 不起作用:
--- 192.168.2.3 ping 统计 --- 已发送 277 个数据包,已接收 0 个数据包,100% 数据包丢失,耗时 276399 毫秒
从访客 Ping google.com 不起作用:
ping:未知主机 google.com
答案1
我认为你缺少一个用于伪装的 iptable 规则
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE