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

# iptablesの超基本（フィルター）
iptablesを自主学習していると、情報は多数見つかるが、多様かつ高度な説明をしているものが多いと感じる。ここでは、超基本であるフィルターの機能をパケットキャプチャデータ（Wiresharkによる取得）とともに記載。

## とは言いつつ参考サイト
- [iptablesの仕組みを図解](https://christina04.hatenablog.com/entry/iptables-outline)
- [iptablesの設定方法](https://manual.sakura.ad.jp/vps/support/security/iptables.html)

## ネットワーク
VirtualBoxで3つのVMを設け、下記のように接続する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a66f2a02-9d51-194b-de1f-959adbc6d9c2.png)
中央のルーターであるLubuntuで、iptablesを機能させ、両端のVM（Busterdog）間の通信を制御する。

## 準備など
pingおよびnetcat(nc)を用いる。

### ルーターLubuntu
パケット転送を許可する。
```
# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
```

### サーバー側（右のVM: Busterdog 2）
```
nc -l -p 12345
```

### クライアント側（左のVM: Busterdog 1）
```
ping 172.16.0.21
```
```
nc -z 172.16.0.21 12345
```
”-z”オプションにより、TCPセッション確立後、すぐにセッションをクローズする。

## 検証
### Filterなし
iptables未設定時の、ルーターの状況は下記となる。
```
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  
```
なお、テーブルを指定しない（-tオプション）時のデフォルトのテーブルは、”filter”のようだ（”-t filter”と同じ）。

pingおよびnc実行時の、クライアント側のWiresharkの様子は下記である。
![NoFilter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/eebe8d50-7d63-d483-477c-fc7e2ecf1b39.png)
ping、ncによるTCPセッション、ともに成立（成功）している。

### Filterあり
#### REJECT
ルーターにて、クライアント側IPアドレスのTCPを”REJECT”する。
```
$ sudo iptables -A FORWARD -p tcp -s 192.168.10.10 -j REJECT
$ sudo iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     tcp  --  192.168.10.10        anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
```
この時のpingおよびnc実行時の、クライアント側のWiresharkの様子は下記である。
![FillterReject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/46404c28-8c5a-fa58-c1a7-4ed1b453f84e.png)
pingは成功しているが、TCP SYNに対して、”Port unreachable”のICMP応答がある。期待どおりの動作。

#### Filter削除
次に進む前に、上記のFilterを削除する。
```
$ sudo iptables -t filter -D FORWARD 1
undeux3@vamos:~$ sudo iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
```
最初のフィルターは”1”により、指定できる。

#### DROP
ルーターにて、クライアント側IPアドレスのTCPを”DROP”する。
```
sudo iptables -A FORWARD -p tcp -s 192.168.10.10 -j DROP
undeux3@vamos:~$ 
undeux3@vamos:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  192.168.10.10        anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
```
この時のnc実行時の、クライアント側のWiresharkの様子は下記である。![FilterDrop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/4d8f217f-6376-5c2f-4396-c9718e5b2df7.png)
また、コマンド実行状況は下記となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a8be03ac-0e0a-a3c9-b9d5-cfab569f5cf4.png)
ルーターから何も応答がない（TCPを”DROP”）ので、クライアントは再送している。こちらも期待どおりの動作である。

## 終わりに
単純だがこれが基本であろう。その２では、NATを取り上げる予定。