Разрешение Docker-контейнерам взаимодействовать с Интернетом, используя контейнер в качестве шлюза

Разрешение Docker-контейнерам взаимодействовать с Интернетом, используя контейнер в качестве шлюза

Ниже представлена ​​моя конфигурация контейнеров Docker.

сеть

нв1: Это частная сеть, контейнеры в этой сети не могут получить доступ к Интернету (ping google.com не работает)

мост:Это не частная сеть, а сеть по умолчанию для контейнера, и контейнеры в этой сети могут получать доступ к Интернету (ping google.com работает)

контейнеры:

vm1_nw1:Этот контейнер подключен к nw1(частная сеть nw1)

vm2_nw1:Этот контейнер подключен к nw1(частная сеть nw1)

ext_world_vm:Этот контейнер подключен к обеим сетям (nw1,bridge)

с помощью приведенной ниже конфигурации я смог подключиться по ssh из ext_world_vm к vm1_nw1 и vm2_nw1, т.е. к контейнерам 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"

Ниже приведена моя постановка проблемы.

теперь я хочу настроить эти контейнеры следующим образом

1-я конфигурация: Контейнеры 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`

Связанный контент