Firewalld 端口转发 Proxmox 使端口无法用于其他连接

Firewalld 端口转发 Proxmox 使端口无法用于其他连接

我有一台由 hetzner 托管的服务器,它有一个公共 IP 地址,运行 proxmox 和一些虚拟机。此 IP 地址在 /etc/interfaces 中配置如下:

auto enp35s0
iface enp35s0 inet static
    address {{my-public-ip}}/{{subnet}}
    gateway {{hetzner-gateway}}
    up route add -net {{hetzner-ip}} netmask 255.255.255.192 gw {{hetzner-gateway}} dev enp35s0

此配置由 hetzner 完成。

因为我不想从 hetzner 获取额外的 IP 地址,所以我将该 IP 伪装成内部 VM 网络:

auto vmbr0
iface vmbr0 inet static
    address 172.16.0.1/24
    bridge-ports none
    bridge-stp off
    bridge-fd 0

    post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
    post-up   iptables -t nat -A POSTROUTING -s '172.16.0.0/24' -o enp35s0 -j MASQUERADE
    post-down iptables -t nat -D POSTROUTING -s '172.16.0.0/24' -o enp35s0 -j MASQUERADE

这样,我的虚拟机就可以访问互联网并互相通信。

因为 iptables 端口转发对我来说有点太复杂了,所以我开始使用防火墙。在那里,我将 enp35s0 接口分配给外部区域,将 vmbr0 分配给受信任区域。我知道也许我应该将它分配给内部区域,但目前这并没有什么区别(或者在我的问题情况下我认为是这样)。

我现在在 IP 为 172.16.0.3 的虚拟机内部运行一个服务,端口为 38080。为了访问此服务,我在 Firewalld 中添加了端口转发规则:port=38080:proto=tcp:toport=38080:toaddr=172.16.0.3。这样,我就可以从这台服务器外部访问该服务。现在的问题是,如果我使用 uptime-kuma 之类的软件,并在同一台物理机上的虚拟机内部运行它,我就无法通过端口 38080 访问该服务,因为端口转发仅针对外部请求进行。这里重要的是,uptime-kuma 使用的主机名是 FQDN,它会解析为我的主机的公网 IP 地址。因此,为了实现这一点,我将相同的端口转发规则添加到 Firewalld 的可信区域,因为我的 vmbr0 接口在那里,请求来自该接口。现在,这个连接可以正常工作,我的软件(uptime-kuma)可以访问我的服务。

现在的大问题是,虚拟网络内部想要使用端口 38080 的每个请求都将被重定向到该虚拟机 (172.16.0.3),即使是那些发往完全不同的服务器的请求。

如果请求实际上针对主机,我怎样才能告诉firewalld仅重定向该流量?

答案1

因此,我找不到解决防火墙行为的办法,但我发现了其他一些让受信任区域中的端口转发规则变得不必要的东西。通过将解析为主机公共 IP 的 FQDN 添加到 VM 内的 /etc/hosts 文件,我不再需要端口转发,因为它会立即再次连接到自身(这正是我最初想要的)。通过使用该端口转发规则,受信任区域内的端口不再需要,我可以再次使用这些端口进行外部请求。

相关内容