为虚拟机分配了第二个公共 IP,但外部无法访问

为虚拟机分配了第二个公共 IP,但外部无法访问

我有一台运行 proxmox 的专用服务器,该服务器具有混合配置、所有 VM 的基于 NAT 的网络配置和路由网络(根据hetzner 文档)(见下文)用于一个特定的 VM。One NIC一个公共主 IP(94.x.x.A)和一个额外订购的第二个公共 IP(94.x.x.B)基本上在同一个接口上。我还有一个虚拟化的 opnsense/pfsense VM,它使用 vmbr10 和 vmbr11 作为 WAN 和 LAN。

auto enp0s31f6
iface enp0s31f6 inet static
  address 94.x.x.A
  netmask 255.255.255.192
  pointopoint 94.x.x.x
  gateway 94.x.x.x
  mtu 1500
  post-up echo 1 > /proc/sys/net/ipv4/ip_forward
  post-up echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
  post-up iptables -t nat -A PREROUTING -i enp0s31f6 -p tcp -d 94.x.x.A -m multiport ! --dport 22,8006,179 -j DNAT --to 10.10.10.2
  post-up iptables -t nat -A PREROUTING -i enp0s31f6 -p udp -d 94.x.x.A -m multiport ! --dport 5405:5412,4789 -j DNAT --to 10.10.10.2
auto vmbr1
iface vmbr1 inet static
   address 94.x.x.A
   netmask 255.255.255.255
   bridge_ports none
   bridge_stp off
   bridge_fd 0
   pre-up brctl addbr vmbr1
   up ip route add 94.x.x.B/32 dev vmbr1
   down ip route del 94.x.x.B/32 dev vmbr1
# BBB
iface vmbr1 inet6 static
   address 2xxx:x:x:x::10
   netmask 64
# BBB IPv6


auto vmbr10
iface vmbr10 inet static
        address 10.10.10.1/29
        bridge-ports none
        bridge-stp off
        bridge-fd 0
        post-up   iptables -t nat -A POSTROUTING -s '10.10.10.2/32' -o enp0s31f6 -j SNAT --to-source 94.x.x.A
        post-down iptables -t nat -D POSTROUTING -s '10.10.10.2/32' -o enp0s31f6 -j SNAT --to-source 94.x.x.A
        post-up   iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
        post-down iptables -t raw -D PREROUTING  -i fwbr+ -j CT --zone 1
# OPNSense WAN - Proxmox LAN

iface vmbr10 inet6 static
        address 2xx:x:x:x::3/125
        up ip route add ...


auto vmbr11
iface vmbr11 inet manual
        bridge-ports none
        bridge-stp off
        bridge-fd 0
# VM Net

现在我创建了另一个 linux 桥 (vmbr1),并将这个带有 Big Blue Button 的 VM 移出 vmbr11,不再通过 opnsense/pfsense,我真的很想将所有内容转发给它。Iptables 绝对不应该关心任何事情,盲目地将到达第二个公共 IP 的所有内容转发94.x.x.B到我的本地 BBB VM。因此,VM 本身直接连接到互联网。它基本上拥有该 IP。使用当前设置,一切似乎都正常工作,但只有当我连接到我的 VPN(该主机上的 vmbr11 内的 vpn)时,才能正常工作,因此与 vmbr1 和 BBB VM 的连接才能正常工作,我可以启动会话,麦克风/网络摄像头可以正常工作。此外,BBB 检查工作正常:

docker exec -it bbb-docker-greenlight-1 bundle exec rake conf:check

Checking environment: Passed
Checking Connection: Passed
Checking Secret: Passed
Checking SMTP connection: Passed

curl --trace-ascii - -k https://94.x.x.B:443/bigbluebutton/api显示success答复。

所以到目前为止,我想说,docker 部署和 BBB 的设置/配置是成功的。现在,当我尝试从互联网(未连接到 vpn)访问 url 时,浏览器无法打开页面,根本无法访问。我禁用了 proxmox 防火墙,但没有帮助。我也无法bbb.my-domain.com从外部 ping 或 IP,尽管 ping 命令解析为正确的 IP。我想我正在访问正确的服务器,但是文件上缺少一个小东西/etc/network/interfaces

有谁知道缺少了什么才能使其在互联网上可用?

答案1

我不确定您当前的设置具体如何工作,所以我只写下我自己的设计,看看它是否有帮助。

首先,假设你有 VM 的感觉似乎为了充当大多数虚拟机的(默认)网关,在主机端(proxmox),物理网卡应该被从属于“WAN 桥接器”(即成为其桥接端口),感知虚拟机连接到其他虚拟机所连接的“WAN 桥接器”和“LAN 桥接器”。

