2013/01/23に掲載された記事です
明日 1月24日(木) と 1月25日(金) の2日間、JANOG 31 ミーティングが開催されます。
今回の JANOG 31 の一環で「MAP-E クラウドテストラボ(https://www.janog.gr.jp/wg/softwire-wg/?page_id=180)」が JANOG Softwire WG の方々によって提供されています。 このテストラボは「実際に MAP-E (*1) の動作している装置を触ってみたい」という参加者向けに構築されました。
その MAP-E に対応した実装の一つとして、 SEIL/x86 に MAP-E を試験実装したファームウェアを提供しています。MAP-E クラウドテストラボは、「さくらのクラウド」を利用しており、そのプラットフォーム上で SEIL/x86 が動作しています。
本記事では MAP-E クラウドテストラボで SEIl/x86 MAP-E 実装の動作を試してみる方法を簡単にご紹介します。
この画像は JANOG Softwire WG のウェブサイトから引用させていただいております。
引用元: http://www.janog.gr.jp/wp/softwire-wg/?page_id=180
参加申し込みをする
まず MAP-E クラウドテストラボ(https://www.janog.gr.jp/wg/softwire-wg/?page_id=180)のページの「利用条件」を確認して、参加申し込みを行ってください。するとテストサーバと MAP-E CE/BR にログインできるアカウント情報がメールで送付されてきます。
MAP-E クラウドテストラボに接続する
ここでは MAP-E を通して、Web ページの取得が行えることと、telnet を利用して、MAP-E CE の NAPT セッションを確認する方法についてご紹介します。
簡単な流れとしては以下の手順です。なお実験に際しては、実験用のサーバの端末と MAP-E CE の端末を開いておくことをお勧めします。
- 踏み台サーバに SSH でログインした後、CE 配下の実験用サーバにログインする
- 踏み台サーバから、MAP-E CE にログインする
- MAP-E を通して、Web ページの取得を行う
- TCP セッションを確立して、MAP のステータスを参照する
まずは、踏み台サーバにログインします。
$ ssh user@133.242.63.165
その後にテストサーバ、MAP-E CE#2 にそれぞれログインします。
# 踏み台サーバからテストサーバにログイン
[user@sv-mgmt ~]$ ssh user@192.168.255.12
# 踏み台サーバから MAP-E CE#2 (SEIL/x86) にログイン
[user@sv-mgmt ~]$ ssh user@192.168.255.22
MAP-E 越しに通信してみる
それではテストサーバから wget コマンドを利用して HTTP を接続してみます。
ここでは IPv4 の HTTP 通信を強制するため、"-4" オプションを付けています。
[user@sv2 ~]$ wget -4 http://www.iij.ad.jp/index.html
--2013-01-22 15:05:52-- http://www.iij.ad.jp/index.html
www.iij.ad.jp をDNSに問いあわせています... 210.130.137.80
www.iij.ad.jp|210.130.137.80|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
... (省略)
index.html ファイルが問題なく取得できました。
このコマンドを実行することで IPv4 による HTTP の通信が行えることは確認できましたが、これだけでは通常の IPv4 インターネット接続との違いがわからないため、次に MAP-E CE#2 で生成された TCP の NAPT セッションを確認してみます。
テストサーバから前述のサーバの 80 番ポートに対し、telnet コマンドで TCP 接続を行います。こちらも IPv4 で接続させるため、ホスト名ではなく IPv4 アドレスで指定しています。 (*2)
[user@sv2 ~]$ host www.iij.ad.jp
www.iij.ad.jp has address 210.130.137.80
www.iij.ad.jp has IPv6 address 2001:240:bb42:b000::1:80
[user@sv2 ~]$ telnet 210.130.137.80 80
Trying 210.130.137.80...
Connected to 210.130.137.80.
Escape character is '^]'.
接続ができた後はテストサーバ側の端末はそのままにしておき、MAP-E CE#2 上で show status frd コマンドを実行してみます。
mape-ce2> show status frd
Forwarding Status:
Interface: frd0
Mode: CE (mesh)
CE IPv6 Address: 2001:e40:10c:2200:85:f23f:b200:200
CE Shared IPv4 Address: 133.242.63.178
EA-bits: 34 (0x22)
Available Ports:
Number of ports: 3840
Port-set ID: 0x2
Bit representation: |xxxx|0010|yyyyyyyy| (xxx>=1, yyy>=0)
Port-set-1: 4608 - 4863
Port-set-2: 8704 - 8959
Port-set-3: 12800 - 13055
... ...
Port-set-15: 61952 - 62207
Default Mapping Rule:
BR IPv6 Address: 2001:e40:10c::cafe
Mapping Rule #0 (Basic Mapping Rule):
Rule IPv6 prefix: 2001:e40:10c::/48
Rule IPv4 prefix: 133.242.63.176/28
Rule EA-bits length: 8
Sharing ratio: 16
PSID offset: 4
Used: 227
Port Number Usage:
Top 10 Assigned Port Numbers:
133.242.63.178:61984(TCP) assigned to 1 sessions
Summary:
1 TCP port numbers assigned to 1 sessions
0 UDP port numbers assigned to 0 sessions
0 ICMP ID assigned to 0 sessionss
Total 1 sessions
「Port Number Usage:」の項を見ると実際に MAP 用の NAPT セッションが生成されていることが確認できるかと思います。これで MAP-E を通して IPv4 の通信が行われていることが確認できます。
show status frd の読み方
さて、MAP-E CE#2 に NAPT セッションが生成されていることが確認できました。
133.242.63.178:61984(TCP) assigned to 1 sessions
まず、IP アドレス 133.242.63.178 は MAP-E のルールから生成された共有アドレスです。
このことは
この行は、IP アドレス 133.242.63.178 の TCP ポート番号 61984 が 1つの NAPT セッションにアサインされたことを表しています。この IP アドレスとポート番号のアサイン方法が MAP-E プロトコルの重要な点です。
CE Shared IPv4 Address: 133.242.63.178
から確認できます。そしてこのアドレスはルール(Mapping Rule #0) とこの MAP-E CE の IPv6 アドレスから決まります。
今回の MAP-E 実験ネットワークではルールはひとつだけ定義されています:
Mapping Rule #0 (Basic Mapping Rule):
Rule IPv6 prefix: 2001:e40:10c::/48
Rule IPv4 prefix: 133.242.63.176/28
Rule EA-bits length: 8
Sharing ratio: 16
PSID offset: 4
このルールを MAP-E CE#2 の IPv6 アドレス
CE IPv6 Address: 2001:e40:10c:2200:85:f23f:b200:200
と比較します。
MAP-E では Rule IPv6 prefix の後の数ビットを EA-bits と呼び、MAP-E CE の 識別子として使います。
今回は Rule IPv6 prefix が 48 ビット長で Rule EA-bits length が 8 ビットのため、CE IPv6 Address (=2001:e40:10c:2200:85:f23f:b200:200) の 49ビット目から56ビット目が EA-bits にあたり、すなわち EA-bits = 0x22、10進数で 34 となります。
このことは
EA-bits: 34 (0x22)
で確認できます。
そして EA-bits の上位数ビットと Rule IPv4 prefix から Shared IPv4 Address が決まります。今回は Rule IPv4 prefix が /28 ですから、EA-bit の上位4ビット分を持ってきて、
133.242.63.176 + 0x2 = 133.242.63.178
が Shared IPv4 Address となります。
CE Shared IPv4 Address: 133.242.63.178
そして EA-bits の残りの下位 4ビット(0x2)は PSID (Port-set ID) と呼ばれ、NAPT のために使えるポート番号の算出に使われます。
Port-set ID: 0x2
ルールの PSID offset が 4 ですから、16ビットのポート番号のうち、PSID は上位から 4ビット分オフセットしたところに置かれます。Bit representation の表示で上位から 5-8 ビット目が PSID のビットパターン(0x2 = 0b0010)で固定されていることを確認してみてください。
Bit representation: |xxxx|0010|yyyyyyyy| (xxx>=1, yyy>=0)
さきほど作られた HTTP の NAPT セッションのポート番号 61984 は 16 進数と 2進数でそれぞれ 0xf220 と 0b1111001000100000 と書けて
Bit representation | xxxx | 0010 | yyyy yyyy |
| 1111 | 0010 | 0010 0000 | (= 0xf220 = 61984)
と書けて、Bit representation に合致していることがわかります。
最後に
この記事では、SEIL を例とした MAP-E クラウドテストラボでの簡単な利用方法をご紹介しました。他にも様々な実験を行えると思います。
- hping などで NAPT セッションを複数生成してみて、変換後のポート番号が MAP-E CE に割り当てられた範囲内のポート番号になっているか確認する
- MAP-E はカプセル化を行っているプロトコルのため、MTU, TCP-MSS 周りの確認をしてみる
- などなど ...
なお今回の JANOG 31 では、ブースの出展を行っています。新サービス (*3) の展示を行っていますので、ぜひお越しください。*1: Mapping of Address and Port(MAP)-Encapsulation の略. MAP の仕様には、過去に Encapsulation 方式(MAP-E)の他に Translation 方式(MAP-T)も規定されていました。現在の draft からは MAP-E, MAP-T という名称は削除されています。今回は Encapsulation 方式の試験を行うことを目的としているため、MAP-E と表記しています。MAP の詳細な仕様は、こちらの draft を参照してください. (http://tools.ietf.org/html/draft-ietf-softwire-map-02)
*2: Linux の telnet コマンドは、IPv4 で接続をするための "-4" オプションが用意されていないため、IPv4 アドレスを直接指定するようにしています。