我們最近從 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/
資料夾中以作為命令存取。