Linux IP 隧道技术

2015-09-13 linux network

隧道是一种封装技术,它利用一种网络协议来传输另一种网络协议,即利用一种网络传输协议,将其它协议产生的数据报文封装在它自己的报文中,然后在网络中传输。

隧道可以看做是一条虚拟的点对点连接,隧道的两端需要对数据报文进行封装及解封装,常用的是基于 IP 的隧道。

在此简单介绍下隧道技术。

隧道技术

隧道技术就是指包括数据封装、传输和解封装在内的全过程。

tunnel tecnology

Linux 内核支持的 tunnel 有 ipip、gre、sit,另外,还包括了其它非内核隧道的几种。其中 ipip 是最简单的一种隧道;gre 是对 ipip 的一种改进;sit 的作用是连接 ipv4 与 ipv6 的网络。另外,以上所有隧道都需要内核模块 tunnel4.ko 的支持。

在内核之外,还有很多实现隧道的方法,最有名的是 PPP 和 PPTP。

IP-in-IP

ipip 需要内核模块 ipip.ko,可以通过 modinfo ipip 查看该内核模块的相关信息。

该模式的特点是:A) 只是连接了两个一般情况下无法直接通讯的 IPv4 网络而已,简单有效;B) 不能通过 IPIP 隧道转发广播或者 IPv6 数据包。

                                         INTERNET
| 192.168.100.0/24 | 211.167.237.218 |<------------>| 123.127.177.195 |192.168.200.0/24 |
       eth0                eth1                            eth1              eth0

网络结构如上,现在就依据上面的结构来建立 tunnel 。

----- 在211.167.237.218上
# modprobe ipip
# ip tunnel add tun1 mode ipip remote 123.127.177.195 local 211.167.237.218 ttl 64
# ip link set tun1 mtu 1480 up
# ip address add 192.168.200.253 brd 255.255.255.255 peer 123.127.177.195 dev tun1
# ip route add 192.168.200.0/24 via 192.168.200.253

----- 在123.127.177.195上
# modprobe ipip
# ip tunnel add tun1 mode ipip remote 211.167.237.218 local 123.127.177.195 ttl 64
# ip link set tun1 mtu 1480 up
# ip address add 192.168.100.253 brd 255.255.255.255 peer 211.167.237.218 dev tun1
# ip route add 192.168.100.0/24 via 192.168.100.253

其中需要注意的是:

mtu 会增加协议开销,因为它需要一个额外的 IP 包头,一般是每个包增加 20 个字节,如果一个网络的 MTU 是 1500 字节的话,使用隧道技术后,实际的 IP 包长度最长只能有 1480 字节了。因此,如果要使用隧道技术构建一个比较大规模的网络的话,就要仔细研究一下关于 IP 包的分片和汇聚的知识。

ttl 数据包的生存期,如果网络规模比较大就需要提高这个值,不过一般 64 是比较安全的。

Generic Routing Encapsulation, GRE

需要内核模块 ip_gre.ko ,同样可以通过 modinfo ip_gre 查看模块相关的信息。

gre 最初由 CISCO 开发的隧道协议,能够做一些 ipip 所不支持的功能,如多播以及 IPv6 数据包。使用 gre 与 ipip 的方式相同,只是加载的模块以及 mode 需要修改。