パケットフィルタリングとセキュリティ

#iptables#

##コマンド##

|コマンド|説明|
|---|---|
|-A|指定したチェインの最後にルールを追加|
|-S|指定したチェインから削除|
|-P|指定したチェインのポリシーを変更|
|-L[チェイン]|リスト表示|
|-N チェイン|ユーザー定義チェインを作成|
|-X チェイン|ユーザー定義チェインを削除|
|-l|ルール番号を指定してルールを挿入|
|-F チェイン|指定したチェイン内のルールを全て削除|

##チェイン##

|チェイン|説明|
|---|---|
|INPUT|入ってくるパケット|
|OUTPUT|生成されたパケット|
|FORWARD|経由するパケット|
|PREROUTING|入ってきたパケットを変換|
|POSTROUTING|出て行くパケットを変換|

##ターゲット##

|ターゲット|説明|
|---|---|
|ACCEPT|許可|
|DROP|破棄|
|REJECT|拒否(送信元に通知)|
|MASQUERADE|送信元IPアドレスとポート番号の変換|
|SNAT|送信元IPアドレスの変換|
|DNAT|送信先IPアドレスの変換|
|LOG|ログに出力|

##ルール##

|ルール|説明|
|---|---|
|-s|送信元IP|
|-d|送信先IP|
|--sport|送信元ポート|
|--dport|送信先ポート|
|--to|宛先を指定|
|-j|適用されるターゲット|
|-p|プロトコル|
|-i|入力インタフェース|
|-o|出力インタフェース|

##オプション##

|オプション|説明|
|---|---|
|-v|詳細表示|
|-n|数値で表示|
|--line-numbers|ルール番号表示|

##例##

FORWARDチェインポリシーをDROPに変更。

```
# iptables -P FORWARD DROP
```

192.168.0.0/24から送られきたICMPパケットを拒否。

```
# iptables -A INPUT -p icmp -s 192.168.0.0/24 -j REJECT
```

ログを記録する場合は、LOGターゲットを使います。

```
# iptables -A INPUT -p tcp -dport 80 -j LOG --log-prefix "HTTP access..."
```

##saveとrestore##

```
# service iptables save

※centos7では、iptables-servicesパッケージのインストールが必要です。

もしくは

# iptables-save > /etc/sysconfig/iptables
```

```
# iptables-restore > /etc/sysconfig/iptables
```

##ポート転送##

eth1に届いた8080番ポートを、192.168.1.2:80に届くようにする。

```
# iptables -t nat -A PREROUTING -p tcp --dport 8080 -i eth1 -j DNAT --to 192.168.1.2:80
```

##iptables6##

使い方は、iptablesと同じです。


#ルーターとしての利用#

##パケット転送##

Linuxをルーターとして利用する場合は、異なるネットワーク間でのパケット転送を許可する必要があります。

そのためには、次の値が **1** である必要があります。

```
#echo 1 > /proc/sys/net/ipv4/ip_forward
#echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
```

恒久的に設定するには、**/etc/sysctl.conf** に適切なエントリを記述したり、
**/etc/sysconfig/network** に次の通り記述します。

```/etc/sysconfig/network
FORWARD_IPv4=yes
IPV6FORWARDING=yes
```


##napt##

192.168.0.0/24 からeth0 へ出ていくパケットは、MASQUERADE を利用する。

```
# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
``` 

##snat##

192.168.0.1 から ens33 へでていくパケットは SNAT される。


``` 
# iptables -t nat -A POSTROUTING -o ens33 -j SNAT --to-source 192.168.0.1
``` 

##dnat##

ens38 から入ってくるパケットは 192.168.0.2 へ変換される。

``` 
# iptables -t nat -A PREROUTING  -i ens34 -j DNAT --to-destination 192.168.0.2
``` 


#firewall#

とりあえず、CENTOS7 からは、firewall に変わっているので、ここを主に抑えておく。

##ゾーン##

|ゾーン|説明|
|---|---|
|public|インターネット上の公開サーバー用（デフォルト）|
|dmz|DMZ|
|work|社内LANにあるクライアントPC用|
|home|家庭内LANにあるクライアントPC用|
|internal||内部ネットワークのインターフェース設定用
|external|外部ネットワークのインターフェース設定用|
|block|受信パケットを全て拒否|
|drop|受信パケットを全て破棄|
|trusted|通信を許可|


##firewall-cmdのオプション##

|オプション|説明|
|---|---|
|--state|状態表示|
|--reload|再読み込みして反映|
|--permanent|永続設定する|
|--get-zones|定義されているゾーンを一覧表示|
|--get-services|定義されているサービスを一覧表示|
|--list-all|指定したゾーンで有効な項目を全て表示|
|--list-services|指定したゾーンで有効なサービスを全て表示|
|--add-services=サービス名|指定したサービスを有効にする（許可する）|
|--add-port=ポート番号/tcp・udp|指定したポート番号を許可する|
|--remove-service=サービス名|指定したサービスを無効にする（拒否する）|
|--remove-portポート番号/tcp・udp|指定したポート番号を拒否する。|
|--zone=ゾーン|ゾーンを指定する（デフォルトはPublic）|


#ufw#

Ubuntu では、より簡単にファイヤウォールの設定ができる、ufwを使うのが一般的です。

- ファイヤウォールのルールは番号が若い順から評価される。
- 評価したルールは、/etc/ufw/user.rules(IPv4)、/etc/ufw/user6.rules(IPv6)に保存される。

##ufwのオプション##

|サブコマンド|説明|
|---|---|
|enable|有効|
|disable|無効|
|status|状態表示|
|status numberef|状態をルール番号とともに表示|
|status verbose|状態を詳細に表示|
|allow|許可|
|delete|削除|
|insert|ルール番号を指定して追加|
|default|デフォルトのポリシーを設定|


#セキュリティ対策#

##Smurf対策##

ブロードキャストを無視する場合は、次のように指定します。
ICMP echo request がブロードキャストの場合は無視して、ICMP echo reply を返しません。
これは、**Smurf対策**（特定のコンピュータに繋がるかどうか確認する「ping」コマンドで使われるパケットの送信元を偽装し、標的に向けて大量のパケットを送りつける攻撃手法。）の一つです。

```
#echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
```

##SYS flood対策##

**SYS flood対策** (TCPの3ウェイハンドシェイクにおいて、第1段階のSYNパケットを連続して送信する攻撃) には、tcp_syncookies を 1 にするとよい。

```
#echo 1 > /proc/sys/net/ipv4/tcp_syncookies
```


#リンク#
[ハマる前に理解する「Firewalld」の設定方法、「iptables」との違い](https://www.atmarkit.co.jp/ait/articles/1602/18/news019.html)

``` 
iptables -t nat -A POSTROUTING -s 192.168.1.32 -j SNAT --to-source 192.168.1.254
```