【NAT64】[Jool] Linuxだけで実装するNAT64(設計・構築編)

# 1. はじめに
去る2016.08.20に開催されました[iOSDC(iOS Developers conference)](https://iosdc.jp/2016/)にて、
このカンファレンスで使えるWi-Fiネットワークの構築に[CONBU](https://conbu.net/)メンバーとして参画し、
ありがたくもNAT64の実装に携わってきました。
聞くところによりますと、([省略:前回記事をご覧ください](http://qiita.com/onifinger/items/618541416efa014daefc))

概要編ではJoolというNAT64コンポーネントを採用したと述べました。
本記事ではJoolを構築し動かすまでを記載します。

Jool: https://jool.mx/en/index.html
なお、手順は公式ページのInstallationに概ね準拠しています。

また、iOSとIPv6とのトピックはiOSDC関連まとめの中では
結構なヒット作となっておられます、以下もご覧いただけるとより楽しめるかと思います。
 # IPv6に関するプログラミングアンチパターンが面白いんじゃよ。

[■IPv6 Readyって何?NAT64/DNS64徹底解説](http://togetter.com/li/1014169)
[■上記の発表資料はこちら](http://www.slideshare.net/smadako/ipv6-ready-nat64dns64-iosdc-b)


# 2. 構築環境

|items|version|notes|
|---|---|---|
|Linux OS|ubuntu 14.04.5 LTS|母艦OS|
|kernel release|4.2.0-27-generic|kernel moduleなので明記|
|Jool|3.4.4|2016/07時点latest|
|git|1.9.1|Joolのcloneに|

ちなみに、dockerizeにも挑戦しましたが、
ubuntuのofficial docker imageのkernel versionに対応する
kernel headerを見つけきれずに断念しました。未熟未熟ゥ！

# 3. 設計
[これ](https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/art/NAT64-DNS64-Workflow_2x.png)を見つつ、Joolの役割を考えると
「DNS64で付与されたwell-known-prefix向けの通信をipv4に変換するGW」
として機能させればよいことがわかります。
well-known-prefixとは64:ff9b::/96になります。
dest IPが64:ff9b::/96の通信を吸い込んでIPv4にNATしてやるという挙動です。

そのため、以下の項目を設計します。

+ クライアント通信受信用IPv6アドレス
+ Joolのインターネットアクセス用IPv4アドレス
    + 上記を踏まえNICは2つ必要
+ IPv6通信用GW
+ IPv4通信用GW
+ 周辺の設計として64:ff9b::/96宛の通信をJool稼働マシンにrouting

# 4. 構築
大まかな構築項目は以下の3つです。

1. 必要なパッケージのインストール
2. Joolのインストール
3. Jool ユーザスペースアプリのインストール

これに沿って進めていきます。

#### 1. 必要なパッケージのインストール
+ OSのアップデート・アップグレード
セキュリティ対策的な感じでやっておきます。

    ```bash
    $ sudo apt-get update
    $ sudo apt-get upgrade
    ```

+ パッケージインストール
必要なパッケージは次の通りです。

    |name|way to use|
    |---|---|
    |git|Joolのcloneに|
    |dkms|kernel moduleのインストールに利用|
    |build-essential|[公式](https://jool.mx/en/install-mod.html#requirements)準拠|
    |linux-headers|[公式](https://jool.mx/en/install-mod.html#requirements)準拠|
    |autoconf|ユーザスペースアプリインストールに必要|
    |pkg-config|同上|
    |libnl-3-dev|同上|

    インストールコマンドはこんな感じでババッと。

    ```bash:パッケージインストール
    $ sudo apt-get install git
    $ sudo apt-get install dkms
    $ sudo apt-get install build-essential
    $ sudo apt-get install linux-headers-$(uname -r)
    $ sudo apt-get install autoconf
    $ sudo apt-get install pkg-config
    $ sudo apt-get install libnl-3-dev
    ```

#### 2. Joolのインストール
+ Joolの取得とインストール
    ホームディレクトリにcloneしてしまってよいです。
    そのあとはdkmsでインストールします。

    ```bash:Joolのインストール
    $ cd
    $ git clone https://github.com/NICMx/Jool.git
    $ sudo dkms install Jool
    ```

#### 3. Jool ユーザスペースアプリのインストール
+ ユーザスペースアプリとは?
    Joolの起動状態やセッションテーブル等を確認するためのツール(コマンド群)です。
    [こう書いてある](https://jool.mx/en/install-usr.html)ので、直訳しただけ。

+ インストール
    [公式通り](https://jool.mx/en/install-usr.html#compilation-and-installation)こういう感じで、サックリと
だと不親切すぎるので、ちょっと解説します。
git cloneしたフォルダ構成のうち、Jool/usr配下にユーザスペースアプリインストール用の資材が格納されています。
ですので、cd Jool/usrした後に以下コマンドでインストール。

    ```bash:ユーザスペースアプリのインストール
    $ cd ~/Jool/usr
    $ ./autogen.sh
    $ ./configure
    $ make
    $ sudo make install
    ```

起動方法ですが、

```bash
$ sudo modprobe jool pool6=64:ff9b::/96 pool4=$YOUR_IPV4_ADDR
```

で起動します。
sudo make installしたので、root権限が必要です。

以下のコマンド・出力を得られれば、ユーザスペースアプリも正常に動いています。
ユーザスペースアプリも、sudo権限が必要なコマンドがあります。

```bash
$ sudo jool -s
~~ (中略) ~~
TCP:
---------------------------------
(empty)
UDP:
---------------------------------
(empty)
ICMP:
---------------------------------
(empty)
```

# 5. つづく
ここまではよかったんですが、さすがに色々チューニングしました。
運用ってほんとうに大事ですね。というわけで、
まじめにほんとうに大事な運用周りは[次回記事](http://qiita.com/onifinger/items/45390f414db23adcf2b9)で。