计算机网络底层通过硬件网卡进行通信
Linux中的网卡
网卡是计算机网络能够进行通信的硬件支撑,拥有唯一的MAC地址
1 查看网卡[网络接口]
01-ip link show
/sys/class/net (保存网卡信息的文件)
03-ip a
2 ip a 结果属性解读
状态:UP/DOWN/UNKOWN等
link/ether:MAC地址
inet:绑定的IP地址
3 给网卡添加IP地址
当然,这块可以直接修改ifcfg-*文件,但是我们通过命令添加试试
(1)ip addr add 192.168.0.100/24 dev eth0
(2)删除IP地址
ip addr delete 192.168.0.100/24 dev eth0
4 网卡启动与关闭
重启网卡 :service network restart / systemctl restart network
启动/关闭某个网卡 :ifup/ifdown eth0 or ip link set eth0 up/down
Network Namespace:网络的隔离
在linux上,网络的隔离是通过network namespace来管理的,不同的network namespace是互相隔离的
ip netns list:查看当前机器上的network namespace
network namespace的管理
ip netns list #查看
ip netns add ns1 #添加
ip netns delete ns1 #删除
通过了解network namespace技术,我们可以了解到两台机器之间是如何进行通信的,以及宿主机和虚拟机之间是如何进行通信的
namespace
(1)创建一个network namespace
ip netns add ns1
(2)查看该namespace下网卡的情况
ip netns exec ns1 ip a
(3)启动ns1上的lo网卡
ip netns exec ns1 ifup lo
or
ip netns exec ns1 ip link set lo up
(4)再次查看,可以发现state变成了UNKOWN
ip netns exec ns1 ip a
和linux的ip a一样,只不过这里指定了查看哪个网卡
(5)再次创建一个network namespace,执行启动操作
ip netns add ns2
ip netns exec ns2 ifup lo
如下所示,我们使用network namespace隔离了网络,那么在一个centos里面再创建一个centos也就不足为奇了,因为一个系统本质就是网络和IO的组成
我们隔离出来了两个网络,每个都有自己的网卡信息
(6)此时如果我们想让两个namespace网络连通起来,(也就是然两个网卡进行通信,相当于两个机器进行通信)
veth pair (Virtual Ethernet Pair)命令,是一个成对的端口,可以实现上述功能
(7)创建一对link,也就是接下来要通过veth pair连接的link
ip link add veth-ns1 type veth peer name veth-ns2
添加 veth-ns1 和 veth-ns2通过 veth peer进行link
其实这两个link相当于两个适配器接口,用于桥接两个namespace
(8)查看link情况
ip link
(9)将veth-ns1加入ns1中,将veth-ns2加入ns2中(将适配器嵌入网卡)
ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2
(10)查看宿主机和ns1,ns2的link情况
ip link
ip netns exec ns1 ip link
ip netns exec ns2 ip link
(11)此时veth-ns1和veth-ns2还没有ip地址,显然通信还缺少点条件(现在网卡有了,适配器也有了,就差ip地址就可以进行通信了),下面的两个命令给两个namespace添加ip地址
ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1
ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2
(12)再次查看,发现state是DOWN,并且还是没有IP地址
ip netns exec ns1 ip link
ip netns exec ns2 ip link
(13)启动veth-ns1和veth-ns2
ip netns exec ns1 ip link set veth-ns1 up
ip netns exec ns2 ip link set veth-ns2 up
(14)再次查看,发现state是UP,同时有IP
ip netns exec ns1 ip a
ip netns exec ns2 ip a
(15)此时两个network namespace互相ping一下,发现是可以ping通的
ip netns exec ns1 ping 192.168.0.12
ip netns exec ns2 ping 192.168.0.11
到此为止我们已经实现了在宿主机上的虚拟机内部,创建的两个namespace之间相互进行通信