首先有两个主机,host1地址为192.168.90.91,而host2地址则为192.168.91.13
1.分别配置容器、网桥,连接并启用设备:
在host1上:
docker run -itd --net=none --privileged=true --name=test1 ubu /bin/bash
pid1=`docker inspect -f {{.State.Pid}} test1`
ln -s /proc/$pid1/ns/net /var/run/netns/test1
ip link add tap1 type veth peer name tapb1
ip link add name br1 type bridge
ip link set tapb1 master br1
ip link set tap1 netns test1
ip link set br1 up
ip link set tapb1 up
ip netns exec test1 ip link set tap1 up
在host2上:
docker run -itd --net=none --privileged=true --name=test2 ubu /bin/bash
pid2=`docker inspect -f {{.State.Pid}} test2`
ln -s /proc/$pid2/ns/net /var/run/netns/test2
ip link add tap2 type veth peer name tapb2
ip link add name br2 type bridge
ip link set tapb2 master br2
ip link set tap2 netns test2
ip link set br2 up
ip link set tapb2 up
ip netns exec test2 ip link set tap2 up
2.设置ip,并添加默认路由
在host1上:
ip netns exec test1 ip addr add 30.0.1.1/24 dev tap1
ip addr add 30.0.1.2/24 dev br1
ip netns exec test1 ip route add default via 30.0.1.2
在host2上:
ip netns exec test2 ip addr add 30.0.2.1/24 dev tap2
ip addr add 30.0.2.2/24 dev br2
ip netns exec test2 ip route add default via 30.0.2.2
3.添加规则,同外界通信
在host1上:
iptables -A FORWARD -i br1 ! -o br1 -j ACCEPT
iptables -A FORWARD -o br1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 30.0.1.0/24 ! -o br1 -j MASQUERADE
在host2上:
iptables -A FORWARD -i br2 ! -o br2 -j ACCEPT
iptables -A FORWARD -o br2 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 30.0.2.0/24 ! -o br2 -j MASQUERADE
此时已打通各容器和对应主机的通信,有两种方式来使不同主机容器间通信 (重启容器网络设备都没了)
一、路由表及防火墙方式
1.主机添加路由规则
host1:
route add -net 30.0.2.0 netmask 255.255.255.0 gw 192.168.90.13
host2:
route add -net 30.0.1.0 netmask 255.255.255.0 gw 192.168.90.91
2.主机添加NAT表规则(非必须命令)
host1:
iptables -t -nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 30.0.1.0/24 ! -d 30.0.0.0/16 -j MASQUERADE
host2:
iptables -t -nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 30.0.2.0/24 ! -d 30.0.0.0/16 -j MASQUERADE
二、点对点vxlan方式
建立如图网络配置,注意此时容器在同一网段
host1:
ip link add vxlan1 type vxlan id 10 remote 192.168.90.13 dstport 4789 dev enp0s31f6
ip link set vxlan1 up
ip link set vxlan1 master br1
host2:
ip link add vxlan1 type vxlan id 10 remote 192.168.90.91 dstport 4789 dev enp0s31f6
ip link set vxlan1 up
ip link set vxlan1 master br2