将IPv6数据包传输到IPv4连结不只有一种可能.
IPv6和IPv4的遂道定义在 RFC 2893 / Transition Mechanisms for IPv6 Hosts and Routers
必备条件:
当一个节点直接同另一个节点进行连结,在得到节点IPv4地址之前,节点就会执行遂道操作自动化.
它使用一个简单的机制实行Tunneling(遂道操作) RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds. 每个节点的global unique IPv4 (唯一全局地址)可以成为 6to4 tunnel 的终点(如果没有IPv4防火墙限制通讯). 6to4-Tunneling(遂道操作)不是专用于一对一的遂道, 这个案例可以分开针对upstream and downstream (上级和下级)的遂道操作. 同样,一个特别的IPv6地址会指出这个节点使用6to4-Tunnel同全世界的 IPv6 网路进行连结.
6to4 的地址像下面这样定义:(源自 RFC 3056 / Connection of IPv6 Domains via IPv4 Clouds)
__________________________________________________________________
| 3+13 | 32 | 16 | 64 bits |
+---+------+-----------+--------+--------------------------------+
| FP+TLA | V4ADDR | SLA ID | Interface ID |
| 0x2002 | | | |
+---+------+-----------+--------+--------------------------------+
FP是global addresses(全局地址)的前缀. TLA是top level aggregator(最高层集) V4ADDR是IPv4全局唯一地址((in hexadecimal notation). SLA是子网路标致(65536 local subnets possible). 这些前缀产生时的SLA 为"0000" 后缀是 "::1" 并分配到6to4 tunnel interface(界面).
节点知道向哪里发送含有IPv6数据包的IPv4数据包. 早期的6to4遂道,必须设定一个专用的上级路由器接受这种操作. 参照 NSayer's 6to4 information 里的路由列印. 现在 6to4上级路由器可以使用anycast address 192.88.99.1 它由后台的路由协议控制. 参照 RFC 3068 / An Anycast Prefix for 6to4 Relay Routers
The downstream (6bone -> your 6to4 enabled node) is not really fix and can vary from foreign host which originated packets were send to. There exist two possibilities: 它还没有正式修正对数据包来源的确定, 存在以下两种可能:
用法:
# /sbin/ip -6 tunnel show [<device>]
例子:
# /sbin/ip -6 tunnel show
sit0: ipv6/ip remote any local any ttl 64 nopmtudisc
sit1: ipv6/ip remote 195.226.187.50 local any ttl 64
用法:
# /sbin/route -A inet6
例子:只列印从sit0界面通过的遂道.
# /sbin/route -A inet6 | grep "\Wsit0\W*$"
::/96 :: U 256 2 0 sit0
2002::/16 :: UA 256 0 0 sit0
2000::/3 ::193.113.58.75 UG 1 0 0 sit0
fe80::/10 :: UA 256 0 0 sit0
ff00::/8 :: UA 256 0 0 sit0
有3种方法可以加入/移除point-to-point tunnel
目前针对少量tunnels的方法
设定tunnel device (它不会立既启用.TTL必须指定, 因为初始值是0)
# /sbin/ip tunnel add < device > mode sit ttl < ttldefault > remote
? < ipv4addressofforeigntunnel > local < ipv4addresslocal >
用法(这个例子中有三个遂道)
# /sbin/ip tunnel add sit1 mode sit ttl <ttldefault> remote
? <ipv4addressofforeigntunnel1> local <ipv4addresslocal>
# /sbin/ip set dev sit1 up
# /sbin/ip -6 route add <prefixtoroute1> dev sit1 metric 1
# /sbin/ip tunnel add sit2 mode sit ttl <ttldefault>
? <ipv4addressofforeigntunnel2> local <ipv4addresslocal>
# /sbin/ip set dev sit2 up
# /sbin/ip -6 route add <prefixtoroute2> dev sit2 metric 1
# /sbin/ip tunnel add sit3 mode sit ttl <ttldefault>
? <ipv4addressofforeigntunnel3> local <ipv4addresslocal>
# /sbin/ip set dev sit3 up
# /sbin/ip -6 route add <prefixtoroute3> dev sit3 metric 1
不推荐一次就 Non Broadcast Multiple Access (NBMA)这么多,因为您如果只想关闭第一个但又要让其它的继续运行,有点难啊.只加一个是没有问题的.
# /sbin/ifconfig sit0 up
# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel1>
# /sbin/ifconfig sit1 up
# /sbin/route -A inet6 add <prefixtoroute1> dev sit1
# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel2>
# /sbin/ifconfig sit2 up
# /sbin/route -A inet6 add <prefixtoroute2> dev sit2
# /sbin/ifconfig sit0 tunnel <ipv4addressofforeigntunnel3>
# /sbin/ifconfig sit3 up
# /sbin/route -A inet6 add <prefixtoroute3> dev sit3
警告:这样做有很大的风险, 因为任何人可以从Internet的任何地点使用"automatic tunneling"同您进行连结.我不推荐您这样做.
当然可以设定tunnel使用 Non Broadcast Multiple Access (NBMA)非多地址广播的方式 这种方法可以一次就加入很多tunnel. 使用方法 (三个tunnel的基本例子):
# /sbin/ifconfig sit0 up
# /sbin/route -A inet6 add <prefixtoroute1> gw
? ::<ipv4addressofforeigntunnel1> dev sit0
# /sbin/route -A inet6 add <prefixtoroute2> gw
? ::<ipv4addressofforeigntunnel2> dev sit0
# /sbin/route -A inet6 add <prefixtoroute3> gw
? ::<ipv4addressofforeigntunnel3> dev sit0
警告:这样做有很大的风险, 因为任何人可以从Internet的任何地点使用"automatic tunneling"同您进行连结.我不推荐您这样做.
手工方式不经常使用,可以用scripts移除/重新设定IPv6tunnels
移除遂道设备的用法:
# /sbin/ip tunnel del <device>
Usage (三个tunnel的基本例子):
# /sbin/ip -6 route del <prefixtoroute1> dev sit1
# /sbin/ip set sit1 down
# /sbin/ip tunnel del sit1
# /sbin/ip -6 route del <prefixtoroute2> dev sit2
# /sbin/ip set sit2 down
# /sbin/ip tunnel del sit2
# /sbin/ip -6 route del <prefixtoroute3> dev sit3
# /sbin/ip set sit3 down
# /sbin/ip tunnel del sit3
Usage (三个tunnel的基本例子):您必须反向移除它们, 也就是先建立的必须先移除.
# /sbin/route -A inet6 del <prefixtoroute3> dev sit3
# /sbin/ifconfig sit3 down
# /sbin/route -A inet6 del <prefixtoroute2> dev sit2
# /sbin/ifconfig sit2 down
# /sbin/route -A inet6 add <prefixtoroute1> dev sit1
# /sbin/ifconfig sit1 down
# /sbin/ifconfig sit0 down
移除IPv6路由. 使用方法 (三个tunnel的基本例子):
# /sbin/route -A inet6 del <prefixtoroute1> gw
? ::<ipv4addressofforeigntunnel1> dev sit0
# /sbin/route -A inet6 del <prefixtoroute2> gw
? ::<ipv4addressofforeigntunnel2> dev sit0
# /sbin/route -A inet6 del <prefixtoroute3> gw
? ::<ipv4addressofforeigntunnel3> dev sit0
# /sbin/ifconfig sit0 down
有时需要设定一个point-to-point 遂道 和IPv6地址, 但方法中只有第一个(ifconfig+route - deprecated)和第三个(ip+route)可行. 在这些案例中您可以加入一个IPv6地址到 tunnel interface(用于遂道操作的那个界面)
注意:6to4 tunnels 目前缺乏vanilla 2.2.x系列核心的支持. 同样要注意的是6to4地址的前缀长度是16 所有的 6to4 主机都在相同的第二层.
首先, 您必须用可路由的本地IPv4 global 地址来计算 6to4 的前缀. (如果您的主机没有可路由的本地IPv4 global 地址, 在闸道边缘的NAT地址也行 in special cases NAT on border gateways is possible):
假定您的IPv4地址为:
1.2.3.4
产生的6to4 prefix(前缀)为 :
2002:0102:0304::
本地的 6to4 闸道需要手工设定后缀为"::1", 因此您的6to4地址就成为:
2002:0102:0304::1
以下依据指定的IPv4地址产生6to4地址:
ipv4="1.2.3.4"; printf "2002:%02x%02x:%02x%02x::1" `echo $ipv4 | tr "." " "`
目前有两种方法可以设定6to4遂道
这是被推荐的做法. 创建一个遂道设备.
# /sbin/ip tunnel add tun6to4 mode sit remote any local <localipv4address>
Bring interface up(激活它)
# /sbin/ip link set dev tun6to4 up
将本地6to4地址加入到界面.(注意:它的前缀长度必须是16)
# /sbin/ip -6 addr add <local6to4address>/16 dev tun6to4
加入一个用all-6to4-routers IPv4 anycast 地址作为到达global IPv6 网路的路由(缺省的路由)
# /sbin/ip -6 route add 2000::/3 via ::192.88.99.1 dev tun6to4 metric 1
不被推荐是因为tunnel device sit0 不支持特别的过虑器应用在每个设备上.
Bring generic tunnel interface sit0 up(将界面sit0激活)
# /sbin/ifconfig sit0 up
Add local 6to4 address to interface(向界面添加本地 6to4 地址)
# /sbin/ifconfig sit0 add <local6to4address>/16
加入一个用all-6to4-relays IPv4 anycast地址作为到达global IPv6 网路的路由(缺省的路由)
# /sbin/route -A inet6 add 2000::/3 gw ::192.88.99.1 dev sit0
从dedicated tunnel device 移除所有路由
# /sbin/ip -6 route flush dev tun6to4
Shut down interface(关闭界面)
# /sbin/ip link set dev tun6to4 down
Remove created tunnel device(移除遂道设备)
# /sbin/ip tunnel del tun6to4
移除 6to4 界面上遂道的路由
# /sbin/route -A inet6 del 2000::/3 gw ::192.88.99.1 dev sit0
Remove local 6to4 address to interface(从界面移除本地 6to4 地址)
# /sbin/ifconfig sit0 del <local6to4address>/16
并闭 generic tunnel device (当心, 可能它还在使用当中)
# /sbin/ifconfig sit0 down