今さらながらiptables基本（その２）

# iptablesの超基本（NAT）
[前回（今さらながらiptables基本（その１））](https://qiita.com/infinite1oop/items/89eb767c097ac53fe048)の続き。iptablesにおけるNATの基本設定を、Wiresharkで取得したデータとともに記載。

## 参考サイト
- [natテーブルを利用したLinuxルータの作成](https://atmarkit.itmedia.co.jp/ait/articles/0505/17/news131_2.html)
- [iptablesの仕組みを図解](https://christina04.hatenablog.com/entry/iptables-outline)

## ネットワーク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/23395ebf-9fd5-52d2-b3f7-9bea5efa3e3d.png)
VirtualBoxで3つのVMを設けて接続する。[前回](https://qiita.com/infinite1oop/items/89eb767c097ac53fe048)と同じであるが、中央のルーターであるLubuntuが”NAT Router”となっており、左がNATの内側、右がNATの外側である。

## 準備など
[前回](https://qiita.com/infinite1oop/items/89eb767c097ac53fe048)とほぼ同じ。


### NAT Router(Lubunts)
```
# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
```
パケット転送を許可する。

### サーバー側（右のVM: Busterdog 2）
```
$ ping 192.168.10.10
```
```
$ nc -l -p 1234
```

### クライアント側（左のVM: Busterdog 1）
```
$ ping 172.16.0.21
```
```
$ nc -z 172.16.0.21 1234
```

## 検証
### IPマスカレード
NAT Routerでの設定である。以下、同様。
```
$ sudo iptables -t nat -A POSTROUTING -i enp0s8 -j MASQUERADE
iptables v1.8.4 (legacy): Can't use -i with POSTROUTING

Try `iptables -h' or 'iptables --help' for more information.
```
あえて、エラーも記載。POSTROUTINGと"-i"オプション（NAT内側からの入力）とは共存できない。
```
$ sudo iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE
$
$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  anywhere             anywhere            

```
マスカレード（MASQUERAGE）、"-o"（NAT外側への出力）、POSTROUTINGとを組みあわせる。この設定前後のping受け側（サーバー側、右のVM）のWiresharkデータは下記となる。
![NAT前後atServer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a6aa3c5f-b393-a57f-a1bd-28bb2b3d84ac.png)
パケット番号8までが設定前のデータであり、送信元IPアドレスが、左のVMのIPアドレスとなっている。パケット番号13以降が設定後のデータであり、送信元IPアドレスが、NAT RouterのIPアドレスとなっている。（期待どおり）。

しかし、これだけの設定だと、NAT外側からNAT内側へ通信ができてしまう。右のVMから左のVMへのpingの結果は下記となり、疎通がある。
```
$ ping 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=63 time=1.30 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=63 time=1.42 ms
```
NATとしては、下記するフィルター設定が必要となる。

### フィルター設定
```
$ sudo iptables -P FORWARD DROP
$ sudo iptables -A FORWARD -i enp0s8 -o enp0s9 -j ACCEPT
$ sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
```
- FORWARD（転送）の基本はDROP（通さない）
- NAT内側からNAT外側への転送はACCEPT（通す）
- ステートフルな転送はACCEPT（通す）

フィルターの設定状況は下記となる。
```
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

```

フィルター設定前後の右側VMからのpingのWiresharkデータは下記となる。
![フィルター導入前後atServer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/166e8a36-2aee-65bc-0b9d-0b0462455804.png)
パケット番号26までが設定前でデータあり、左側VMからレスポンスがある。パケット番号30以降が設定後のデータであり、左側VMからレスポンスがない。（期待どおり。）

また、TCPセッションの状況（Server側、右側VM）のデータも下記する。
![フィルター導入後TCPatServer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f257a27a-08b7-2f37-b3c6-1bd5573d7cd5.png)
TCPセッションが適切に行われている。

## 終わりに
これが基本であろう。他にも基本的なiptablesの事項で説明できそうなものが見つかれば、その３を考えてみたい。