以下は、Dockerコンテナーの構成です。
ネットワーク
nw1:これはこのネットワーク内のプライベートネットワークコンテナであり、インターネットにアクセスできません(ping google.comは機能しません)
bridge:これはプライベートネットワークではなく、コンテナのデフォルトネットワークであり、このネットワーク内のコンテナはインターネットにアクセスできます(ping google.comは機能します)
コンテナ:
vm1_nw1:このコンテナはnw1(プライベートネットワークnw1)に接続されています
vm2_nw1:このconatinerは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のゲートウェイとして機能する必要があります。pinggoogle.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のゲートウェイとして機能する必要があります。
macvlanドライバーを使用してネットワークを作成する
`docker network create -d macvlan nw1 --internal`