iptablesを使いこなす


##はじめに

`iptables`というのは、Firewall(ファイアウォール)の一種で外部からのアクセスを制限するルールを設定します。`iptables`の他には、`ufw`が有名です。 

`ufw`のほうがシンプルに使えますが、`iptables`のほうが一般的です。

Arch Linuxの場合は、`iproute2`が依存しているためデフォルトでもインストールされます。

```bash:
$ sudo pacman -S iptables
```

##iptables.rules

`iptables.rules`というのは、iptablesのルールを書いた設定ファイルです。デフォルトで置かれてる場合もあれば、ない場合もあります。ない場合は、`/usr/share`や`/etc/iptables`などからサンプルファイルがあると思うので、それを持ってきて編集しましょう。例えば、Arch Linuxの場合は、以下の様な形でシンプルな設定が一瞬で可能となります。ただし、この設定は中身を見てもらっても分かる通り、外部からのアクセスを一旦ほぼすべて制限するものです。したがって、SSHなどで特定ポートのみを許可している場合などは注意しましょう。有効にするとアクセスできなくなります。

```bash:
# cp /etc/iptables/simple_firewall.rules /etc/iptables/iptables.rules
# cat /etc/iptables/iptables.rules

# systemctl start iptables
# systemctl enable iptables
```

ここで、例えば、`local ssh`, `git push`, `git pull`などの基本的なアクセスを実現したいのであれば以下の様な感じになります。

```bash:/etc/iptables/iptables.rules
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -s 192.168.1.1/255.255.255.0 -p tcp --dport 11234 -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j DROP
-A INPUT -4 -p icmp -j ACCEPT
-A INPUT -6 -p icmp6 -j ACCEPT
COMMIT
```
テーブル一覧|内容
---|---
filter | パケットフィルタリングを参照するテーブルを指定する。
nat | 新しいセッションを開くパケットが参照するテーブルを指定する。
mangle | 特別なパケットが参照するテーブルを指定する。


チェーン一覧 | テーブル
---|---
INPUT | 入力（受信）パケット | filter , mangle
OUTPUT | 出力（送信）パケット | filter , nat , mangle
FORWARD | フォワードするパケット | filter
PREROUTING | 受信時を宛先アドレスを変換するチェイン | nat , mangle
POSTROUTING | 送信時に送信元アドレスを変換するチェイン | nat

ターゲット一覧|内容
---|---
ACCEPT | パケットの通過を許可
DROP | パケットを破棄
RETRUN | チェーン内のルール評価を終了する
MASQUERADE | 「-ｔ nat」と「-A POSTROUTING」と同時に用いて送信元IPとポート番号を書き換える
REJECT | パケットを拒否し、ICMPメッセージを返信
PREROUTING | 特定ポートにリダイレクト
LOG | Logを採取する
SNAT | パケットの送信元アドレスを修正する。natテーブルでpostroutingチェーンでのみ利用できる。
DNAT  | パケットの送信先アドレスを修正する。natテーブルでpostroutingチェーンでのみ利用できる。


オプション一覧|内容
---|---
-p [!] &lt;protocol&gt; | ルールで使うプロトコル（tcp、udp、icmp、all）を指定
-s [!] &lt;address&gt; [/&lt;netmask&gt;] | 送信元アドレス。IPアドレスのほかにホスト名などでも指定できる
-d [!] &lt;address&gt; [/&lt;netmask&gt;] | 接続先アドレス。IPアドレスのほかにホスト名などでも指定できる
--sport &lt;port&gt; | 送信元ポートを指定する。
--dport &lt;port&gt; | 送信先ポートを指定する。
-i &lt;interface&gt; | パケットが入ってくるインターフェイス（eth0、eth1など）を指定
-o &lt;interface&gt; | パケットが出ていくインターフェイスを指定
-j &lt;target&gt; | パケットがマッチしたときのアクション（ターゲット）を指定
-t &lt;table&gt; | テーブル（filter、nat、mangle）を指定
-m &lt;module&gt; | モジュールを指定する。-pで暗黙に指定されるので省略することも可。
--icmp-type [!] &lt;type&gt; | ICMPでタイプ名を指定する。( iptables -p icmp
で表示されるタイプを指定。
　! | -p、-s、-dなどで、条件を反転する。「! 192.168.0.1」とすると、「192.168.0.1以外」という意味になる


--stateで指定可能なものは以下があります。


名称 | 状態
---|---
INVALID  | 既存のコネクションとは関係のないパケット
NEW  | 新しいコネクションの接続に関するパケット
ESTABLISHED  | 接続済みコネクションのパケット
RELATED  | 接続済みコネクションに関連して発生した新たなコネクションパケット


コマンド一覧|内容
---|---
iptables [ -t &lt;table&gt; ] -A | append。最後尾に追加。
iptables [ -t &lt;table&gt; ] -L | line-numbers。設定内容表示。
iptables [ -t &lt;table&gt; ] -D | delete。既存のルールの削除。
iptables [ -t &lt;table&gt; ] -F | flush。指定したチェーン全てを削除。
iptables [ -t &lt;table&gt; ] -I | insert。先頭にチェーンを追加。ルール番号を指定することで任意の場所に挿入。
iptables [ -t &lt;table&gt; ] -P | チェーン内全体で有効なポリシーを定義。デフォルトはAccept。
iptables [ -t &lt;table&gt; ] -N | new。新しいチェーンを作成。



##iptstate

次に、`iptstate`というものを紹介します。`htop`のようなもので、ログをグラフィカルに表示してくれるので分かりやすいです。

```bash:
$ sudo pacman -S iptstate

$ sudo iptstate
```

参考

http://www.unix-power.net/linux/iptables.html