虚拟网络gretap创建实例与流程分析

问: tun/tap设备有什么用?
Linux虚拟网络设备之tun/tap - SegmentFault 思否
tun/tap设备的用处是将协议栈中的部分数据包转发给用户空间的应用程序,
给用户空间的程序一个处理数据包的机会。于是比较常用的数据压缩,加密等功能就可以在应用程序B里面做进去,
tun/tap设备最常用的场景是VPN,包括tunnel以及应用层的IPSec等

问: tun和tap的区别?
Linux虚拟网络设备之tun/tap - SegmentFault 思否
用户层程序通过tun设备只能读写IP数据包,
而通过 tap设备能读写链路层数据包,
类似于普通socket和raw socket的差别一样,处理数据包的格式不一样。
 

1.gretap的网络拓扑图

虚拟网络gretap创建实例与流程分析_第1张图片

2.创建命令

准备:点对点网络,需要准备两台linux 系统设备。

2.1 本端创建命令实例

LOCAL_IP=10.12.100.222 #本端ip
REMOTE_IP=10.12.100.153 #对端ip
TUNNEL_NAME=gretap1 #自定义gretap 隧道名
#创建GRE 隧道
ip link add name ${TUNNEL_NAME} type gretap remote ${REMOTE_IP} local ${LOCAL_IP}
ip link set ${TUNNEL_NAME} up mtu 1462

GRE_BR=br1
brctl addbr $GRE_BR
ip link set $GRE_BR up
brctl addif ${GRE_BR} ${TUNNEL_NAME}

#3.将对应的设备挂载到桥br1 上
brctl addbr $GRE_BR wl1
brctl addbr $GRE_BR eth0

2.2 对端创建命令实例

LOCAL_IP=10.12.100.153 #对端ip
REMOTE_IP=10.12.100.222
TUNNEL_NAME=gretap1
#1.创建GRE 隧道
ip link add name ${TUNNEL_NAME} type gretap remote ${REMOTE_IP} local ${LOCAL_IP}
ip link set ${TUNNEL_NAME} up mtu 1462

#2.将gretap1 挂载到桥br1 上
GRE_BR=br1
brctl addbr $GRE_BR
ip link set $GRE_BR up
brctl addif ${GRE_BR} ${TUNNEL_NAME}

3.测试

1.在remote br1上开启DHCP服务,本端eth0接入的设备获取ip成功. → 网络模型正确
2.在remote br1 挂载以太网 ethx设备, 本端eth0 ping ethx_ip 成功. → 局域网访问成功
3.在remote 添加对应的iptables NAT, ip ro规则, 本端通过wl1 ssid AP上网成功. → 业务正常
 

4.原理说明

使用网桥的特性 -->有待确认
网桥的转发规则是,网桥从x端口接收到一个帧:
        ①搜索数据库确定MAC地址是不是在一个端口port上面;
        ②如果没有找到这个MAC地址,那么把该帧泛洪flooding到所有端口(x除外);
        ③如果找到了MAC地址对应应该发往y端口,那么检查y,如果y不处于阻塞态,那么就 从y端口发送,如果是阻塞态,那么不发送。

5.数据包过程分析

通过AP wl1接口的数据包流向
虚拟网络gretap创建实例与流程分析_第2张图片

通过以太网口 eth0接口数据流向

虚拟网络gretap创建实例与流程分析_第3张图片

6.gretap 封装 和 解封过程

注: 此处gretap封装示意图有误,具体看下图wireshar抓包。

gretap报文示意
虚拟网络gretap创建实例与流程分析_第4张图片

7.关于mtu的值讨论

gretap 报文头=gre:4 + mac:14 + ip:20 = 38
假设网关设备的WAN MTU 1500
则挂载br1上的设备eth0 的MTU合理值 1500-38 = 1462

分析:
1.假设eth0的mtu = 1500, eth0 发一个大小为1500的报文,经过gretap的封装(即+38 Bytes gretap头),大于WAN.mtu,导致在分片,影响发送速率。
2.假设eth0的mtu = 1462, 则刚好通过。

mtu的修改方案分析:
1.通过dhcp server option 26(interface-mtu)

2.可以通过修改${TUNNEL_NAME} mtu值,功能生效。-->此处原理未知,  对发送速率影响未验证
eth0.mtu = 1500
br1.mtu = 1462
gretap1 = 1462
 

你可能感兴趣的:(网络,网络,linux,运维)