SEIL/x86 FujiによるNAT設定例(その２：静的NAPT/ポートフォワード)

#はじめに
SEILで言う**静的NAPT**は、一般的にはポートフォワードと言った方が分かりやすいかもしれません。
前稿「[SEIL/x86によるNAT設定例(その１：NAPT/IPマスカレード)](https://qiita.com/inarmo/items/2b630b6222c9e464bcf8)」では、LAN側からWAN側にアドレス変換をして通信する設定を行いました。
本稿ではポートフォワードを使いWAN側からLAN側のノードに対して特定のポートを通す設定を行います。

#環境
下図は本稿の前提環境です。[前稿](https://qiita.com/inarmo/items/2b630b6222c9e464bcf8)と変わりありません。
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
```
ここまでは[前稿](https://qiita.com/inarmo/items/2b630b6222c9e464bcf8)と変わりありません。
次に今回のキモであるポートフォワーディングの設定です。
WANインタフェイス(interface lan1)に入ってくる特定のパケットをLAN側のノード(192.168.10.10)に渡す設定を追加します。
適当なところでTELNETのパケットをLAN側に渡してみましょう。
以下のようにポート10023/TCPでSEILのWAN側アドレスに送られてきたパケットをポート23/TCPに変更してLAN側のノードに渡す場合を考えます。

以下のように設定を記述します。

```
nat snapt add protocol tcp listen 10023 forward 192.168.10.10 23 enable interface lan1
```
キモとなるパラメータは以下の5つです。

|protocol|listen|forward<BR>(Addr)|forward<BR>(Port)|受信<BR>インタフェイス|
|:--:|:--:|:--:|:--:|:--:|
|TCP|10023|192.168.10.10|23|lan1|

実際に設定する際はforwardのアドレスとポートは1つのforwardパラメータで両方設定します。
気を付けるのはインタフェイスがnaptの場合と異なりパケットを受信するインタフェイスを記述するところです。
この設定で以下の動作が実装されます。

|受信アドレス|ポート||転送先LANアドレス|ポート|
|:--:|:--:|:--:|:--:|:--:|
|10.1.1.1|10023<BR>TCP|⇒|192.168.10.10|23<BR>TCP|

ルータへの設定では受信アドレス(10.1.1.1)の記述がありませんが、SEILのポートフォワードでは受信アドレスは設定不要です。
もし、WAN側インタフェイスにIPアドレスを複数振る場合は、**nat snapt add default**コマンドでSNAPTで使用するIPアドレスを指定するのが良いでしょう。

#検証
WAN側のノードからルータのIPアドレスを指定してTELNETでログインしてみましょう。
WAN側のノードにPINGを実行して、その結果をパケットキャプチャ等を交えて検証します。
パケットキャプチャはSEILの**tcpdumpコマンド**を使用します。

###TELNET実行結果
WAN側ノード(10.1.1.10)からSEILのIPアドレス(10.1.1.1)にポート番号10023/TCPでTELNETを実行。
LAN側のノードにログインできました。

```
[root@WAN1 Desktop]# telnet 10.1.1.1 10023
Trying 10.1.1.1...
Connected to 10.1.1.1.
Escape character is '^]'.
CentOS release 6.10 (Final)
Kernel 2.6.32-754.el6.i686 on an i686
LAN1 login: inarmo
Password: 
Last login: Sun Nov 10 06:57:08 from 10.1.1.10
[inarmo@LAN1 ~]$ exitConnection closed by foreign host.
[root@WAN1 Desktop]# 
```

###SEIL/x86パケットキャプチャ結果(WAN側)
SEILとの間でポート番号10023を使って通信しているのが分かります。

```
SEILx86_02# tcpdump interface lan1
################################################################
tcpdump: when you want to exit this program, please type Ctrl-C.
################################################################
00:36:57.374886 IP 10.1.1.10.39776 > 10.1.1.1.10023: Flags [S], seq 266775044, win 14600, options [mss 1460,sackOK,TS val 11082506 ecr 0,nop,wscale 5], length 0
00:36:57.375693 IP 10.1.1.1.10023 > 10.1.1.10.39776: Flags [S.], seq 2816834667, ack 266775045, win 14480, options [mss 1460,sackOK,TS val 11085442 ecr 11082506,nop,wscale 5], length 0
00:36:57.375883 IP 10.1.1.10.39776 > 10.1.1.1.10023: Flags [.], ack 1, win 457, options [nop,nop,TS val 11082507 ecr 11085442], length 0
00:36:57.377890 IP 10.1.1.1.10023 > 10.1.1.10.39776: Flags [P.], seq 1:13, ack 1, win 453, options [nop,nop,TS val 11085444 ecr 11082507], length 12
　　：
　　：
```
###SEIL/x86パケットキャプチャ結果(LAN側)
WAN側と比較してみてください。
SEILが宛先のアドレスとポート番号を変換して、192.168.10.10、ポート番号23にパケットを流しているのが分かります。

```
SEILx86_02# tcpdump interface lan0
################################################################
tcpdump: when you want to exit this program, please type Ctrl-C.
################################################################
00:36:57.375221 IP 10.1.1.10.39776 > 192.168.10.10.23: Flags [S], seq 266775044, win 14600, options [mss 1460,sackOK,TS val 11082506 ecr 0,nop,wscale 5], length 0
00:36:57.375455 IP 192.168.10.10.23 > 10.1.1.10.39776: Flags [S.], seq 2816834667, ack 266775045, win 14480, options [mss 1460,sackOK,TS val 11085442 ecr 11082506,nop,wscale 5], length 0
00:36:57.375920 IP 10.1.1.10.39776 > 192.168.10.10.23: Flags [.], ack 1, win 457, options [nop,nop,TS val 11082507 ecr 11085442], length 0
00:36:57.377842 IP 192.168.10.10.23 > 10.1.1.10.39776: Flags [P.], seq 1:13, ack 1, win 453, options [nop,nop,TS val 11085444 ecr 11082507], length 12 [telnet DO TERMINAL TYPE, DO TSPEED, DO XDISPLOC, DO NEW-ENVIRON [|telnet]
　　：
　　：
```

###NAT動作状況の確認
TELNET接続後に**show status nat**コマンドでNATの動作状況を確認します。
ポートとアドレスが変換され、ポートフォワーディングが行われている事が確認できます。

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

List of active IP mapping:

List of active sessions:
   1:snapt lan1     tcp     192.168.10.10:23    =        10.1.1.1:10023 <->       10.1.1.10:39778 [00:00:25]
SEILx86_02#
```
#さいごに
ポートフォワーディングは拡張でNAT設定をする際に最もよく使われる設定です。
[前稿](https://qiita.com/inarmo/items/2b630b6222c9e464bcf8)のようなLAN→WANのNAPT設定をベースに、本稿のようなポートフォワードを追加する事は良くありますので、ご参考にしてください。

#関連記事
[SEIL/x86によるNAT設定例(その１：NAPT/IPマスカレード)](https://qiita.com/inarmo/items/2b630b6222c9e464bcf8)