13.1. パケットフィルタリングとルータの構成
13.1.1. パケットフィルタリング
パケットフィルタリングはカーネルが処理するパケット情報を調べて通過させたり遮断させたりすること。
パケットフィルタリングはINPUT(入力),OUTPUT(出力),FORWARD(転送)の3か所で行う。
それぞれINPUTチェイン、OUTPUTチェイン、FORWARDチェインと呼ばれる。
なおチェインはパケットを検査するためのルールセットのこと。
ネットワークインターフェイスを通過するパケットはチェインのルールに適合する検査され、破棄されたり通過させたりされる。
チェインのいくつか集めたセットはテーブルと呼ばれる。
テーブルには以下の種類がある。
| テーブル | デフォルトチェイン | 
|---|---|
| filter | INPUT, OUTPUT, FORWARD | 
| nat | PREROUTING, POSTROUTING, OUTPUT | 
| mangle | INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING | 
iptablesコマンド
iptablesコマンドはパケットフィルタリングやNAT(ネットワークアドレス変換)の設定を行うコマンド。
書式は以下の通り。
# チェインの最後にルールの追加/削除
iptables -[AD] チェイン ルール
# チェインのポリシ変更
iptables -P チェイン ターゲット
# ユーザ定義チェインの一覧表示/強制全削除/作成/削除
iptables -[LFNX] チェイン
# NATテーブルの表示
iptables -t NAT -L
# チェインにルールを挿入
iptables -I チェイン [ルール番号] ルール| オプション | 説明 | 
|---|---|
| -v | 詳細に表示する | 
| -n | 数値で表示する | 
| –line-numbers | ルール番号を表示する | 
| コマンド | 説明 | 
|---|---|
| -A | 指定したチェインの最後にルールを追加 | 
| -D | 指定したチェインの最後のルールを削除 | 
| -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 | 宛先指定(IPアドレス:ポート番号) | 
| -j ターゲット | 適用されるターゲット | 
| -p プロトコル | プロトコル(tcp,udp,icmp,all) | 
| -i インターフェイス名 | 入力インターフェースの指定 | 
| o インターフェース名 | 出力インターフェースの指定 | 
使用例は以下の通り。
# FORWARDチェインのポリシーをDROP変更
iptables -P FORWARD DROP
# 特定のIPからのICMPパケットを拒否する
iptables -A INPUT -p icmp -s 192.168.2.0/24 -j REJECT
# パケットフィルタリングの挙動をログに保存する(journalctlなどで確認可能)
iptables -A INPUT -p tcp --dport 23 -j LOG --log-prefix "Telnet Trying ..."
iptables -A INPUT -p tcp --dport 23 -j DROPiptables設定の保存
各ディストリビューションにおけるiptablesの保存方法は以下の通り。
# RedHat系
service iptables save
iptables-save > /etc/sysconfig/iptables
# Debian系
iptables-save > /etc/iptables/rules.v4iptables設定の復元
iptables設定の復元はiptables-restoreコマンドで行う。
iptables-restore < iptables.backupfirewalld
CentOS7系やUbuntu22.04などではFWの仕組みにfirewalldが採択されている。
そのためデフォルトではiptablesを利用できない。
この場合利用するとき、firewalldサービスを停止しiptables-serviceパッケージをインストールする必要がある。
なおUbuntuなどではiptablesコマンドではなくufwコマンドを用いてFWの設定を行うのが一般的となる。
ポート転送
ポート転送は外部から届いたパケットの送信先ポート番号を変えて内部に転送すること。
以下に、外部(eth1)、内部(172.16.0.0/16)の172.16.0.2の80ポートに届くようにする際の設定例を記載する。
iptables -A FORWARD -d 172.16.0.2 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 8080 -i eth0 -j DNAT --to 172.16.0.2:80ip6tablesコマンド
IPv6の場合にパケットフィルタリングの設定を行うコマンド。
使い方はip6tablesコマンドとほぼ同じとなっている。
iptables設定の保存
各ディストリビューションにおけるip6tablesの保存方法は以下の通り。
# RedHat系
service ip6tables save
ip6tables-save > /etc/sysconfig/ip6tables
# Debian系
ip6tables-save > /etc/iptables/rules.v613.1.2. ルータの構成
Linuxホストをルータとして利用することもできる。
ルータとして使用するにはルーティングテーブルを適切に設定する必要がある。
ルーティングテーブル
route/netstat -rコマンド
routeコマンドやnetstat -rコマンドはルーティングテーブルを表示するコマンド。
ルーティングテーブルに表示されるエントリには静的経路、動的経路がある。
- 静的経路 … routeコマンドにより設定される経路
- 動的経路 … ルータ同士が情報交換することで自律的形成される経路
Linuxで動作するルーティングソフトにはQuaggaがある。
なお動的経路を使用しない場合はパケットフィルタリングのiptablesのみで十分となる。
Linuxをルータとして使用する場合は以下ファイルの値が1である必要がある。
- IPv4の場合 … /proc/sys/net/ipv4/ip_forward
- IPv6の場合 … /proc/sys/net/ipv6/conf/all/forwarding
上記設定のみではシステム再起動後に設定が初期化されるので、/etc/sysctl.confファイルや/etc/sysconfig/networkファイルにFORWARD_IPv4=yesやnet.ipv4.ip_forward=1など記述する必要がある。
IPマスカレード
IPマスカレードはLAN側ホストがインターネットを利用する際にIPアドレスをグローバルアドレスに変換したり、その逆を行う機能のこと。
IPマスカレード設定をLinuxで行う場合はiptablesで以下のように設定する。
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE設定例は以下の通り。
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT 10.1.2.3