最近、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/
コマンドとしてアクセスできるようにします。