iptablesでパケットフィルタリング
Linux LPIC編。(第13 章 システムセキュリティ)
第13章はiptablesから。Linuxカーネルにもともと備わっているパケットフィルタリング機能で、
manでは「IPv4のパケットフィルタリングとNATを管理するツール」と説明されている。
覚えたい概念が「チェイン」というもので、パケットを検査するためのルールセットを指す。
基本としてINPUT チェイン、OUTPUT チェイン、FORWARDチェインがあり、これら
に新しいルールやカスタムチェインを追加していく。
いくつかのチェインのセットを「テーブル」という。
各種チェインとテーブルの相関は以下のようになる。チェインの説明は後述。
filter
デフォルトのテーブル。チェインはINPUT、OUTPUT 、FORWARD。
nat
新規の接続を開くためのテーブル。
チェインはPREROUTING、POSTROUTING、OUTPUT。
mangle
特別なパケット交換に使われるテーブル。
チェインはINPUT、OUTPUT 、FORWARD、PREROUTING、POSTROUTING。
次にiptablesコマンドについて。
書式がちょっと複雑。。チェインとターゲット、ルールの関係をしっかり覚える必要がありそう。
「ターゲット」はACCEPT(許可)、 DROP(破棄)など、パケットの処理方法処理を示す。
デフォルトのターゲットを「ポリシー」ともいうようだ。
分かりにくいので説明を一緒に書いておく(自分的解釈です)。
書式
iptables -[AD] チェイン ルール
指定したチェインにルールを追加、もしくは削除する
iptables -P チェイン ターゲット
指定したチェインのポリシーを変更する
iptables -[LFNX] [チェイン]
ルールのリスト表示、指定したチェインのルールを全て削除、
ユーザ定義のチェインの作成や削除など。
iptables -l チェイン [ルール番号] ルール
ルール番号を指定してルールを挿入する
コマンド例から見ていった方が分かりやすいかな。
以下はPOSTROUTINGチェインのルールを表示させる。-t natでテーブルの指定、-Lがリスト表示。
# iptables -t nat -L POSTROUTING
以下はFORWARDチェインのデフォルトのターゲットをDROPに変更している。
ここでテーブルの指定をしなくてもいいのは、iptablesのデフォルトのテーブル
がfilterのため。
# iptables -P FOWARD DROP
以下の例では、送信元192.168.100.0/24からのICMPパケットを破棄する設定。
DROPの代わりにREJECTだと送信元にエラーが通知される。
よりセキュアにするにはDROPの方が望ましいと言える。
# iptables -A INPUT -p icmp -s 192.168.100.0/24 -j DROP
パケットフィルタリングの挙動をログに吐き出させるにはLOGターゲットを利用する。
パケットフィルタリングはカーネルの機能なので、デフォルトのログ出力先に一緒に
吐き出される(おそらく/var/log/messages)。識別のためにプレフィックスを付けるとよい。
以下のように設定することで、/var/log/messagesにTelnet Trying…のプレフィックスが
付けられた状態でログが出力される。
# iptables -A INPUT -p tcp --dport 23 -j LOG --log-prefix "Telnet Trying..."
ついでにIPマスカレードも押さえよう。
以下の例で一行目の方はIPマスカレードの変換を行うためのコマンドだが、WAN側の
IPアドレスが固定されている場合はMASQUERADEではなくSNATが推奨されている、とのこと。
二行目の方は、内部ネットワーク192.168.0.0/24から外に出て行くパケットはWAN側の
IPアドレス10.1.2.3に書き換えられるよう設定している。
# iptables -t nat -A POSTROUTING -o eht1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT 10.1.2.3
コマンド、チェイン、ターゲット、ルールの一覧も、面倒だけど書いておく。いつでも見れるように・・・
コマンド
-A 指定したチェインの最後にルールを追加
-D 指定したチェインからルールを削除
-P 指定したチェインのポリシーを変更
-L ルールのリストを表示
-N 指定した名前のユーザ定義チェインを作成
-X 指定したユーザ定義チェインを削除
※この時チェインは空になっていること
-l ルール番号を指定してルールを挿入する
-F 指定したチェイン内のルールをすべて削除
※何も指定しなければテーブル内のすべてのチェインが対象となる
チェイン
INPUT ホストに入ってくるパケット
OUTPUT ローカルマシンで生成されたパケット(出て行くパケット)
FORWARD ホストを経由するパケット
PREROUTING 入ってきたパケットを変換
POSTROUTING 出て行くパケットを変換
ターゲット
ACCEPT 許可
DROP 破棄
REJECT 拒否(送信元に通知される)
MASQUERADE 送信元IPアドレスとポート番号の変換
SNAT 送信元IPアドレスの変換
DNAT 送信先IPアドレスの変換
LOG ログの出力
ルール、オプション
-t 適用対象のテーブルを指定
-s 送信元IPアドレスを指定
-d 送信先IPアドレスを指定
-j 適用されるターゲットを指定
-p プロトコルを指定(tcp,udp,icmp,all いずれか)
-i 入力インターフェース名(eht0,ppp0など)
-o 出力インターフェース名(eht0,ppp0など)--sport 送信元のポート番号を指定 --dport 送信先のポート番号を指定 --line-numbers ルール番号を表示する
送信元IPの指定が -sで、送信先IPは -d。ここ、注意のような…
それから-i と -o。iはinterfaceじゃなくてin、oはout。
そんなこんなで、ちょっと手強そうなiptablesではあった。
manをチラ見してみるとガッツリいろいろ書いてあるので、別途読んでおこう。
それからパケットフィルタリングについて基本を押さえるには以下のページはよさそう。
Linuxで作るファイアウォール[パケットフィルタリング設定編]
ついでに、Linuxマシンをルータとして使うときの話。異なるネットワーク間でパケット
のやり取りを行うためには、/proc/sys/net/ipv4/ip_forwardの値が1(有効)になって
いる必要がある。値が0の場合は、以下の方法で変更する。
(レベル1の教科書にも出てくるけどね、、、)
# echo 1 > /proc/sys/net/ipv4/ip_forward
…と、試験ポイントだから書いておいたが、例のごとく再起動すると戻ってしまうので、
恒久的な対応はなんだかんだ言ってやはり設定ファイル。
/etc/sysconfig/networkファイルや/etc/sysctl.confに、適切なエントリを記述する。
あー、長かった。次回はFTPサーバのセキュリティ、です。
出典
Linux教科書LPICレベル2(翔泳社)
Linux記事一覧はこちらをどうぞ
↓ ↓ ↓
Linux-index