以下是我的 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`