コンテナをゲートウェイとして使用して、Dockerコンテナがインターネットと通信できるようにする

コンテナをゲートウェイとして使用して、Dockerコンテナがインターネットと通信できるようにする

以下は私のDockerコンテナの設定です

通信網

1 号: これはプライベート ネットワークです。このネットワーク内のコンテナはインターネットにアクセスできません (ping google.com は機能しません)

:これはプライベート ネットワークではなく、コンテナのデフォルト ネットワークであり、このネットワーク内のコンテナはインターネットにアクセスできます (ping google.com は機能します)

コンテナ:

翻訳元:このコンテナはnw1(プライベートネットワークnw1)に接続されています

翻訳元:このコンテナはnw1(プライベートネットワークnw1)に接続されています

エクストワールド:このコンテナは両方のネットワーク(nw1、ブリッジ)に接続されています

以下の設定により、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"

以下は私の問題提起です

これらのコンテナを次のように構成します

1番目の構成: コンテナ vm1_nw1、vm2_nw1 は ext_world_vm 経由でインターネットにアクセスできる必要があります (つまり、ext_world_vm は vm1_nw1、vm2_nw1 のゲートウェイとして機能する必要があり、vm1_nw1、vm2_nw1 から google.com への ping が機能する必要があります)

以下は私が試したことですが、結果は成功しませんでした。

エクストワールド

    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`

関連情報