【网络】Linux 网络支持隧道

Linux 支持多种隧道,但是新用户可能搞不清它们之间的区别,无法因地制宜。本文简要介绍 Linux 内核中常用的隧道,没有代码。通过 iproute2 命令 ip link help 来查看隧道网卡的列表和某个隧道配置的帮助文档。

常用的隧道:

  • IPIP 隧道
  • SIT 隧道
  • ip6tnl 隧道
  • GRE and GRETAP
  • IP6GRE and IP6GRETAP
  • FOU
  • GUE
  • GENEVE
  • ERSPAN and IP6ERSPAN

IPIP 隧道

正如其名,IP over IP 的隧道,RFC 2003

通常用于通过 IPv4 公网连接两个内部的 IPv4 子网。开销最小但是只能传输 IPv4 单播流量,也就是说 无法 通过 IPIP 隧道多播。

IPIP 隧道同时支持 IP over IP 和 MPLS over IP。

注意:当 ipip 模块被加载时,或者 IPIP 设备首次被创建,Linux 内核将在每个命名空间中创建一个属性 local=anyremote=any 的默认设备 tunl0。当接收到 IPIP 协议的数据包时,如果不能找到匹配的设备,内核默认将它们发送至 tunl0

创建 IPIP 隧道:

On Server A:
# ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
# ip link set ipip0 up
# ip addr add INTERNAL_IPV4_ADDR/24 dev ipip0
Add a remote internal subnet route if the endpoints don't belong to the same subnet
# ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0 
On Server B: # ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR # ip link set ipip0 up # ip addr add INTERNAL_IPV4_ADDR/24 dev ipip0 # ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0

注意:根据实际环境替换 LOCAL_IPv4_ADDR、REMOTE_IPv4_ADDR、INTERNAL_IPV4_ADDR、REMOTE_INTERNAL_SUBNET。

SIT 隧道

SIT 即简单网络传输(Simple Internet Transition)。主要为了互连全球 IPv4 互联网中的隔离 IPv6 网络。

最初,它只有 IPv6 over IPv4 隧道模式。经过多年开发终于支持了几种不同的模式 ipip(和 IPIP 隧道一样)、ip6ipmplsipany。其中 any 模式用来同时接收 IPv4 和 IPv6 流量,在开发时很有用。SIT 隧道也支持 ISATA,这里有个用例

SIT 隧道头:

sit 模块被加载,Linux 内核将创建一个名为 sit0 的默认设备。

创建一个 SIT 隧道:

On Server A:
# ip link add name sit1 type sit local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR mode any
# ip link set sit1 up
# ip addr add INTERNAL_IPV4_ADDR/24 dev sit1

然后在远端再来一把。

ip6tnl 隧道

ip6tnl 是 IPv4/IPv6 over IPv6 的隧道,看起来有点像 SIT 隧道的 IPv6 版本。

ip6tnl 支持 ip6ip6ipip6anyipip6 模式是 IPv4 over IPv6,ip6ip6 是 IPv6 over IPv6,any 模式同时支持 IPv4/IPv6 over IPv6。

ip6tnl 模块被加载,Linux 内核会创建名为 ip6tnl0 的默认设备。

创建一个 ip6tnl 隧道:

# ip link add name ipip6 type ip6tnl local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR mode any

GRE 和 GRETAP

通用路由封装(Generic Routing Encapsulation),也称为 GRE,RFC 2784

GRE 隧道在内外的 IP 头之间添加了一个额外的 GRE 头。理论上,GRE 可以封装任何三层协议,而 IPIP 只能封装 IP 包。

注意,可以通过 GRE 隧道传输多播流量和 IPv6。

gre 模块被加载,Linux 内核将创建名为 gre0 的默认设备。

创建 GRE 隧道:

# ip link add name gre1 type gre local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR [seq] key KEY

当 GRE 隧道在 OSI 模型三层工作,GRETAP 在 OSI 模型二层工作,意味着在内部头中有个 Ethernet 头。

创建 GRETAP 隧道:

# ip link add name gretap1 type gretap local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR

IP6GRE 和 IP6GRETAP

IP6GRE 等价于 IPv6 版 GRE,这让我们可以通过 IPv6 封装任何第三层的协议。

IP6GRETAP,就像 GRETAP,在内部头中有一个 Ethernet 头:

创建 GRE 隧道:

# ip link add name gre1 type ip6gre local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR
# ip link add name gretap1 type ip6gretap local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR

FOU

隧道可以在网络栈的多个层级上。IPIP、SIT、GRE 隧道都在 IP 层,而 FOU(foo over UDP)是传输层的隧道。

使用 UDP 隧道的优势在于 UDP 可以与现有的硬件基础设置一起工作,像 NIC 中的 RSS,交换机中的 ECMP。开发者的补丁集显示 SIT 和 IPIP 协议的性能显著提高。

目前,FOU 隧道支持基于协议 IPIP,SIT 和 GRE 封装。

创建 FOU 隧道:

# ip fou add port 5555 ipproto 4
# ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap fou encap-sport auto encap-dport 5555

