-
启动网桥
ip link set net1 up
ip link set net2 up
效果图
image.png -
创建容器
docker run --privileged=true --net none --name aix -d hub.c.163.com/public/ubuntu:14.04
docker run --privileged=true --net none --name solaris -d hub.c.163.com/public/ubuntu:14.04
docker run --privileged=true --net none --name gemini -d hub.c.163.com/public/ubuntu:14.04
docker run --privileged=true --net none --name gateway -d hub.c.163.com/public/ubuntu:14.04
docker run --privileged=true --net none --name netb -d hub.c.163.com/public/ubuntu:14.04
docker run --privileged=true --net none --name sun -d hub.c.163.com/public/ubuntu:14.04
docker run --privileged=true --net none --name svr4 -d hub.c.163.com/public/ubuntu:14.04
docker run --privileged=true --net none --name bsdi -d hub.c.163.com/public/ubuntu:14.04
docker run --privileged=true --net none --name slip -d hub.c.163.com/public/ubuntu:14.04
效果图
image.png 将节点加入网络
./pipework net1 aix 140.252.1.92/24
./pipework net1 solaris 140.252.1.32/24
./pipework net1 gemini 140.252.1.11/24
./pipework net1 gateway 140.252.1.4/24
./pipework net1 netb 140.252.1.183/24
./pipework net2 bsdi 140.252.13.35/27
./pipework net2 sun 140.252.13.33/27
./pipework net2 svr4 140.252.13.34/27
效果图
- bsdi 到 slip 建立P2P 网络
4.1 创建一个peer 的两个网卡
ip link add name slipside mtu 1500 type veth peer name bsdiside mtu 1500
效果图
4.2 把其中一个塞到slip的网络namespace里面
docker inspect '--format={{ .State.Pid }}' slip #获取pid
ln -s /proc/pid/ns/net /var/run/netns/pid
ip link set slipside netns pid
效果图
4.3 同理把另一个塞到bsdi的网络的namespace里面
4.4 给slip这面的网卡添加IP地址
docker exec -it slip ip addr add 140.252.13.65/27 dev slipside
docker exec -it slip ip link set slipside up
效果图
4.5 给bsdi这面的网卡添加IP地址
docker exec -it bsdi ip addr add 140.252.13.66/27 dev bsdiside
docker exec -it bsdi ip link set bsdiside up
效果图
- 添加网关
5.1 对于slip来讲,对外访问的默认网关是13.66
docker exec -it slip ip route add default via 140.252.13.66 dev slipside
5.2 对于bsdi来讲,对外访问的默认网关13.33
docker exec -it bsdi ip route add default via 140.252.13.33 dev eth1
5.3 对于sun来讲,要想访问p2p网络,需要添加下面的路由表
docker exec -it sun ip route add 140.252.13.64/27 via 140.252.13.35 dev eth1
5.4 对于svr4来讲,对外访问的默认网关是13.33
docker exec -it svr4 ip route add default via 140.252.13.33 dev eth1
5.5 对于svr4来讲,要访问p2p网关,需要添加下面的路由表
docker exec -it svr4 ip route add 140.252.13.64/27 via 140.252.13.35 dev eth1
这个时候,从slip是可以ping的通下面的所有的节点的
效果图
- 添加 从sun到netb的点对点网络 , 同 步骤4
ip link add name sunside mtu 1500 type veth peer name netbside mtu 1500
docker inspect '--format={{ .State.Pid }}' sun #获取 sun 的pid
ln -s /proc/pid/ns/net /var/run/netns/pid
ip link set sunside netns pid
docker inspect '--format={{ .State.Pid }}' netb #获取 netb 的pid
ln -s /proc/pid/ns/net /var/run/netns/pid
ip link set netbside netns pid
6.1 给sun里面的网卡添加地址
docker exec -it sun ip addr add 140.252.1.29/24 dev sunside
docker exec -it sun ip link set sunside up
6.2 在sun里面,对外访问的默认路由是1.4
docker exec -it sun ip route add default via 140.252.1.4 dev sunside
6.3 在netb里面,对外访问的默认路由是1.4
docker exec -it netb ip route add default via 140.252.1.4 dev eth1
效果图
6.3 在netb里面,p2p这面可以没有IP地址,但是需要配置路由规则,访问到下面的二层网络
docker exec -it netb ip link set netbside up
docker exec -it netb ip route add 140.252.1.29/32 dev netbside
docker exec -it netb ip route add 140.252.13.32/27 via 140.252.1.29 dev netbside
docker exec -it netb ip route add 140.252.13.64/27 via 140.252.1.29 dev netbside
效果图
- 对于netb,配置arp proxy
7.1 配置proxy_arp为1
docker exec -it netb bash -c "echo 1 > /proc/sys/net/ipv4/conf/eth1/proxy_arp"
docker exec -it netb bash -c "echo 1 > /proc/sys/net/ipv4/conf/netbside/proxy_arp"
7.2 将配置文件添加到docker里面
docker cp proxy-arp.conf netb:/etc/proxy-arp.conf
docker cp proxy-arp netb:/root/proxy-arp
docker exec -it netb chmod +x /root/proxy-arp
docker exec -it netb /root/proxy-arp start
效果图
- 配置上面的二层网络里面所有机器的路由
8.1 aix 默认外网访问路由是1.4,可以通过下面的路由访问下面的二层网络
docker exec -it aix ip route add default via 140.252.1.4 dev eth1
docker exec -it aix ip route add 140.252.13.32/27 via 140.252.1.29 dev eth1
docker exec -it aix ip route add 140.252.13.64/27 via 140.252.1.29 dev eth1
8.2 solaris
docker exec -it solaris ip route add default via 140.252.1.4 dev eth1
docker exec -it solaris ip route add 140.252.13.32/27 via 140.252.1.29 dev eth1
docker exec -it solaris ip route add 140.252.13.64/27 via 140.252.1.29 dev eth1
8.3 gemini
docker exec -it gemini ip route add default via 140.252.1.4 dev eth1
docker exec -it gemini ip route add 140.252.13.32/27 via 140.252.1.29 dev eth1
docker exec -it gemini ip route add 140.252.13.64/27 via 140.252.1.29 dev eth1
8.4 gateway
docker exec -it gateway ip route add 140.252.13.32/27 via 140.252.1.29 dev eth1
docker exec -it gateway ip route add 140.252.13.64/27 via 140.252.1.29 dev eth1
效果图
- 配置外网访问
9.1 创建一个peer的网卡对
ip link add name gatewayin mtu 1500 type veth peer name gatewayout mtu 1500
ip addr add 140.252.104.1/24 dev gatewayout
ip link set gatewayout up
9.2 一面塞到gateway的网络的namespace里面
docker inspect '--format={{ .State.Pid }}' gateway #获取 gateway pid
ln -s /proc/pid/ns/net /var/run/netns/pid
ip link set gatewayin netns pid
9.3 给gateway里面的网卡添加地址
docker exec -it gateway ip addr add 140.252.104.2/24 dev gatewayin
docker exec -it gateway ip link set gatewayin up
9.4 在gateway里面,对外访问的默认路由是140.252.104.1/24
docker exec -it gateway ip route add default via 140.252.104.1 dev gatewayin
效果图
9.5 设置NAT 转换, (ens33 本地网卡)
iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
ip route add 140.252.13.32/27 via 140.252.104.2 dev gatewayout
ip route add 140.252.13.64/27 via 140.252.104.2 dev gatewayout
ip route add 140.252.1.0/24 via 140.252.104.2 dev gatewayout
终极效果, 节点所有网络都可以互相通, 并都可以访问外网(若果不能访问外网,请确认主机是否打开IP 转发功能)