允许 Docker 容器使用容器作为网关与互联网通信

允许 Docker 容器使用容器作为网关与互联网通信

以下是我的 Docker 容器的配置

网络

nw1:这是一个私有网络,此网络中的容器无法访问互联网(ping google.com 不起作用)

:这不是私有网络,而是容器的默认网络,此网络中的容器可以访问互联网(ping google.com 有效)

容器

vm1_nw1:此容器连接到nw1(私有网络nw1)

vm2_nw1:此容器连接到nw1(私有网络nw1)

外部世界虚拟机:此容器连接到两个网络(nw1,bridge)

通过以下配置,我能够从 ext_world_vm ssh 到 vm1_nw1 和 vm2_nw1,即可以使用 ext_world_vm 容器访问容器 vm1_nw1 和 vm2_nw1

    #!/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 工作)

以下是我尝试过但结果不成功的方法:

外部世界虚拟机

    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`

相关内容