SEIL/x86 FujiによるNAT設定例(その１：NAPT/IPマスカレード)

#はじめに
**NAPT**は主にプライベートネットワークとグローバルネットワークをつなぐ際のアドレス変換に使用される技術です。
身近な例では、自宅のLANとインターネットを接続するブロードバンドルータの主な役割がこれにあたります。
**IPマスカレード**と言った方が、分かる方もいらっしゃると思います。

#環境
下図は本稿の前提環境です。
SEIL/x86を挟んで左側(192.168.10.0/24)がプライベート側(LAN側)。
右側(10.1.0.0/16)がグローバル側(WAN側)を想定しています。

|![SEIL_NATテスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476879/e1659569-c830-a7a8-b33b-331c0e198990.png)|
|:---:|

LAN側、WAN側の各ノード(PC)のネットワーク設定は以下の通りとします。

|PC|IPアドレス|サブネット|ゲートウェイ|
|:--:|:--:|:--:|:--:|
|LAN側|192.168.10.10|/24|192.168.10.254|
|WAN側|10.1.1.10|/16|10.1.1.1|

#設定
最初に、上記通りにSEILのインタフェイス設定を行います。

```
interface lan0 add 192.168.10.254/24
interface lan1 add 10.1.1.1/16
```


LAN側(192.168.10.0/24)からWAN側へ通信する際に、相手先にインタフェイスLAN1のグローバルアドレス(10.1.1.1)からのアドレスであるようにアドレス変換します。

```
nat napt add private 192.168.10.0-192.168.10.255 interface lan1
```
以上で設定は完了です。
#検証
LAN側のノードからWAN側のノードにPINGを実行して、その結果をパケットキャプチャ等を交えて検証します。
パケットキャプチャはSEILの**tcpdumpコマンド**を使用します。

###PING実行結果
LAN側ノード(192.168.10.10)からPINGを3回実行。WAN側のノード(10.1.1.10)と通信できているのが分かります。

```
[root@LAN1 Desktop]# ping -c 3 10.1.1.10
PING 10.1.1.10 (10.1.1.10) 56(84) bytes of data.
64 bytes from 10.1.1.10: icmp_seq=1 ttl=63 time=1.96 ms
64 bytes from 10.1.1.10: icmp_seq=2 ttl=63 time=0.533 ms
64 bytes from 10.1.1.10: icmp_seq=3 ttl=63 time=0.543 ms

--- 10.1.1.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.533/1.013/1.965/0.673 ms
[root@LAN1 Desktop]#
```

###SEIL/x86パケットキャプチャ結果(LAN側)
別セグメントとの通信なので、最初にゲートウェイ(192.168.10.254)のARPリクエストが飛び、その後PINGを3回実行しているのでICMPパケットが3往復しています。
宛先が別セグメント(10.1.1.10)のため、ゲートウェイのMACアドレスを確認するために最初にARPリクエストが発生しています。

```
SEILx86_02# tcpdump interface lan0
################################################################
tcpdump: when you want to exit this program, please type Ctrl-C.
################################################################
21:42:18.553204 ARP, Request who-has 192.168.10.254 tell 192.168.10.10, length 46
21:42:18.553297 ARP, Reply 192.168.10.254 is-at 00:0c:29:dd:ec:b3, length 28
21:42:18.553446 IP 192.168.10.10 > 10.1.1.10: ICMP echo request, id 30474, seq 1, length 64
21:42:18.553974 IP 10.1.1.10 > 192.168.10.10: ICMP echo reply, id 30474, seq 1, length 64
21:42:19.554172 IP 192.168.10.10 > 10.1.1.10: ICMP echo request, id 30474, seq 2, length 64
21:42:19.554518 IP 10.1.1.10 > 192.168.10.10: ICMP echo reply, id 30474, seq 2, length 64
21:42:20.554937 IP 192.168.10.10 > 10.1.1.10: ICMP echo request, id 30474, seq 3, length 64
21:42:20.555245 IP 10.1.1.10 > 192.168.10.10: ICMP echo reply, id 30474, seq 3, length 64
```

###SEIL/x86パケットキャプチャ結果(WAN側)
LAN側のキャプチャ結果と比較して、**ICMPパケットの発信元アドレスが10.1.1.1に変換されています**。
これによりNAPTが動作している事が分かります。

```
SEILx86_02# tcpdump interface lan1
################################################################
tcpdump: when you want to exit this program, please type Ctrl-C.
################################################################
21:42:18.553503 ARP, Request who-has 10.1.1.10 tell 10.1.1.1, length 28
21:42:18.553713 ARP, Reply 10.1.1.10 is-at 00:0c:29:b5:77:65, length 46
21:42:18.553748 IP 10.1.1.1 > 10.1.1.10: ICMP echo request, id 30474, seq 1, length 64
21:42:18.553934 IP 10.1.1.10 > 10.1.1.1: ICMP echo reply, id 30474, seq 1, length 64
21:42:19.554263 IP 10.1.1.1 > 10.1.1.10: ICMP echo request, id 30474, seq 2, length 64
21:42:19.554454 IP 10.1.1.10 > 10.1.1.1: ICMP echo reply, id 30474, seq 2, length 64
21:42:20.555045 IP 10.1.1.1 > 10.1.1.10: ICMP echo request, id 30474, seq 3, length 64
21:42:20.555211 IP 10.1.1.10 > 10.1.1.1: ICMP echo reply, id 30474, seq 3, length 64
```
###NAT動作状況の確認
SEILでは**show status nat**コマンドでNATの動作状況を確認できます。
以下のように、NAPTで192.168.10.10が10.1.1.1にアドレス変換され、10.1.1.10と通信している事が分かります。

```
SEILx86_02# show status nat
upnp is currently unavailable

List of active IP mapping:

List of active sessions:
   1:napt  lan1     icmp    192.168.10.10       =        10.1.1.1       <->       10.1.1.10       [00:00:00]
SEILx86_02#
```

#さいごに
NAPTはNAT環境を構築する際に、最も基本となる事が多い設定です。
これをベースに必要な設定を追加する事で、ルータの設定の幅を増やしていくのが良いでしょう。