网络虚拟空间是构建轻量级虚拟化环境的基础。
构建一个网络虚拟空间有助于于理解虚拟化技术。
本文描述构建一个简单虚拟网络空间的过程。
拓扑示意图如下:
1.测试环境
2台虚拟机(宿主机1台,另有外部机器协助测试),1个用于连接内部的网桥(虚拟网桥) 1台虚拟路由器
2对虚拟网卡(r1-inside,r1-outside,rex1-inside,rex1-outside),1个屋里网桥,一个物理网卡(enp0s25)
宿主机CentOS7.4
虚拟网桥连接虚拟路由,虚拟路由连接物理网桥, 物理网桥绑定物理网卡
2.测试目标
vm1和vm2互相通讯
vm1,vm2可对通过虚拟路由对外通讯
3.实施步骤
3.1.创建网桥
创建物理网桥:brctl addbr br-ex
创建虚拟网桥:brctl addbr br-in
激活物理网桥:ip link set br-ex up
激活虚拟网桥:ip link set br-in up
3.2开启ip转发
在宿主机需要开启ip转发。编辑/etc/sysctl.config,添加如下:
net.ipv4.ip_forward = 1
保存退出。执行生效命令:
sysctl -p
3.3 创建虚拟路由
虚拟路由器命名为r1
ip netns add r1
3.4.创建2对网卡
第一对虚拟网卡,一端绑虚拟网桥,一端绑虚拟路由
ip link add r1-inside type veth peer name r1-outside #创建一对网卡
brctl addif br-in r1-inside #虚拟网卡绑定在虚拟网桥
ip link set r1-inside up #激活
ip link set r1-outside netns r1 #虚拟网卡绑定在虚拟路由r1
第二对虚拟网卡,一段绑路由,一端绑物理网桥
ip link add rex1-inside type veth peer name rex1-outside
brctl addif br-ex rex1-outside #虚拟网卡绑定在屋里路由
ip link set rex1-outside up #激活虚拟网卡
ip link set rex-inside netns r1 #虚拟网卡绑定虚拟路由
3.5配置物理网卡和物理网桥
移除物理网卡IP地址,IP设置到物理网桥上,将物理网桥和物理网卡绑定
ip addr del 192.168.0.140 dev enp0s25;ip addr set 192.168.0.140/24 dev br-ex;brctl addif br-ex enp0s25;
3.6配置虚拟路由
r1绑定的网卡可以改名,例如:
ip netns exec r1 ip link set r1-outside name eth0
以下依然使用初始网卡名。
给连接虚拟网桥方向的虚拟网卡添加i地址
ip netns exec r1 ip addr add 10.0.0.254/24 dev rex1-inside
ip netns exec r1 ip link set r1-outside up
给连接物理网桥方向的网卡添加地址
ip netns exec r1 ip addr add 192.168.0.141/24 dev rex1-outside
ip netns exec r1 ip link set rex1-inside up
3.7配置虚拟机
使用“virsh edit vm1”
修改interface中的网桥名和mac值即可
启动主机后,设置ip为10.0.0.1/24
使用ping10.0.0.254即r1上的地址,应该可以成功
设置网关
route add default gw 10.0.0.254
vm2使用相同方法修改配置。
3.8实现外部包可被接受
到目前,已经实现虚拟机间通讯,虚拟机跟路由通讯,虚拟机通讯物理网卡。
但还不能成功与物理网卡之外的主机通讯,原因是回应的包无法被正确接收。
以下采取一种最简单的方式实现,即实质SNAT
给路由器r1添加一条SNAT策略,在宿主机执行如下命令:
ip netns exec r1 iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j SNAT --to-source 192.168.0.141
再测试发现内部主机已经可以通讯外部主机。
3.9提供dhcp
r1路由器还可以提供dhcp功能给内部主机
这需要dnsmasq支持,如果没安装,可执行如下:
yum install dnsmasq
安装成功后,执行如下命令:
ip netns exec r1 dnsmasq --dhxp-range 10.0.0.1,10.0.0.100
至此,一个最简单的虚拟网络空间测试环境构建完成。