[b:a2f8d71912]用Iproute2配置隧道[/b:a2f8d71912]
Simone Piunno 著 wqch 翻译
[size=18:a2f8d71912]1、Iproute2简介[/size:a2f8d71912]
Iproute2是一个在Linux下的高级网络管理工具软件。实际上,它是通过rtnetlink sockets方式动态配置内核的一些小工具组成的,从Linux2.2内核开始,Alexey Kuznetsov 实现了通过rtnetlink sockets用来配置网络协议栈,它是一个现代的强大的接口。
Iproute2最吸引人的特色就是它用完整而有机制的简单命令替代了之前以下命令的功能,如ifconfig,arp,route,iptunnel,而且还添加了其它不少的功能。
如今,Iproute2已经在很多主要的发行版里被默认安装,即使他们的初始化脚本命令被嵌入在一些老的网络工具包里,如ifconfig,以及少用的iptunnel。如果你的发行版没有包含这个重要的工具包,你也可以从网上下载并自己编译。下载地址ftp://ftp.inr.ac.ru/ip-routing/。
在写这篇文章的时候,Iproute2最大的缺点就是缺乏相关的说明文档,然而,它的IP命令语法的简单而且还很象英语,这在很大程度上对说明文档做了相应的补偿。相信习惯于ifconfig和route命令的人不愿意在用ip的时候遇到任何困难,而且他们会觉得自己象在家里用一样。本文假设读者已经有一定的网络基础,并且已经在Linux中用过ifconfig和route命令。
[size=18:a2f8d71912]2、隧道简介[/size:a2f8d71912]
我们想像一下在二个网络节点间要进行数据通信的问题,如果这二个节点在不同于IPv4的协议上传输,或者用非全球可用IP地址直接传送到一个私有局域网LAN中。为了解决这类问题,典型的是在两个节点间用虚拟的点对点连接,我们称之为隧道结构。
你可以把在网络上传输的每个数据包想像为一个信封,它里面有几个字节,外面还写上了发送者和接收者的地址。隧道把这个信封简单的隐藏在另一个不同的发送者和接收者的信封里面,有效的进行数据包的传送。当数据包到达外部接收者(写在最外面的信封上的接收者)的时候,就把这个外部信封去掉并扔了,所以这个时候的信封(数据包)可以继续被传送到它的真正目的地。
封装和拆分附加信封的节点被叫做端点,它们需要一个全球可用的IPv4地址。这就是为什么当经过网络地址转换(NAT)时隧道就不能用了。而且,如果构建一个通过防火墙的隧道,那么防火墙就必须特殊配置来允许隧道传输。
一个典型的隧道应用就是通过一个纯IPv4网络来连接二个IPv6节点。这二个节点可以通过构建一个伪装的点到点IPv6连接的IPv6-in-IPv4隧道,这种方式可以把二个IPv6岛连接在一起(6bone就是通过这样一种网络隧道的方式工作的)。IPv6-over-IPv4传输隧道有二种方式:自动配置(详见RFC2373)和人工配置,本文将讨论的是后者——人工配置。
[size=18:a2f8d71912]3、创建隧道[/size:a2f8d71912]
用Iproute2构建隧道是很容易的事情。首先,你需要为隧道命一个名,如果你把隧道名字选择用foo,此时,你可以用如下命令来建立SIT模式的隧道:
ip tunnel add foo mode sit remote 192.168.1.42
以这种方式,将IPv4地址为192.168.1.42的远程端点也建一个SIT模式的IPv6-in-IPv4隧道。注意,我们还没有指定那个IP地址来用这个本地隧道,以及那个接口等等,这些结果可以通过命令ip tunnel show 来看到:
[root@abulafia root]# ip tunnel show
sit0: ipv6/ip remote any local any ttl 64 nopmtudisc
foo: ipv6/ip remote 192.168.1.42 local any ttl inherit
我们创建的隧道在第二行。现在需要看看所有可用接口的列表,不管他们是真正的网络适配器还是模拟的:
[root@abulafia root]# ip link show
1: lo: <loopback,up> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <broadcast,multicast,up> mtu 1500 qdisc pfifo_fast qlen 100
link/ether 00:48:54:1b:25:30 brd ff:ff:ff:ff:ff:ff
4: sit0@none: <noarp> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0
6: foo@none: <pointopoint,noarp> mtu 1480 qdisc noop
link/sit 0.0.0.0 peer 192.168.1.42
事实上需要注意的是lo和eth0是被标志为up,说明是已经激活,而隧道没有。为了再次检查,用ifconfig查看:
[root@abulafia root]# ifconfig
eth0 link encap:ethernet hwaddr 00:48:54:1b:25:30
inet addr:192.168.0.1 bcast:192.168.0.255 mask:255.255.255.0
inet6 addr: fe80::248:54ff:fe1b:2530/10 scope:link
up broadcast running multicast mtu:1500 metric:1
rx packets:0 errors:0 dropped:0 overruns:0 frame:0
tx packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
rx bytes:0 (0.0 b) tx bytes:528 (528.0 b)
interrupt:9 base address:0x5000
lo link encap:local loopback
inet addr:127.0.0.1 mask:255.0.0.0
inet6 addr: ::1/128 scope:host
up loopback running mtu:16436 metric:1
rx packets:35402 errors:0 dropped:0 overruns:0 frame:0
tx packets:35402 errors:0 dropped:0 overruns:0 carrier:0