將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