Proxmox 連接埠轉送到 NAT 後面的容器

Proxmox 連接埠轉送到 NAT 後面的容器

我們最近從 Hetzner 伺服器拍賣中購買了一台伺服器,並希望遷移我們以前的根伺服器。以前我們只使用 Windows 伺服器,但現在我們想使用 proxmox 將其設定得更模組化。

我們有一個公用 IP 位址,因此我們選擇使用具有 10.0.0.0/24 內部子網路的 NAT。

容器可以訪問互聯網,所以效果很好。

但是我們無法透過自訂連接埠連接到在容器內運行的伺服器。

如何正確轉送連接埠?我們嘗試瞭如下所列的路由和連接埠轉送。出現問題,連接埠未打開,如連接埠掃描所示。目前Proxmox主機中只有一個防火牆,伺服器主機防火牆已停用,所以我不知道為什麼要阻止流量。

這是 proxmox 網路介面的目前設定:

auto lo
iface lo inet loopback

iface lo inet6 loopback

auto eno1
iface eno1 inet static
        address public.ipv4/26
        gateway public.gateway
        up route add -net public.ipv4 netmask 255.255.255.192 gw public.ipv4 dev eno1
# route public.ipv4.range.start/26 via public.ipv4.range.start+1

iface eno1 inet6 static
        address public.ipv6/128
        gateway fe80::1

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

        post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up echo 1 > /proc/sys/net/ipv4/conf/eno1/proxy_arp
        post-up iptables -t nat -A POSTROUTING -s '10.0.0.0/24' -o eno1 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '10.0.0.0/24' -o eno1 -j MASQUERADE
        post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 28967 -j DNAT --to 10.0.0.4:28967
        post-up iptables -t nat -A PREROUTING -i vmbr0 -p udp --dport 28967 -j DNAT --to 10.0.0.4:28967
        post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 28967 -j DNAT --to 10.0.0.4:28967
        post-down iptables -t nat -D PREROUTING -i vmbr0 -p udp --dport 28967 -j DNAT --to 10.0.0.4:28967

iface vmbr0 inet6 static
        address public.ipv6+1/64

iptables -L -t nat:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             anywhere             tcp dpt:28967 to:10.0.0.4:28967
DNAT       udp  --  anywhere             anywhere             udp dpt:28967 to:10.0.0.4:28967

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  10.0.0.0/24          anywhere   

eno1 介面是由安裝腳本自動產生的。我們新增了網橋和 NAT 等。

客戶端配置:

auto lo
iface lo inet loopback
iface lo inet6 loopback

auto eth0
iface eth0 inet static
        address 10.0.0.4/24
        gateway 10.0.0.1

客戶端容器目前沒有防火牆。

我們對 KWM 主機內部的網路相對缺乏經驗,因此非常感謝任何幫助!

答案1

我們想出了一些辦法,我會將其發佈在這裡,以防它對任何人有用。 (免責聲明:我們經過數小時的反覆試驗才將其組合在一起,這可能只適用於我們的託管提供者。無論如何,我都不是 Linux 網路專家。)

/etc/network/interfaces

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback
iface lo inet6 loopback

auto eno1
iface eno1 inet static
    address <hostpublicip>/26
    gateway <hostgateway>
    up route add -net <hostgateway-1> netmask 255.255.255.192 gw <hostgateway> dev eno1
    post-up echo 1 > /proc/sys/net/ipv4/ip_forward # add this line

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

    post-up iptables -t nat -A POSTROUTING -s '10.0.0.0/24' -o eno1 -j MASQUERADE
    post-down iptables -t nat -D POSTROUTING -s '10.0.0.0/24' -o eno1 -j MASQUERADE
    post-down iptables -t nat -F
    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

eno1 介面已由我們的託管提供者的安裝腳本設定(赫茨納),我們新增了該post-up行以在啟動時啟用 IP 轉送。
我們在proxmox中建立了vmbr0介面並設定了子網路位址,您可以選擇您喜歡的任何位址範圍。我們選擇了 10.0.0.0/24。然後您需要根據我們上面的範例更改文件條目。這些線路是必需的(當然 IP 除外)。如果有任何 ipv6 接口,請保留它們。

現在,當您建立容器/虛擬機器時,您需要將 IPv4 位址設定為靜態並選擇適合您的子範圍 ( 10.0.0.xxx/24) 的位址,並將網關設定為10.0.0.1

所有連接埠轉送都在文件中定義/etc/network/interfaces.d/port_forwards(需要由使用者創建,該路徑中的所有文件都使用該行加載到上面的主文件中source)。連接埠轉送中的 IP 位址是您在建立容器時指派給容器的 IP 位址。

# your network interface
iface vmbr0 inet static
    # minecraft container as example
    post-up port_forward -t 10.0.0.201 -p tcp -d 22     -s 22201 # external port 22201 for direct ssh to container
    post-up port_forward -t 10.0.0.201 -p tcp -m -d 25566,25576
    post-up port_forward -t 10.0.0.201 -p udp -m -d 25566,25576
    # follow with all the port forwards you need

透過呼叫自訂連接埠轉送腳本,port_forward該腳本僅縮寫iptables命令以保持檔案可讀。該文件必須放置或連結到,/bin/以便在安裝使用者分割區之前載入它。

#!/bin/bash
# abbr for iptables dnat

usage() { echo "Usage: $0 -t <container_ip> -p <tcp/udp/etc> -d <port> [-s <external port if different>] [-m flag if ports will be comma separated list, not compatible with -s]" 1>&2; exit 0; }

while getopts t:p:d:s::m flag
do
    case "${flag}" in
        t) target_ip=${OPTARG};;
        p) protocoll=${OPTARG};;
        d) dest_port=${OPTARG};;
        s) src_port=${OPTARG};;
        m) multiport=1 ;;
        *) usage ;;
    esac
done

if [[ -z "$src_port" ]]; then
    src_port="$dest_port"
fi

if [[ "$multiport" -eq 1 ]]; then
    iptables -t nat -A PREROUTING -i eno1 -p "$protocoll" -m multiport --dports "$dest_port" -j DNAT --to "$target_ip"
else
    iptables -t nat -A PREROUTING -i eno1 -p "$protocoll" --dport "$src_port" -j DNAT --to "$target_ip":"$dest_port"
fi

每次更改檔案時,都需要重置 iptables,如下所示:

iptables --flush
iptables -t nat --flush
iptables --delete-chain
ifreload --all

這也可以放在一個文件中,我們將其命名reload_network並將其放在/usr/local/bin/資料夾中以作為命令存取。

相關內容