一、名词解释
这次我们将继续用模拟的思路,来看一下最基本的虚拟网络:电脑-交换-电脑。首先建立感性认识,而后再来进行深入的理论分析。
上文 网络是什么-利用代码模拟理解网络的本质-优快云博客 我们利用第一性原理,摘取了网络的核心思想是将信息从A传输到B。并介绍了交换机的核心原理,类似水流寻找最低点,做的是广度优先搜索,并加上了记忆功能。
这次模拟两台最简的计算机进行实际的网络通讯。其中需要用到两个主要组件:
netns:用来模拟最简单的虚拟计算机,只有网络功能,没有其他功能(当前先不考虑)。
brctl:用来创建一个虚拟交换机,或者叫网桥、bridge、br,大致可以认为都是指同一个内容。我想就算是最专业的人,也很难区分其中的细微差别。
还有veth,是一种虚拟网络接口,相当于网线,一头插电脑,一头插交换机。
这篇文章的前提是你有一个相对较新版本的linux系统,至于是ubuntu、centos、debian、kali等,差别并不大。因为网络层的东西,基本上是一致的。推荐使用vmware等虚拟化工具,在虚拟机里进行操作,因为新手可能很容易把网络玩崩。后面还会推荐更适用于虚拟化和仿真的工具。
二、构造一个最小通信网络
接下来构造一个最简的通讯模型:电脑-交换-电脑。也就是A-中间商-B的结构。需要以下的步骤:
步骤
1. 创建1个虚拟的电脑;
2. 创建1个虚拟交换机;
3. 将电脑连接到交换机;
4. 添加第2台电脑,并连接交换机;
5. ping测试;
实操过程
安装依赖
首先安装依赖。一般使用netns不需要安装任何东西,你可以执行:
ip netns
如果没有保存,就是系统已经内置了。如果需要安装,请安装iprouter2
centos 安装 iproute2 命令
yum install -y iproute
ubuntu 安装:
sudo apt-get install iproute2
后面将主要以centos为主介绍。其他操作系统,安装也不会有难度,因为这些都是比较基础的组件,系统差异较小。
安装brctl,需要安装bridge-utils。
sudo yum install bridge-utils
1. 创建1个虚拟的电脑
创建1个网络命名空间,以模拟1台机器:
sudo ip netns add ns1
2. 创建1个虚拟交换机
sudo brctl addbr br0
sudo ip link set br0 up
3. 将电脑连接到交换机
创建一条网线(veth),一头插电脑,一头插交换机。
# 网线
sudo ip link add veth11 type veth peer name veth12
# 接电脑
sudo ip link set veth11 netns ns1
# 接交换
sudo brctl addif br0 veth12
# 启用接口
# 在电脑内部执行
sudo ip netns exec ns1 ip link set veth11 up
# 在交换上
sudo ip link set veth12 up
4. 添加第2台电脑,并连接交换机
与上述同理就直接一个代码段包括了。
sudo ip netns add ns2
sudo ip link add veth21 type veth peer name veth22
# 接电脑
sudo ip link set veth21 netns ns2
# 接交换
sudo brctl addif br0 veth22
# 启用接口
# 在电脑内部执行
sudo ip netns exec ns2 ip link set veth21 up
# 在交换上
sudo ip link set veth22 up
其中:
ip netns exec {name} cmd
是用来在宿主机上,进入虚拟电脑(netns)执行命令用的。
ip netns exec ns1 ip addr
ip netns exec ns2 ip addr
ip netns exec ns1 ip a 的意思就是进入ns1里面执行ip a,查看网卡的基本信息。查看两个电脑的状态:
root@ubuntu:~# ip netns exec ns1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
7: veth11@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 0e:7b:28:53:61:f6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::c7b:28ff:fe53:61f6/64 scope link
valid_lft forever preferred_lft forever
root@ubuntu:~# ip netns exec ns2 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
9: veth21@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ce:82:15:54:e6:c2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::cc82:15ff:fe54:e6c2/64 scope link
valid_lft forever preferred_lft forever
我们一般把veth11、veth12称为网卡、接口。其对应的物理实体,就是网线插入的那个位置对应的硬件,属于网络二层的设备。所谓网络二层,就是网络通讯基于的物质基础,而三次就是上次说的交换层,其保证了网络的基本通讯。
在这个输出里,我们可看到,两个网卡,都有了IPv6的地址。接下来就可以直接ping测试。
5. ping测试(IPV6)
- 开启IPv6转发功能
vim /etc/sysctl.conf
增加:
net.ipv6.conf.all.forwarding = 1
保存执行:
sysctl -p
- ping测试
root@ubuntu:~# ip netns exec ns2 ping -6 fe80::c7b:28ff:fe53:61f6
PING fe80::c7b:28ff:fe53:61f6(fe80::c7b:28ff:fe53:61f6) 56 data bytes
64 bytes from fe80::c7b:28ff:fe53:61f6%veth21: icmp_seq=1 ttl=64 time=0.124 ms
64 bytes from fe80::c7b:28ff:fe53:61f6%veth21: icmp_seq=2 ttl=64 time=0.066 ms
root@ubuntu:~# ip netns exec ns1 ping -6 fe80::cc82:15ff:fe54:e6c2
PING fe80::cc82:15ff:fe54:e6c2(fe80::cc82:15ff:fe54:e6c2) 56 data bytes
64 bytes from fe80::cc82:15ff:fe54:e6c2%veth11: icmp_seq=1 ttl=64 time=0.043 ms
64 bytes from fe80::cc82:15ff:fe54:e6c2%veth11: icmp_seq=2 ttl=64 time=0.064 ms
^C
--- fe80::cc82:15ff:fe54:e6c2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1017ms
rtt min/avg/max/mdev = 0.043/0.053/0.064/0.010 ms
可以看到双向都可以ping通。
6. ping测试(IPV4)
- 开启IPv4转发功能
开启转发功能:
vim /etc/sysctl.conf
增加:
net.ipv4.ip_forward = 1
保存执行:
sysctl -p
- 添加IP
ip netns exec ns1 ip addr add 10.1.1.1/24 dev veth11
ip netns exec ns2 ip addr add 10.1.1.2/24 dev veth21
ping测试:
ip netns exec ns1 ping 10.1.1.2
ip netns exec ns2 ping 10.1.1.1
注意,在这里如果你是centos系统,可能就直接ping通了。但如果是ubuntu的新版本,则可能就不通。如果遇到不通的问题,可以暂时放一下,这个问题会比较棘手,后面会再解释原因。如果能ping通IPv6,也可以证明网络联通了。可以暂时不必追究IPv4的问题。
7. 清理
ip netns del ns1
ip netns del ns2
brctl delbr br0
三、总结
至此,我们,看到了一个最小网络的虚拟化过程。并通过电脑-交换-电脑的结构实现了通讯。其中用到的原理,也就是寻址。寻址的地址主要是IP与Mac。虚拟化的技术有很多,但只要能熟练使用这个最小模型,就能帮助你很快地学会其它的技术。