第一行命令设置 FOU 从 5555 端口接收 IPIP 数据包;GRE 的话就要设置 ipproto 47。第二行命令创建了一个新的用于 FOU 封装的 IPIP 虚拟网卡(tun1),目标端口是 5555。

注意:Red Hat Enterprise Linux 不支持 FOU。

GUE

Generic UDP Encapsulation (GUE) 是另一种 UDP 隧道。GUE 和 FOU 不同之处在于有着自己的封装头,包含了协议信息和一些其他数据。

目前,GUE 隧道支持内部封装 IPIP、SIT、GRE。

创建 GUE 隧道:

# ip fou add port 5555 gue
# ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap gue encap-sport auto encap-dport 5555

创建一个 CUE 从 5555 端口接收 IPIP 数据包,并为 GUE 封装配置一个 IPIP 隧道。

注意:Red Hat Enterprise Linux 不支持 GUE。

GENEVE

Generic Network Virtualization Encapsulation (GENEVE) 支持 VXLAN、NVGRE 和 STT,旨在克服它们的局限性。很多人认为 GENEVE 最终能够完全代替这些早期的格式。

看起来与 VXLAN 非常相似。主要的区别在于 GENEVE 头是弹性的。通过扩展新的 Type-Length-Value (TLV) 字段,可以轻松添加新功能。

Open Virtual Network (OVN) 使用 GENEVE 作为默认的封装。

创建 GENEVE 隧道:

# ip link add name geneve0 type geneve id VNI remote REMOTE_IPv4_ADDR

ERSPAN 与 IP6ERSPAN

Encapsulated Remote Switched Port Analyzer (ERSPAN) 使用 GRE 将基础端口镜像功能从二层扩展到三层,允许通过可路由的 IP 网络发送镜像流量。

ERSPAN 隧道允许 Linux 主机充当 ERSPAN 流量源,并将 ERSPAN 镜像流量发送到远程主机或 ERSPAN 目标,后者接收并解析从 Cisco 或其他有 ERSPAN 功能的交换机生成的 ERSPAN 数据包。此设置可以用于分析,诊断和探测恶意流量。

Linux 当前支持两个 ERSPAN 版本的绝大多数功能。

创建 ERSPAN 隧道:

# ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 1 erspan IDX
or
# ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 2 erspan_dir DIRECTION erspan_hwid HWID
Add tc filter to monitor traffic
# tc qdisc add dev MONITOR_DEV handle ffff: ingress
# tc filter add dev MONITOR_DEV parent ffff: matchall skip_hw action mirred egress mirror dev erspan1

总结

Tunnel/Link TypeOuter HeaderEncapsulate HeaderInner Header
ipipIPv4NoneIPv4
sitIPv4NoneIPv4/IPv6
ip6tnlIPv6NoneIPv4/IPv6
vtiIPv4IPsecIPv4
vti6IPv6IPsecIPv6
greIPv4GREIPv4/IPv6
gretapIPv4GREEther + IPv4/IPv6
ip6greIPv6GREIPv4/IPv6
ip6gretapIPv6GREEther + IPv4/IPv6
fouIPv4/IPv6UDPIPv4/IPv6/GRE
gueIPv4/IPv6UDP + GUEIPv4/IPv6/GRE
geneveIPv4/IPv6UDP + GeneveEther + IPv4/IPv6
erspanIPv4GRE + ERSPANIPv4/IPv6
ip6erspanIPv6GRE + ERSPANIPv4/IPv6
参考
https://blog.crazytaxii.com/posts/an_introduction_2_tunnel/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux内核的网络协议栈是指在操作系统内核中实现的一系列网络协议和功能。它负责处理网络数据包的收发、路由选择、协议解析等一系列操作,以实现网络通信和数据传输。 Linux内核的网络协议栈包括以下几个层次: 1. 网络接口层(Network Interface Layer):负责处理物理网络接口的驱动程序和硬件设备的通信。它提供了对底层网络设备的抽象,如以太网、Wi-Fi、蓝牙等。 2. 网络层(Network Layer):负责处理IP协议相关的操作,包括IP地址分配、路由选择和IP数据包的转发等。其中主要的协议有IPv4和IPv6。 3. 传输层(Transport Layer):负责处理端到端的数据传输,主要通过TCP(传输控制协议)和UDP(用户数据报协议)来实现。TCP提供可靠的、面向连接的数据传输,而UDP提供无连接的、不可靠的数据传输。 4. 应用层(Application Layer):负责处理特定应用程序的数据传输和协议,如HTTP、FTP、DNS等。应用层协议依赖于传输层和网络层的支持,通过这些协议实现应用程序之间的通信。 此外,Linux内核还提供了一些额外的功能,如网络地址转换(NAT)、防火墙(iptables)、网络隧道(Tunneling)等,以满足网络通信和安全的需求。 总之,Linux内核的网络协议栈是一个复杂而庞大的系统,通过不同层次的协议和功能实现了网络通信的各个方面。它为应用程序提供了丰富的网络功能,使得Linux成为一个强大的网络操作系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值