Docker 컨테이너가 컨테이너를 게이트웨이로 사용하여 인터넷과 통신하도록 허용

Docker 컨테이너가 컨테이너를 게이트웨이로 사용하여 인터넷과 통신하도록 허용

다음은 내 도커 컨테이너 구성입니다.

회로망

뉴1: 이것은 개인 네트워크입니다. 이 네트워크의 컨테이너는 인터넷에 액세스할 수 없습니다(ping google.com이 작동하지 않음).

다리:이것은 개인 네트워크가 아니며 컨테이너의 기본 네트워크이며 이 네트워크의 컨테이너는 인터넷에 액세스할 수 있습니다(ping google.com이 작동함).

컨테이너:

vm1_nw1: 이 컨테이너는 nw1(사설망 nw1)에 연결되어 있습니다.

vm2_nw1: 이 컨테이너는 nw1(사설망 nw1)에 연결되어 있습니다.

ext_world_vm:이 컨테이너는 두 네트워크(nw1,bridge)에 모두 연결되어 있습니다.

아래 구성을 사용하면 ext_world_vm에서 vm1_nw1 및 vm2_nw1로 ssh를 연결할 수 있었습니다. 즉, vm1_nw1 및 vm2_nw1 컨테이너는 ext_world_vm 컨테이너를 사용하여 액세스할 수 있습니다.

    #!/bin/bash
    docker run --privileged --name vm1 -itd ubuntu
    docker exec vm1 useradd -c "saiteja" -m saiteja 
    docker exec vm1 echo "saiteja:saiteja"|chpasswd
    docker exec vm1 apt-get update -y
    docker exec vm1 apt-get install net-tools -y
    docker exec vm1 apt-get install iproute2 -y
    docker exec vm1 apt-get install iputils-ping -y
    docker exec vm1 apt-get install curl -y
    docker exec vm1 apt-get install iptables -y
    docker exec vm1 apt-get install openssh-server -y
    docker exec vm1 apt-get install ssh -y
    docker exec vm1 service ssh restart
    docker commit vm1 vm_with_nw:latest
    docker network create -d bridge nw1  --internal
    docker run --privileged --name vm1_nw1 -itd --network=nw1  vm_with_nw
    docker run --privileged --name vm2_nw1 -itd --network=nw1  vm_with_nw
    docker run --privileged --name ext_world_vm -itd vm_with_nw:latest
    docker network connect nw1 ext_world_vm
    docker exec ext_world_vm service ssh start
    docker exec ext_world_vm service ssh restart
    docker inspect ext_world_vm
    echo -n "enter ext_world_vm_ip:"
    read ext_world_vm_ip
    docker exec vm1_nw1 iptables -P FORWARD DROP
    docker exec vm1_nw1 iptables -A INPUT -m state --state INVALID -j DROP
    docker exec vm1_nw1 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    docker exec vm1_nw1 iptables -A INPUT -i lo -j ACCEPT
    docker exec vm1_nw1 iptables -A INPUT -s ${ext_world_vm_ip} -j ACCEPT
    docker exec vm1_nw1 service ssh start
    docker exec vm1_nw1 service ssh restart
    docker exec vm1_nw1 iptables -P INPUT DROP
    docker exec vm2_nw1 iptables -P FORWARD DROP
    docker exec vm2_nw1 iptables -A INPUT -m state --state INVALID -j DROP
    docker exec vm2_nw1 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    docker exec vm2_nw1 iptables -A INPUT -i lo -j ACCEPT
    docker exec vm2_nw1 iptables -A INPUT -s ${ext_world_vm_ip} -j ACCEPT
    docker exec vm2_nw1 service ssh start
    docker exec vm2_nw1 service ssh restart
    docker exec vm2_nw1 iptables -P INPUT DROP
    echo "done"

다음은 내 문제 설명입니다

이제 이 컨테이너를 다음과 같이 구성하고 싶습니다.

첫 번째 구성: 컨테이너 vm1_nw1,vm2_nw1은 ext_world_vm을 통해 인터넷에 액세스할 수 있어야 합니다(예: ext_world_vm은 vm1_nw1,vm2_nw1 ping google.com이 vm1_nw1,vm2_nw1에서 작동해야 함)에 대한 게이트웨이 역할을 해야 함

다음은 내가 시도한 것입니다. 그러나 결과는 성공하지 못했습니다.

ext_world_vm

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
    iptables -A INPUT -i eth0 -j ACCEPT
    iptables -A INPUT -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -j ACCEPT

vm1_nw1,vm2_nw1:

     route add default gw <ext_world_vm ip address> eth0

프라이빗(vm1_nw1,vm2_nw1) 네트워크의 컨테이너가 브리지 네트워크(ext_world_vm, 즉 vm1_nw1,vm2_nw1의 게이트웨이 역할을 해야 함)의 컨테이너를 사용하여 인터넷에 액세스할 수 있도록 구성하도록 도와주세요.

답변1

macvlan 드라이버를 사용하여 네트워크 생성

            `docker network create -d macvlan  nw1  --internal`

관련 정보