NAT 背後のコンテナへの Proxmox ポート転送

NAT 背後のコンテナへの Proxmox ポート転送

最近、Hetzner サーバー オークションからサーバーを購入し、以前のルート サーバーを移行したいと考えています。以前は Windows サーバーのみを使用していましたが、今後は proxmox を使用して、よりモジュール化された設定にしたいと考えています。

パブリック IP アドレスは 1 つしかないため、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 インターフェイスがある場合は、そのままにしておきます。

ここで、コンテナ/VM を作成するときに、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/コマンドとしてアクセスできるようにします。

関連情報