这是我的设置:
服务器只有一个NIC / MAC并运行2个KVM-Guest with apache(和其他东西).两个来宾环境都是ubuntu服务器11.10,必须在不同的VM中运行. 5个公共IP地址用于处理SSL证书和其他东西.第一个VM应该使用5个地址/证书中的3个.剩下的就是第二台VM了. apache-stuff配置正确.
我已经通过iptables尝试了许多不同的方法来将流量从主机NIC路由到guest-NIC.尽管有一种方法是正确的,但只是错误的实施,我将细节留给你,让你无可挑剔.问题是:应该做的理想方式是什么?
应满足以下条件:
> Apache必须获取访问者的原始IP地址
> Apache必须知道,使用正确的ssl-vhost使用了哪些public-ip地址
>不得通过主机上的(反向)代理路由流量,因为在其他VM-guest上还有其他2个非http服务,应该可以从公共访问.并且:只有sshd应该直接在主机上听 – 没有别的
>每个VM都应该能够直接访问互联网.
>数据中心的网络基于MAC切换.正如我所知,与互联网通信的唯一方法是通过eth0及其MAC地址.
如果我放弃所有虚拟化的东西,这将非常简单,因为apache直接从特定的ip地址获取请求.
我愿意接受任何有效的解决方案.
解决方法
iface eth0 inet manual auto br_wan iface br_wan inet dhcp # Assuming DHCP to get address,otherwise migrate all WAN connection options here #address 192.168.122.0 bridge_ports eth0 tap_guest1 bridge_stp off bridge_maxwait 0 bridge_fd 0 pre-up ip tuntap add dev tap_guest1 user guest1 mode tap # This command is required if your ISP allocates static IPs depending on MAC address # You shouldn't use this but might be handy some time #pre-up sysctl -q -w net/ipv4/conf/tap_guest1/proxy_arp=1 post-down ip tuntap del tap_guest1 mode tap
预升级命令设置TAP接口以将KVM来宾连接到网桥.请注意,此设置允许从非特权用户guest1运行kvm.请注意,使用sysctl设置net.ipv4.ip_forward = 1可能也很有用.
我从iproute2包中使用了ip tuntap命令.它尚未在Debian软件包中记录,但很快将在上游的手册页中提供.由于此软件包安装在每个基于Debian的服务器上,因此您无需安装uml-utilities或openvpn软件包即可创建这些接口.
这种方法确实缺乏管理大量分接接口的优雅,因为您需要创建类似于tap_guest1接口的预备和下行线路.这可以通过在/etc/network/pre-up.d和/etc/network/post-down.d中编写其他脚本来解决.如果要在KVM来宾仍在运行时使用ifdown / ifup脚本重新配置br_wan接口,这也是一个问题 – 您需要从桥接配置中删除除eth0之外的所有接口并手动将它们从桥接器中分离(不要忘记在桥重新配置之后将它们连接回来)或关闭桥上运行的所有KVM实例.
另一种可能更干净的方法是为KVM本身编写自定义ifup脚本,并在NIC的脚本选项中使用它.你可以在/ etc / qemu-ifup中得到一个例子.有关详情,请参见kvm manual page.
然后你可以像这样运行你的KVM盒子:
kvm -net nic,model=virtio,macaddr=12:34:56:78:9a:bc \ -net tap,ifname=tap_guest1,script=no,downscript=no \ -boot c -nographic -display none -daemonize \ guest1-drive.qcow2
可以使用命令手动在KVM guest虚拟机的一个接口上设置多个IP地址
ip address add aaa.bbb.ccc.101/24 dev eth0
或永久在/ etc / network / interfaces中,如下所示:
auto eth0 eth0:1 iface eth0 inet static address aaa.bbb.ccc.100 network aaa.bbb.ccc.0 netmask 255.255.255.0 broadcast aaa.bbb.ccc.255 gateway aaa.bbb.ccc.1 iface eth0:1 inet static address aaa.bbb.ccc.101 network aaa.bbb.ccc.0 netmask 255.255.255.0 broadcast aaa.bbb.ccc.255 gateway aaa.bbb.ccc.1
请注意,如果您的数据中心/提供商不希望您在同一网络上显示其他框,则可能无法配置它们并且它们将不可用.在这种情况下,您可能希望创建内部网桥并使用iptables在WAN接口和此网桥之间使用DNAT和SNAT转发数据包.假设您的本地虚拟网桥是10.0.0.0/8,您的guest1是10.0.0.2,您需要这样:
iptables -t nat -A PREROUTING --dst aaa.bbb.ccc.100 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2 iptables -t nat -A PREROUTING --dst aaa.bbb.ccc.101 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2 ... iptables -t nat -A POSTROUTING -p tcp --dst 10.0.0.2 -j SNAT --to-source aaa.bbb.ccc.100
请注意,您需要尽可能多的DNAT命令作为每个KVM访客的外部IP,但只有一个SNAT规则可以访问互联网.此外,只允许所需的端口,您只能允许HTTP / HTTPS / SSH流量.如果省略–dport语句,则将转发所有端口.除非您愿意托管DHCP服务器,否则您的KVM来宾应具有静态网络设置,并将KVM主机作为默认网关.