13.1. パケットフィルタリングとルータの構成

13.1. パケットフィルタリングとルータの構成

13.1.1. パケットフィルタリング

パケットフィルタリングはカーネルが処理するパケット情報を調べて通過させたり遮断させたりすること
パケットフィルタリングはINPUT(入力),OUTPUT(出力),FORWARD(転送)の3か所で行う。
それぞれINPUTチェイン、OUTPUTチェイン、FORWARDチェインと呼ばれる。

なおチェインはパケットを検査するためのルールセットのこと。
ネットワークインターフェイスを通過するパケットはチェインのルールに適合する検査され、破棄されたり通過させたりされる。
チェインのいくつか集めたセットはテーブルと呼ばれる。
テーブルには以下の種類がある。

テーブルデフォルトチェイン
filterINPUT, OUTPUT, FORWARD
natPREROUTING, POSTROUTING, OUTPUT
mangleINPUT, 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 DROP

iptables設定の保存

各ディストリビューションにおけるiptablesの保存方法は以下の通り。

# RedHat系
service iptables save

iptables-save > /etc/sysconfig/iptables

# Debian系
iptables-save > /etc/iptables/rules.v4

iptables設定の復元

iptables設定の復元はiptables-restoreコマンドで行う。

iptables-restore < iptables.backup

firewalld

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:80

ip6tablesコマンド

IPv6の場合にパケットフィルタリングの設定を行うコマンド。
使い方はip6tablesコマンドとほぼ同じとなっている。

iptables設定の保存

各ディストリビューションにおけるip6tablesの保存方法は以下の通り。

# RedHat系
service ip6tables save

ip6tables-save > /etc/sysconfig/ip6tables

# Debian系
ip6tables-save > /etc/iptables/rules.v6

13.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=yesnet.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