计算机网络 lab4 Overlay Network 和 VXLAN

一、任务要求

用 mininet 创建两个 LAN,然后用 VXLAN 创建 overlay network,让两个局域网可以互相通信。
参考
基于 Open vSwitch 的 VxLAN 隧道实验网络
【Mininet 指令介紹】
SDN 第二次作业
Openvswitch 介紹
自定义 topo 文件解析

二、原理

1.Overlay Network

2. 虚拟机的连网方式

虚拟机三种网络模式
nat:enp0s3:上网
host-only:enp0s8:两个 LAN 通信
Linux - 网卡命名方式改变了 - enp0s3,enp0s8
配置 host-only 的静态 IP

3. 流表

idle_timeout,空闲时间,如值为 10,表示若某条流表在最近 10s 内没有被匹配过则删除。
hard_timeout,存活时间,如值为 10,则从该流表被安装经过 10s 后无论被使用情况如何,立即被删除。
而如果在交换机上查看流表,会发现除以上两个时间以外,还有两个:
idle_age,未命中时间,如值为 10,表示已经有 10s 没有匹配到过这条流表了。当这个值等于 idle_timeout 时,这条流表就真的失效了。
duration,流表年龄,指的是流表自从安装到交换机上总共所经过的时间。

作者:顽强的猫尾草
链接:https://www.jianshu.com/p/22e6feb2c662
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三、常用指令

SDN 学习笔记
Open vSwitch 的 ovs-vsctl 命令详解
OVS 簡易常用指令

1. 网桥 ovs-vsctl 基本命令

1
ovs-vsctl show  # 查询主机上已有的 OVS bridge 和 port
(1) ovs-vsctl 用于控制 ovs db
1
2
3
4
5
6
7
8
ovs-vsctl add-br br0 // 创建 bridge
ovs-vsctl del-br br0 // 删除 bridge
ovs-vsctl list-br // 查询 bridge
ovs-vsctl add-port br0 eth1 // 添加端口
ovs-vsctl del-port br0 eth1 // 移除端口
ovs-vsctl set-controller br0 tcp:1.2.3.4:6633 tcp:4.3.2.1:6633 // 设置多个 controller
ovs-vsctl del-controller br0 // 移除控制器
ovs-vsctl get-controller br0 // 查询 brige 上已配置的控制器
(2) ovs-ofctl 用于管理 OpenFlow switch 的 flow
(3) ovs-dpctl 用于管理 ovs 的 datapath
(4) ovs-appctl 用于查询和管理 ovs daemon

2. 流表

四、实作

1. 创建拓扑

在两台虚拟机上分别设置这样的拓扑


On VM 1:

1
2
3
mininet> h1 ifconfig h1-eth0 10.0.0.1 netmask 255.0.0.0
mininet> h2 ifconfig h2-eth0 10.0.0.2 netmask 255.0.0.0
$ sudo ifconfig s1 10.0.0.111/8 up

On VM 2:

1
2
3
mininet> h3 ifconfig h3-eth0 10.0.0.3 netmask 255.0.0.0
mininet> h4 ifconfig h4-eth0 10.0.0.4 netmask 255.0.0.0
$ sudo ifconfig s2 10.0.0.112/8 up

2. 网桥配置

On VM1:

1
2
3
4
5
6
7
8
9
// 在 VM1 上添加 br1 网桥
sudo ovs-vsctl add-br br1
// 在 br1 上添加一个端口,将 enp0s8 挂载到 br1 上
// 将 enp0s8 的 IP 指定给 br1,让虚拟机网络可以通过 br1 继续工作
//24 是掩码位数,up 是网卡启动的意思
sudo ovs-vsctl add-port br1 enp0s8
sudo ifconfig br1 192.168.56.101/24 up
// 根据实际情况配置 br1 的网关(可选)
sudo route add default gw 192.168.56.201

On VM2:

1
2
3
4
5
6
7
8
9
//// 在 VM2 上添加 br1 网桥
sudo ovs-vsctl add-br br1
// 在 br1 上添加一个端口,将 enp0s8 挂载到 br1 上
// 将 enp0s8 的 IP 指定给 br1,让虚拟机网络可以通过 br1 继续工作
//24 是掩码位数,up 是网卡启动的意思
sudo ovs-vsctl add-port br1 enp0s8
sudo ifconfig br1 192.168.56.102/24 up
// 根据实际情况配置 br1 的网关(可选)
sudo route add default gw 192.168.56.201

这时候查看网络的连通性,会发现 VM2 可以 ping 通 192.168.56.101,却 ping 不通 10.0.0.111

