加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 如何为2个KVM-Guests分配多个公共IP地址

发布时间:2020-12-13 17:05:20 所属栏目:Linux 来源:网络整理
导读:我是这个问题的新手,我现在试着弄清楚如何通过KVM主机为KVM-guests分配多个公共IP地址.我发现大量的例子如何在运行1个公共IP的情况下进行这样的设置. 这是我的设置: 服务器只有一个NIC / MAC并运行2个KVM-Guest with apache(和其他东西).两个来宾环境都是ub
我是这个问题的新手,我现在试着弄清楚如何通过KVM主机为KVM-guests分配多个公共IP地址.我发现大量的例子如何在运行1个公共IP的情况下进行这样的设置.

这是我的设置:
服务器只有一个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地址获取请求.

我愿意接受任何有效的解决方案.

解决方法

在dom0(例如KVM主机)WAN接口上使用网桥.这需要安装bridge-utils包.由于这是基于Debian的发行版,您可以在/ etc / network / interfaces中配置它:
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主机作为默认网关.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读