CentOS Docker 컨테이너 내부의 가상 머신에서 호스트 포트로 트래픽을 리디렉션하는 방법은 무엇입니까?

CentOS Docker 컨테이너 내부의 가상 머신에서 호스트 포트로 트래픽을 리디렉션하는 방법은 무엇입니까?

이 시나리오가 있습니다.

  • ufw가 설치된 Debian을 실행하는 호스트.
  • CentOS Docker 컨테이너에는 특정 IP에서 실행되는 가상 머신이 있습니다.
  • VM에는 컨테이너 호출을 처리 https://app.domain하고 항목을 hosts(애플리케이션 IP).

localhost:7000내 호스트 머신을 호출하고 컨테이너의 가상 머신 애플리케이션을 사용하고 싶습니다 .

컨테이너를 실행할 때 컨테이너의 포트를 노출했습니다 -p 7000:7000.

iptables컨테이너의 트래픽을 읽고 리디렉션하려고 시도했지만 운이 없었습니다!

그렇다면...누구든지 iptables내가 실행해야 하는 명령의 예를 만들 수 있나요?


편집하다:다음과 같은이것나는 시도했다:

IP_CONTAINER=xxx.xxx.xxx.xxx
APP_IP=xxx.xxx.xxx.xxx

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING --protocol tcp --destination $APP_IP --dport 80 --source $IP_CONTAINER --jump DNAT --to-destination $APP_IP
iptables -t nat -A POSTROUTING -j MASQUERADE

하지만 여전히 성공하지 못했습니다!

답변1

호스트 포트에서 CentOS Docker 컨테이너 내부의 가상 머신에서 실행되는 애플리케이션으로 트래픽을 리디렉션하려면 Docker 컨테이너 네트워크를 구성하고 iptables 규칙을 사용하여 트래픽을 전달해야 합니다.

취할 수 있는 조치의 예는 다음과 같습니다.

  1. Docker 네트워크를 생성하고 여기에 CentOS 컨테이너를 연결합니다.

    docker network create mynetwork
    docker run --network=mynetwork --name=centos_container centos
    
  2. CentOS 컨테이너 내에서 Docker 네트워크와 동일한 네트워크의 고정 IP 주소를 사용하도록 VM을 구성합니다. 예를 들어 Docker 네트워크 IP 범위인 경우 이를 172.18.0.0/16사용하도록 가상 머신을 구성할 수 있습니다 172.18.0.2.

  3. CentOS 컨테이너에 있는 가상 머신의 포트를 Docker 네트워크에 노출합니다. 예를 들어 애플리케이션이 가상 머신 내의 포트 80에서 실행 중인 경우 docker run 명령을 사용하고 -p해당 포트를 Docker 네트워킹에 매핑하도록 선택할 수 있습니다.

    docker run --network=mynetwork --name=centos_container -p 7000:80 centos
    

    이는 컨테이너 포트 80을 호스트 포트 7000에 매핑합니다.

  4. HOST 시스템에서 IP 전달을 활성화합니다.

    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  5. iptables호스트 포트 7000에서 Docker 컨테이너 내부의 가상 머신으로 트래픽을 전달하는 규칙을 구성합니다 . 예를 들어 컨테이너 내부 가상 머신의 IP 주소가 이면 172.18.0.2다음 iptables규칙을 사용할 수 있습니다.

    iptables -t nat -A PREROUTING -p tcp --dport 7000 -j DNAT --to-destination 172.18.0.2:80
    iptables -t nat -A POSTROUTING -j MASQUERADE
    

    이러한 규칙은 호스트의 포트 7000에서 들어오는 트래픽을 컨테이너 내부 가상 머신의 포트 80으로 전달하여 소스 IP 주소를 호스트의 IP 주소로 다시 씁니다.

이러한 단계를 수행한 후에는 호스트 시스템의 http://localhost:7000에 액세스하여 CentOS 컨테이너 내부의 VM에서 실행 중인 애플리케이션에 액세스할 수 있어야 합니다.

답변2

애플리케이션에 연결할 수 있습니다., 호스트에서 CentOS Docker 컨테이너 내부의 VM에 위치CentOS 컨테이너에서 올바르게 구성된 프록시를 사용하십시오.컨테이너의 공용 IP에서 VM IP 및 애플리케이션 포트로 트래픽을 전달합니다!

그럼 방법은..대리인컨테이너 내부!

나는 사용했다HA 프록시다음 구성을 사용하십시오 haproxy.conf.

global
log 127.0.0.1 local0
debug

defaults
log global
mode http
timeout connect 5000
timeout check 5000
timeout client 30000
timeout server 30000

frontend apps
bind CONTAINER_IP:80
bind CONTAINER_IP:443
option tcplog
mode tcp
default_backend apps

backend apps
mode tcp
balance roundrobin
option ssl-hello-chk
server webserver1 APP_IP:APP_PORT check

frontend api
bind CONTAINER_IP:6443
option tcplog
mode tcp
default_backend api

backend api
mode tcp
balance roundrobin
option ssl-hello-chk
server webserver1 APP_IP:APP_PORT check

나는 가지고있다전달 활성화컨테이너의 경우:

$ sysctl net.ipv4.conf.all.forwarding=1
$ sudo iptables -P FORWARD ACCEPT

답변3

  1. 현재 iptables규칙을 확인하세요
    iptables -t nat -L -n -v
    
  2. IP 전달 활성화
    echo "1" > /proc/sys/net/ipv4/ip_forward
    cat /proc/sys/net/ipv4/ip_forward
    
  3. PG 트래픽 전달 규칙
    iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination new-master-ip:80
    iptables -t nat -A POSTROUTING -j MASQUERADE
    
  4. iptables규칙을 확인하세요
    iptables -t nat -L -n -v
    

관련 정보