模拟两台计算机的通讯-netns和brctl组建网络

一、名词解释

这次我们将继续用模拟的思路,来看一下最基本的虚拟网络:电脑-交换-电脑。首先建立感性认识,而后再来进行深入的理论分析。

上文 网络是什么-利用代码模拟理解网络的本质-CSDN博客 我们利用第一性原理,摘取了网络的核心思想是将信息从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。虚拟化的技术有很多,但只要能熟练使用这个最小模型,就能帮助你很快地学会其它的技术。

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值