通过这样的设置,所有 IP 配置都应在虚拟机内部完成(包括感知虚拟机的 WAN/公共 IP 和 LAN/私有 IP)。主机端的任何接口都不应进行任何 IP 配置。物理 NIC 和两个网桥应仅处于“启动”状态。(如果您想允许主机和虚拟机之间的通信,您可以在 LAN 网桥上分配 LAN/私有 IP,但不应将该 IP 用作虚拟机上的默认网关,否则感知虚拟机将毫无意义。)

当然,这种设置的问题在于,主机本身由于没有公网 IP,所以无法连接互联网。除非

  1. 您有一个额外的公共 IP,您可以在“WAN 桥接器”上分配它,或者
  2. 添加使用感知虚拟机的“LAN IP”作为网关的默认路由

现在,由于您确实有一个额外的公共 IP,并且您的“新”目标是将其用作某个特定 VM 的某种“DMZ”,因此,除非有某些特殊原因导致您不希望从主机本身到 Internet 的任何流量使用该额外的公共 IP(而是分配给感知 VM 的另一个 IP)作为其源 IP,否则选项 1 是可行的方法。

请注意,是否需要新的网桥(在这种情况下,需要新的私有 IP 子网)完全取决于您是否希望该虚拟机与其他虚拟机隔离(在 L2 上)。如果不是,它可以保持连接到同一个网桥。(只需确保 LAN 网桥具有私有 IP,并且该虚拟机使用该 IP 而不是感知虚拟机的 LAN IP 作为其默认网关。)

PS 如果您需要 proxmox 主机本身使用分配给 sense VM 的公共 IP 来访问 Internet,同时又需要为“该 VM”设置“DMZ”,则可能需要使用 设置基于源的路由ip rule,这样来自该 VM 的流量就可以查找具有默认路由的备用路由表,该路由使用“WAN 桥”和公共 IP 对应的“公共网关”,而流量起源从主机本身可以查找具有默认路由的主表,该表使用感知虚拟机作为默认网关,就像上面提到的其他虚拟机一样。


在此处输入图片描述

(当然,应该在 Proxmox 上为特殊 VM(即私有 IP Z 或 S)设置 SNAT,以便来自 VM 的“活动”流量能够“工作”。)

答案2

我终于成功了,因此我在这里总结了所有内容,这有助于我让基于 Docker 的 BigBlueButton 在 Proxmox VM 上运行。我花了很多时间让它工作,你也不必这样。我首先尝试在 NAT 后面运行,使用 opnsense/pfsene(1:1 NAT + 反射等),尝试了所有方法,但都没有成功。要么是检查失败,要么是麦克风/网络摄像头不工作。现在一切都正常了。

以下 Hetzner 文档至关重要,我对我的 Proxmox Host 和 Rocky Linux VM 使用了路由配置:

我发现它们之间存在一些差异(基于 CentOS 的文档缺少GATEWAYGuest 部分的条目,而 Debian 文档包含pre-up brctl addbr virbr1host 部分的条目)。您肯定需要该GATEWAY条目,我无法说它是否brctl addbr ...在做一些重要的事情,还没有添加它。我想说,根据其中的信息坚持使用社区文档是您最好的选择。

  1. 从您的提供商处订购第二个公共 IP,并像文档中一样设置主机和客户机(请小心,仔细观察不要犯子网、网关、点对点等条目的错误)。这实际上会将第二个公共 IP 分配给您的 VM。这意味着,我仍然使用 NAT 等作为我的主 IP。这个新 IP 不会通过 NAT,它绑定到新的 Linux 桥并直接通向您的 VM。重要提示:请注意不要使用任何post-up iptables -t nat -A PREROUTING -i enp0s31f6 -d 94.x.x.B -j DNAT --to x.x.x.x会拦截您的流量并将其 DNAT 到其他地方的东西。
  2. 配置虚拟机的防火墙
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --permanent --zone=public --add-port=16384-32768/udp
firewall-cmd --reload
  1. 按照以下说明部署和配置 BBBhttps://github.com/bigbluebutton/docker
# used the following settings
greenlight: y
https proxy: n
coturn: n
...

附注:可以在 greenlight 容器内找到日志:/usr/src/app/log/production.log

  1. 为了使用我自己的 SSL 证书,我添加了一个额外的 nginx 容器,我可以轻松地将其配置为反向代理,以使用我的 SSL 证书并通过 代理到 BBB proxy_pass http://127.0.0.1:48087;。我在文档中找不到任何官方信息,说明如何重新配置​​现有的 nginx 以使用我自己的证书。我不想在其中修补任何东西,因为这可能会在升级 BBB 时轻易损坏或导致任何问题。我知道这不是那么漂亮,但您可以尝试重新配置现有的 nginx/greenlight,无论需要什么,如果它有效,请告诉我们。

  2. TODO:仍然缺少用于登录的 fail2ban

就是这样,使用以下检查:

curl --trace-ascii - -k https://94.x.x.B:443/bigbluebutton/api
docker exec -it bbb-docker-greenlight-1 bundle exec rake conf:check

以上两个步骤都应该成功。现在您的 BigBlueButton 应该可以正常工作了。

相关内容