Linux

允許 docker 容器使用容器作為網關與 Internet 通信

  • August 31, 2018

下面是我的 docker 容器的配置

網路

nw1:這是一個私有網路容器在這個網路不能訪問網際網路(ping google.com 不起作用)

網橋:這不是私有網路,是容器的預設網路,該網路中的容器可以訪問網際網路(ping google.com 有效)

容器

vm1_nw1:此容器連接到 nw1(私有網路 nw1)

vm2_nw1:此容器連接到 nw1(私有網路 nw1)

ext_world_vm:這個容器連接到兩個網路(nw1,bridge)

通過以下配置,我能夠從 ext_world_vm SSH 到 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"

以下是我的問題陳述

現在我想按如下方式配置這些容器

第一種配置: 容器 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 的網關)

使用 macvlan 驅動程序創建網路

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

引用自:https://serverfault.com/questions/928692