侧边栏壁纸
博主头像
landery博主等级

行李箱里装不下我想去的远方

  • 累计撰写 45 篇文章
  • 累计创建 26 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

操作系统_07_Linux 虚拟网络基础知识Tap、tun等

landery
2022-05-20 / 0 评论 / 2 点赞 / 125 阅读 / 3,247 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1 tap

Tap是操作系统内核中的虚拟网络设备,位于第二层(数据链路层)。Linux使用tun模块实现了tun/tap,在Linux定义中,tap和tun的数据结构是同一个,只是使用了一个Flag来区分。
image-1653036252195

  1. 检查是否具有tun模块
    modinfo tun
  2. 如果存在,查看是否加载:
    lsmod | grep tun
    如果已经加载,会出现tun ***
  3. 未加载tun模块,使用如下命令加载
    modprobe tun
  4. 安装tunctl工具操作tun/tap (这一步容易找不到包,可以按网上教程添加源)
    yum install tunctl -y
  5. 创建tap设备:
    tunctl -t tap_test
  6. 查看tap设备:
    # ip link list
    # ifconfig -a
    
    image-1653036353681
  7. 此时还没给设备绑定ip地址,执行如下命令:
    ip addr add local 192.168.100.1/24 dev tap_test
    至此,一个tap设备就创建完毕了。

2 namespace

namespace是Linux虚拟网络的一个重要概念。传统的Linux的许多资源是全局的,比如进程ID资源。而namespace的目的首先就是将这些资源做资源隔离。Linux可以在一个Host内创建许多namespace,于是那些原本是Linux全局的资源,就变成了namespace范围内的“全局”资源,而且不同namespace的资源互相不可见、彼此透明。

Linux具体将哪些全局资源做了隔离呢?看Linux相应的代码最直接、最直观:
image-1653036435262
以上6个资源,就是Linux namespace所隔离的资源。其基本含义如下:
image-1653036458388
从资源隔离的角度,linux namespace的示意图如下图所示:
image-1653036473559
可以看出,每个namespace里面,将原本是全局资源的进行了隔离,彼此互相不可见,同时在Linux的Host或者VM中,也会有一套相应的资源。

从网络的角度来看,一个namespace提供了一份独立的网络协议栈(网络设备接口、IPv4、IPv6、IP路由、防火墙规则等)。一个设备(Linux Device)只能位于一个namespace之中,不同namespace中的设备可以利用veth pair进行桥接。

3 veth pair

Veth pair不是一个设备,是一对设备,以连接两个虚拟以太网端口,操作veth pair需要与namespace一起配合。
image-1653036521785

ip link add tap1 type veth peer name tap2
这一条命令不仅创建tap1、tap2还创建了两个相连的veth pair,之后再把tap1、tap2分别放入ns1、ns2之中,并且给他们绑定ip地址,同一网段,就可以访问了。

但是这个也只能连接两个namespace,如果是3个以上的namespace需要互通,就需要使用到Bridge/Switch。

4 Bridge/Switch

在Linux概念之中,Bridge(网桥)与Switch(交换机)是一个概念。

Linux实现Bridge功能的是brctl模块,如果没有安装,yum install bridge-utils -y

image-1653036576551
如上图,中间创建一个交换机,创建四对veth pair,分别对应四个命名空间,就可以互通了。

5 Router

Linux创建路由器,并没有像创建虚拟Bridge那样有个直接的命令brctl,它连间接的命令也没有,不能创建虚拟路由器,因为Linux本身就是路由器(Router)

不过Linux默认没有打开路由转发功能,打开路由转发功能:

echo "1" > /proc/sys/net/ipv4/ip_forward

上述方法修改后重启失效,一劳永逸的方法是需要修改配置文件/etc/sysctl.conf。将net.ipv4.ip_forward=0修改为1,保存后退出即可。

image-1653036662321

在上图中,ns1/tap1与ns2/tap2不在同一个网段,中间需要经过一个路由器进行转发才能互通。图中的Router是一个示意,其实就是Linux开通了路由转发功能。
当我们添加了tap并给其绑定IP地址时,Linux会自动生成直连路由,通过命令route -n查看路由表。

image-1653036723508

如果ip netns exec ns1 ping 192.168.200.2 不通的话,就意味着需要设置静态路由。

# ip netns  exec ns1 route add -net 192.168.200.0 netmask 255.255.255.0 gw 192.168.100.1
# ip netns  exec ns2 route add -net 192.168.100.0 netmask 255.255.255.0 gw 192.168.200.1

为ns1和ns2设置静态路由,分别可达对方的网段。这样就可以访问通了。但是这样的网络并不能访问外网

6 tun

Tun是一个网络层的点对点设备,它启用了IP层隧道功能。Linux原生支持的三层隧道,可以通过ip tunnel help查看。
Linux一共原生支持5种三层隧道(tunnel),如下表所示:

隧道 简述
ipip IP in IP,在IPv4报文的基础上再封装一个IPv4报文头,属于IPv4 in IPv4
Gre 通用路由封装(Generic Routing Encapsulation),定义了在任意一种网络层协议上封装任意一个其他网络层协议的协议,属于IPv4/IPv6 over IPv4
Sit 这个跟ipip类似,只不过是用一个IPv4的报文头封装IPv6的报文,属于IPv6 over lPv4
Isatap 站内自动隧道寻址协议,一般用于IPv4网络中的IPv6/IPv4 节点间的通信
Vti 全称是Virtual Tunnel Interface,为 IPsec隧道提供了一个可路由的接口类型

image-1653036914018

配置如上网络,这里以ipip tunnel为例。

  1. 首先加载ipip模块,Linux默认没有加载

    modprobe ipip
    lsmod| grep ip
    
  2. 在ns1上创建tun1和ip tunnel

    ip netns exec ns1 ip tunnel add tun1 mode ipip remote 192.168.200.2 local 192.168.100.2 ttl 255
    ip netns exec ns1 ip link set tun1 up
    ip netns exec ns1 ip addr add 192.168.50.10 peer 192.168.60.10 dev tun1
    

    解释:

    • ip tunnel add tun1 mode ipip:创建一个tun类型的设备tun1,并且隧道模式是ipip;
    • remote 192.168.200.2 local 192.168.100.2:这个隧道的外层IP地址是远端192.168.200.2,近端(本地)是192.168.100.2,就是两个namespace中对应的两个tap。
    • ip netns exec ns1 ip addr add 192.168.50.10 peer 192.168.60.10 dev tun1 :设备tun1是个点对点的设备,他自己的ip地址是192.168.50.10,它的对端的ip是192.168.60.10。这两个IP地址就是ipip隧道的内层IP。
  3. 在ns2上创建tun2和ipip tunnel

    ip netns exec ns2 ip tunnel add tun2 mode ipip remote 192.168.100.2 local 192.168.200.2 ttl 255
    ip netns exec ns2 ip link set tun2 up
    ip netns exec ns2 ip addr add 192.168.60.10 peer 192.168.50.10 dev tun2
    
  4. 测试ping得通不。
    ip netns exec ns1 ping 192.168.60.10
    如果ping不通,那么就关闭主机防火墙,iptables -F

查看路由表route -n,可以看到到192.168.60.10有一条直连路由。

image-1653037192333

参考文献

本文基本按照这本书中的操作进行

  • 《深入理解OpenStack Neutron》,2018年1月1日,机械工业出版社,作者李宗标
2

评论区