우리는 최근 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 인터페이스가 있으면 그대로 두십시오.
이제 컨테이너/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/