Permitir que los contenedores acoplables se comuniquen con Internet utilizando un contenedor como puerta de enlace

Permitir que los contenedores acoplables se comuniquen con Internet utilizando un contenedor como puerta de enlace

A continuación se muestra mi configuración de mis contenedores acoplables.

red

nw1: Esta es una red privada. Los contenedores de esta red no pueden acceder a Internet (ping google.com no funciona)

puente:Esta no es una red privada y es la red predeterminada de un contenedor y los contenedores en esta red pueden acceder a Internet (ping google.com funciona)

contenedores:

vm1_nw1:Este contenedor está conectado a nw1(red privada nw1)

vm2_nw1:Este contenedor está conectado a nw1 (red privada nw1)

ext_world_vm:Este contenedor está conectado a ambas redes (nw1,puente)

con la siguiente configuración pude realizar ssh desde ext_world_vm a vm1_nw1 y vm2_nw1, es decir, se puede acceder a los contenedores vm1_nw1 y vm2_nw1 utilizando el contenedor 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"

El siguiente es el enunciado de mi problema.

ahora quiero configurar estos contenedores de la siguiente manera

1ª configuración: Los contenedores vm1_nw1,vm2_nw1 deben poder acceder a Internet a través de ext_world_vm (es decir, ext_world_vm debe actuar como puerta de enlace para vm1_nw1,vm2_nw1, el ping a google.com debería funcionar desde vm1_nw1,vm2_nw1).

Lo siguiente es lo que intenté pero el resultado no fue exitoso:

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

Ayúdenme a configurarlo de manera que los contenedores en la red privada (vm1_nw1, vm2_nw1) puedan acceder a Internet utilizando el contenedor en la red puente (ext_world_vm, es decir, debería actuar como puerta de enlace para vm1_nw1, vm2_nw1).

Respuesta1

crear la red usando el controlador macvlan

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

información relacionada