Iptables

Firewalld 埠轉發 Proxmox 使埠無法用於其他連接

  • October 20, 2021

我有一個由 hetzner 託管的伺服器,它有一個執行 proxmox 和一些虛擬機的公共 IP 地址。這個 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 埠轉發對我來說有點太複雜了,所以我開始使用 firewalld。在那裡,我將 enp35s0 介面分配給外部區域,並將 vmbr0 分配給受信任。我知道也許我應該將它分配給 internal 但目前它並沒有真正產生影響(或者我認為在我的問題案例中是這樣)。

我現在有一個在 ip 172.16.0.3 在埠 38080 上執行的服務。為了訪問這個服務,我在 firewalld 中添加了一個埠轉發規則:port=38080:proto=tcp:toport=38080:toaddr=172.16.0.3. 這樣我就可以從這台伺服器機器之外訪問該服務。現在的問題是,如果我使用像 uptime-kuma 這樣的軟體並在同一台物理機器上的 VM 中執行它,我無法在埠 38080 上訪問該服務,因為埠轉發僅針對外部請求進行。重要的是,uptime-kuma 使用的主機名是解析為我的主機的公共 IP 地址的 FQDN。因此,為了使這成為可能,我將相同的埠轉發規則添加到 firewalld 的受信任區域,因為我的 vmbr0 介面在那裡,並且來自該介面的請求。現在這個連接確實有效,我的軟體(uptime-kuma)可以訪問我的服務。

現在最大的問題是,來自虛擬網路內部的每個想要使用埠 38080 的請求都會被重定向到該 VM(172.16.0.3),即使是那些轉到完全不同的伺服器的請求。

如果請求實際上是針對主機的,我如何告訴 firewalld 僅重定向該流量?

所以我真的找不到解決防火牆行為的方法,但我發現了其他一些東西,使得可信區域中的埠轉發規則變得不必要。通過將解析為主機公共 IP 的 FQDN 添加到 VM 內的 /etc/hosts 文件中,我不再需要埠轉發,因為它會立即再次連接到自身(這是我首先想要的)。通過在受信任區域內使用該埠轉發規則,不再需要,我可以再次將這些埠用於外部請求。

引用自:https://serverfault.com/questions/1080546