NAT 뒤의 컨테이너로 Proxmox 포트 전달

NAT 뒤의 컨테이너로 Proxmox 포트 전달

우리는 최근 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/

관련 정보