NAT64 (WrapSix) Tutorial

最近請人協助架設環境,但似乎進度不如預期。所以一怒之下(開玩笑的,我這人一向與人為善,您說是吧 ... ),就自己來架設NAT64的實驗環境,而這篇教學就是自己架設的過程紀錄。所以本篇文章告訴我們,少發脾氣比較好 ... (畫錯重點了吧

在紀錄相關實驗步驟的時候,先來說明一下什麼是NAT64。Wikipedia上的描述是:「NAT64 is a mechanism to allow IPv6 hosts to communicate with IPv4 servers.」簡單來說,就是讓IPv6的設備能夠連上傳統IPv4網路設備的機制。怎麼做呢?看到NAT這幾個字眼應該用猜的也猜的到,就是把封包的IPv6 Header替換成某個預先設定的IPv4 Header就完成了。這裡要特別強調的一點,這個技術是讓IPv6的設備能夠連上IPv4的設備,並不是讓IPv4的設備能夠連上IPv6的設備!理由呢?下面這個解釋是從TAYGA的網站上抄下來的:

It is technically impossible for a translation system operating purely at the IP layer to allow IPv4 hosts to establish connections to any arbitrary IPv6 server. Such a system would need to represent every IPv6 server on the Internet with a unique IPv4 address, which is clearly infeasible given the size of the IPv6 address space.

當然我個人有另外非技術的解釋,NAT64是為了讓過去已經存在的IPv4 Server可以繼續提供服務,而如果連Server都已經是IPv6了,現在的client大部份都有IPv6的介面了啊,直接用IPv6來溝通不就好了。

這邊的紀錄著重在於架設環境以及實驗,相關工具的程式碼解析不在範圍內(因為我沒有這麼多時間)。

1. 實驗環境

實驗環境的圖如下:


在這邊解釋一下NAT64的設定。IPv4和IPv6是指NAT64自己的IP位置設定,IPv6 Prefix指的是在網路中所有使用IPv4位置轉換成IPv6位置所使用的前置修飾,而Masquerade IPv4是說所有要連到IPv4設備的IPv6位置會被轉換成為這個Masquerade IPv4位置。如果還有不清楚的地方,之後的範例就可以很容易的看出來。這邊要特別紀錄一件事,那就是為什麼NAT64需要IPv4和IPv6的位置?明明整個實驗上看起來這兩個位置的設定更本毫無意義啊!這個問題其實困擾了我一段時間,直到看到了下面這段話:

It's used in ICMP error messages.

恩,那大概了解它要幹什麼了(所以還是要認真的看文件啊),簡單來說,我猜是要讓 kernel 來負責回答 ICMP Unreachable 的信息,所以才要在機器上來設定這兩個IP位置。

2. NAT64 架設

現在來看如何架設NAT64,在這裡我們所選用的是 WrapSix。理由呢?技術的理由不少,但真實的理由是學弟的推薦。

首先先從官網下載並解壓縮。然後要修改程式。修改程式?What?很簡單,因為這套軟體為了優化的緣故(或是說懶得寫設定檔),所有的設定直接寫在程式碼裡(簡單來說就是我常常警告同事的,非必要不準給我Hard Code在程式碼裏面)。要修改的地方有兩個,wrapper.c 和 wrapper.h,可以修改的內容如下:

  • INTERFACE    Interface on which WrapSix should operate, e.g. eth0.
  • PREFIX        NAT64 prefix; at least /96, the default is standard 64:ff9b::/96. Input it without the information about prefix length, i.e. just 64:ff9b::.
  • IPV4_ADDR    IPv4 address which is dedicated for WrapSix and is not assigned  to the host operating system.
  • HOST_IPV6_ADDR    IPv6 address which represents the host, i.e. which is assigned  to the operating system. It's used in ICMP error messages.
  • HOST_IPV4_ADDR    IPv4 address which represents the host, i.e. which is assigned  to the operating system. It's used in ICMP error messages.
  • MTU        Minimum MTU in your IPv6 network; default is 1280, but you can  set it to a greater value (up to 1500).
  • PACKET_BUFFER    Size of a buffer for incoming packets; it's strongly recommended to leave its value as is (i.e. 1514).
按照上面的設定,我所修改的部份如下:

/* +++ CONFIGURATION +++ */
#define INTERFACE "eth0"
#define PREFIX  "64:ff9b::"
#define IPV4_ADDR "192.168.8.167"
#define HOST_IPV6_ADDR "fd77::1:0:1"
#define HOST_IPV4_ADDR "192.168.8.64"
/* --- CONFIGURATION --- */


然後 ./configure 以及 make。我的個性是實驗的東西絕不 install 到系統上,所以我才不會下 make install呢!接下來是設定的部份。首先我們要把IPv4和IPv6的位置設定到機器上。本來我以為這個動作程式會幫我處理,但看了老半天,程式似乎沒有這功能,那就自己來吧。然後在動手之前請注意,現在大多數的 Linux Distribution 都有安裝 Network Manager 這個套件來管理網路設定,本來用這工具來設定也不是不行,但不如用指令來的直接(正確來說是,我懶的截圖...),所以我們要先把Network Manager停用,最容易的方式是透過Network Manager把eth0 off 掉就行了,還要把「當這個網路可用時自動連線」給取消掉。接下來就是設定IP位置:

$ sudo ifconfig 192.168.8.64
$ sudo ifconfig eth0 inet6 add fd77::1:0:1/96
$ sudo ./wrapsix

執行 wrapsix 後大功告成。

3. 設定 IPv6 Host 

在 IPv6 Host 上面只要設定 route就好了。

$
$ sudo route -A inet6 add 64:ff9b::/96 dev eth0

4. 設定 IPv4 Host

沒啥好設定的。

5. 測試

測試很簡單。只要用 IPv6 的 Host ping IPv4 的 Host 就完成了。要記得,雖然說是 ping IPv4 的 Host,這時候要 ping 的 IP 是 64:ff9b::c0a8:08a4 而不是 192.168.8.164 喔。綠色的部份為前置字串紅色的部份是192.168.8.164

$ ping6 64:ff9b::c0a8:08a4
PING 64:ff9b::c0a8:08a4(64:ff9b::c0a8:8a4) 56 data bytes
64 bytes from 64:ff9b::c0a8:8a4: icmp_seq=1 ttl=63 time=19.3 ms
64 bytes from 64:ff9b::c0a8:8a4: icmp_seq=2 ttl=63 time=0.599 ms
64 bytes from 64:ff9b::c0a8:8a4: icmp_seq=3 ttl=63 time=1.86 ms
^C
--- 64:ff9b::c0a8:08a4 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.599/7.279/19.370/8.565 ms

接下來是 NAT64 上面 wireshark 的截圖:



最後一個問題 ... 我做這件事要幹嘛呢?哈哈哈 ...

留言

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

我弟家的新居感恩禮拜分享:善頌善禱

Linux Virtual Interface: TUN/TAP