用于 VM + 多个静态 IP 的 systemd 桥接

wan*_*son 4 routing ip linux-networking kvm-virtualization systemd

我有一个带有 3 个公共 IP 的 Ubuntu 18.04 服务器。主 IP 已经预先配置。

我想配置IP2和IP3。IP2 用于 SSL 域,IP3 用于虚拟机 (qemu libvirt)。问题(对我来说)是,以前版本的 Ubuntu 使用了 upstart,我能够配置它,但是当前版本有 systemd,我无法解决。

以前我使用以下方法进行配置并且一切正常:https : //wiki.hetzner.de/index.php/Netzkonfiguration_Debian/en#Routed_.28brouter.29

现在,使用 systemd,这是我开始使用的网络配置文件(只有 1 个 IP):

# /etc/systemd/network/10-eno1.network
[Match] 
Name=eno1 

[Network]
Gateway=IP_GATEWAY

[Address] 
Address=IP1
Peer=IP_GATEWAY/32 
Run Code Online (Sandbox Code Playgroud)

添加 IP2(用于 SSL)很容易,因为它只需要在上面的文件中添加一个额外的 [Address] 部分。

至于IP3,我想为了将IP3路由到我的VM,我需要像原始howto一样创建一个网桥。因此,当尝试为 VM 配置 qemu/libvirt 网桥时,我最终得到了与此配置非常相似的内容:https : //bbs.archlinux.org/viewtopic.php?id=193994 ie - br0 device + eno1 添加到网桥+ 像上面一样配置网桥

但是就像在上面的线程中一样,服务器变得无法访问(无法 ping 输入/输出)并且诊断命令的输出几乎相同。

关于如何配置 IP3 以与 VM 一起使用的任何建议?

wan*_*son 5

我设法自己找到了解决方案。我花了太长时间,因为当我在虚拟 KVM 中测试它时,由于某种原因它不起作用。

假使,假设:

  • IP1 - 我服务器的主 IP
  • IP2 - 用于我网站的 SSL 证书的额外 IP
  • IP3 - 用于我的虚拟机的额外 IP
  • eno1 是我的物理以太网接口

在主机上 - 3 个文件:

# /etc/systemd/network/10-virbr1.netdev
[NetDev]
Name=virbr1
Kind=bridge
MACAddress=00:1e:67:ad:8d:12

[Bridge]
STP=false

# /etc/systemd/network/20-eno1.network
[Match]
Name=eno1

[Network]
Bridge=virbr1

# /etc/systemd/network/30-virbr1.network
[Match]
Name=virbr1

[Network]
Gateway=IP_GATEWAY

[Address]
Address=IP1
Peer=IP_GATEWAY/32

[Address]
Address=IP2
Peer=IP_GATEWAY/32
Run Code Online (Sandbox Code Playgroud)

在虚拟机上(一些较旧的 Ubuntu - 不使用 systemd):

# /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address IP3
    netmask 255.255.255.255
    gateway IP_GATEWAY
    pointopoint IP_GATEWAY
    dns-nameservers 8.8.8.8 1.1.1.1
Run Code Online (Sandbox Code Playgroud)

一些额外的解释:MACAddress=00:1e:67:ad:8d:12 是必要的,因为我的托管公司(Hetzner)做了一些 MAC 过滤,所以网桥必须有物理以太网卡的 MAC。

出于同样的原因,VM 需要一些特定的 MAC 地址,您可以在 Hetzner 的服务器控制面板中生成这些地址。因此,在我的情况下,“virsh dumpxml my-vm”的输出如下所示:

...
<interface type='bridge'>
      <mac address='00:50:56:00:53:E1'/>
      <source bridge='virbr1'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
...
Run Code Online (Sandbox Code Playgroud)

  • 嘿,@wanson,非常感谢您分享您的解决方案! (2认同)