场景:
两台不同网段的虚机:
VM1,VM2,需要VM1需要借助VM2的IP出外网访问
方案:
由于VM1和VM2不在同一个网段,VM1添加路由时无法指向VM2,因此采用ovs+overlay网络实现VM1的对外通信。
VM1: 192.168.10.10
VM2: 192.168.20.4
overlay网络:
10.10.10.0/24
VM1:10.10.10.20
VM2: 10.10.10.1
VM2 SNAT: 10.10.10.0/24 -> 192.168.20.4
安装OVS,及构建VXLAN
yum install openvswitch libibverbs
systemctl start openvsiwtch
sysctl -w net.ipv4.ip_forward=1
VM1:
ovs-vsctl add-br br-tun
ip netns add test
ip link add name veth1 type veth peer name veth1p
ip link set dev veth1 netns test
ovs-vsctl add-port br-tun veth1p
ip link set veth1p up
ip netns exec test ip link set veth1 up
ip netns exec test ip addr add 10.10.10.20/24 dev veth1
添加vxlan:
ovs-vsctl add-port br-tun vxlan-tun -- set interface vxlan-tun type=vxlan options:remote_ip=192.168.20.4 options:key=222
VM2:
ovs-vsctl add-br br-tun
ip link add name veth1 type veth peer name veth1p
ovs-vsctl add-port br-tun veth1p
ip link set veth1p up
ip link set veth1 up
ip addr add 10.10.10.1/24 dev veth1
添加vxlan:
ovs-vsctl add-port br-tun vxlan-tun -- set interface vxlan-tun type=vxlan options:remote_ip=192.168.10.10 options:key=222
测试VXLAN:
# ip netns exec test ping 10.10.10.1
PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data.
64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=0.875 ms
64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=0.982 ms
64 bytes from 10.10.10.1: icmp_seq=3 ttl=64 time=0.861 ms
^C
--- 10.10.10.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.861/0.906/0.982/0.054 ms
添加NAT功能:
VM1:
# ip netns exec test route add -net default gw 10.10.10.1
VM2:
iptables -t nat -I POSTROUTING -s 10.10.10.0/24 -j SNAT --to-source 192.168.20.4
VM1上测试:
# ip netns exec test ping 192.168.20.1
PING 192.168.20.1 (192.168.20.1) 56(84) bytes of data.
64 bytes from 192.168.20.1: icmp_seq=1 ttl=63 time=2.36 ms
64 bytes from 192.168.20.1: icmp_seq=2 ttl=63 time=1.19 ms
64 bytes from 192.168.20.1: icmp_seq=3 ttl=63 time=1.29 ms
64 bytes from 192.168.20.1: icmp_seq=4 ttl=63 time=1.24 ms
64 bytes from 192.168.20.1: icmp_seq=5 ttl=63 time=1.27 ms
^C
--- 192.168.20.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 1.191/1.475/2.369/0.448 ms
已经可以ping通VM2的网关,可以借助VM2的IP对外访问。
上述测试内容中,我们为了验证方案的准确性,在VM1中将overlay的接口放在了namespace中,在此情况下使用时需要在此namespace中。
实际中,为了方便,无需将veth1口放在namespace中,在此时,需要注意路由的添加:
- route add {需要通过192.168.10.10的网段} gw 192.168.10.1/24
- route add -net default gw 10.10.10.1
使用linux bridge实现overlay
在上述中,利用ovs实现的vxlan,但是需要额外安装ovs,在此我们利用linux bridge实现,并且不使用namespace隔离。
VM1
创建linux bridge:
brctl addbr br-tun
ip link set dev br-tun up
创建vxlan:
ip link add vtep1 type vxlan id 222 remote 192.168.20.4 local 192.168.10.10 dstport 4789 dev eth0
ip link set dev vtep1 up
brctl addif br-tun vtep1
配置overlay网络:
ip addr add 10.10.10.20/24 dev vtep1
VM2
创建linux bridge:
brctl addbr br-tun
ip link set dev br-tun up
创建vxlan:
ip link add vtep2 type vxlan id 222 remote 192.168.10.10 local 192.168.20.4 dstport 4789 dev eth0
ip link set dev vtep2 up
brctl addif br-tun vtep2
配置overlay网络:
ip addr add 10.10.10.1/24 dev vtep2
配置NAT及路由
VM1:
route add -net 172.20.0.0/16 gw 192.168.10.1
route add -net default gw 10.10.10.1
route del -net default gw 192.168.10.1
VM2,NAT:
iptables -t nat -I POSTROUTING -s 10.10.10.0/24 -j SNAT --to-source 192.168.20.4
测试未通,排查。
网友评论