3. 搭建 VxLAN 隧道

On VM1:

1
sudo ovs-vsctl add-port s1 vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=192.168.56.102

On VM2:
1
sudo ovs-vsctl add-port s2 vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=192.168.56.101

五、遇到问题

1. 拓扑没有删除

1
2
cd mininet/mininet/examples
sudo python lab4.py

Exception: Error creating interface pair (XX-eth,XX-eth): RTNETLINK answers: File exists error
挂号里通常是 Switch 的某个 eth 连到另一台 Switch 的 eth,发生错误的原因是因为当第一次建立拓扑时出错,第二次建立相同拓扑时,第一次的拓扑没有完全消除。
解决方法:运行以下指令

1
sudo mn -c

2. 局域网 pingall 不通

1
2
3
mininet> sh ovs-ofctl dump-flows s1 // 查看 s1 的 flow table
mininet> sh ovs-ofctl add-flow s1 "priority=0,action=normal" /// 新增 s1 的 flow table
mininet> pingall // 此時就可以互相 ping 到其他 host


参考

后来发现是自己用./miniedit 创建的拓扑都 ping 不通,要自己加上流表或是运行 ryu 才会通
后来就改用 sudo mn 创建拓扑,pingall 就可以直接成功,
但是不知道怎么把这种方式创建的拓扑存储成.py 文件 (?),或是修改 host 和 switch 名字
可以参考这个

3. 两台虚拟机 ping 不通原因

查到了很多原因,但后来发现我的原因是自己用./miniedit 创建的 LAN 有问题
(1) 虚拟机 mac 地址相同导致,复制虚拟的问题
https://blog.csdn.net/dlh_sycamore/article/details/64440134
(2) 虚拟机连接方式设置为桥接
Ubuntu 两台虚拟机之间 Ping 不通
(3) 防火墙
关闭虚拟机 linux 防火墙命令
两台虚拟机互相 ping 通(互相通讯)
ubuntu 查看防火墙状态

4. 如果想要配置的 IP 永久生效

5.ubuntu18.04 自带 python, 换成 python3

重装虚拟机,按照 ryu 的时候有一步是:python get-pip.py,出错,因为这个是 python3 的用法

1
2
3
4
5
// 下载并设置优先级
update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
// 查看默认版本
python --version

5.wireshark 权限问题

wireshark 遇到 couldn’t run /usr/bin/dumpcap in child process: Permission Denied

1
2
3
sudo dpkg-reconfigure wireshark-common // 选组 “YES” 
sudo adduser $USER wireshark // 添加当前用户到用户组
// 重啓,即可正常使用 wireshark

6.ryu 运行出错,所以想重新按照,但最后还是重装了虚拟机

(1) 运行 ryu 程序出现 ImportError: No module named XX.py
(2) 如何在 Ubuntu 中用 apt 命令删除 / 卸载软件包
apt-get remove 删除已安装的软件包(保留配置文件),不会删除依赖软件包,保留配置文件。
apt-get purge 删除已安装的软件包(不保留配置文件),删除软件包,同时删除相应依赖软件包。
如何在 Ubuntu 中用 apt 命令删除 / 卸载软件包(remove/clean/purge)
解决 apt-get remove 和 dpkg 删除出现 E: 无法定位软件包 XXXX

7.ovs 错误解决 could not open network device XXX (No such device)

网络上说设置好端口类型为 internal 就不会再出现这个问题
但我后来发现只是我命令输错,或是没有设置端口类型

8. 用自己./miniedit 创建的网络,add route 之后,ping 不上外网

这个时候进行 ping www.baidu.com 出现:
ping: www.baidu.com: Name or service not known
Linux 报错之 ping: www.baidu.com: Name or service not known

9.linux 中查看网卡 mac 地址

“ifconfig -a 其中 HWaddr 字段就是 mac 地址”,但是我没看到 HWaddr 字段
linux 中查看网卡 mac 地址

10.Unable to fetch some archives

Ubuntu 安装应用时报错:
Unable to fetch some archives, maybe run apt-get update or try with —fix-missing?

1
2
3
// 解决办法
sudo apt-get clean
sudo apt-get update

计算机网络系列

计算机网络 lab1
计算机网络 lab2 使用 Mininet 创建网络拓扑
计算机网络 lab3 使用 Socket 完成多人聊天室 — 原理
计算机网络 lab3 使用 Socket 完成多人聊天室 — 实作
计算机网络 lab4 Overlay Network 和 VXLAN