クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

ファイアウォールのルールの書き方

このレッスンのあとで: ファイアウォールのルールの一覧を読み、ある通信が通るか止まるかを言える。

55分のレッスンコマンド3件NAT ゲートウェイのラボ:nftables でマスカレードとポート転送をブラウザーで学ぶ

上から順に通すか止めるか決める

ファイアウォールのルールとは、通信を通すか止めるかを、上から順に決めていく一覧です。一行ごとに、「この条件の通信は、通す」または「止める」と書きます。

書き方を間違えると、止めたい通信が通ったり、必要な通信が止まったりします。ルールの読み方を身につけると、誰が書いたルールでも、結果を自分で予想できます。

このレッスンのゴール

メモ

ファイアウォールのルールの一覧を読み、ある通信が通るか止まるかを言える。

重要な言葉

ことばいみれい
ルール条件と、通すか止めるかの組
許可通信を通すことaccept
拒否通信を止めることdrop
最初に合ったルール上から読んで、最初に条件が合った一行
デフォルトポリシーどのルールにも合わない通信への扱い
接続の追跡始まった接続を覚えておく仕組み

学生が入力するセルは、このプレビューでは空白です。

最初に合ったルールで決まる

ファイアウォールは、通信が一つ来るたびに、一覧を上から読みます。条件が合う最初の行が見つかったら、そこで決まります。下の行は読みません。

どの行にも合わなければ、デフォルトポリシーが使われます。下の表で、通信ごとにどの行で決まるかを追いましょう。

例: 四つの通信を追う

番号ルール通信: 管理PCから22番通信: 外から3306番
1管理PCの22番を許可合う。許可で終わり合わない
280番と443番を許可読まない合わない
3どれにも合わない読まないデフォルトの拒否

学生が入力するセルは、このプレビューでは空白です。

ゲートウェイのルールを読む

コマンド
sudo ip netns exec gw nft list chain inet filter forward

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

ラボのルールが言うこと

出力の中ほどに policy drop があります。どのルールにも合わない通信は、止められます。

続く二行は、ct state established,related accept と、iifname "to-lan" accept です。前者は、すでに始まった接続の返事を通します。後者は、lan 側から入ってきた通信を通します。

許可の行を数える

コマンド
sudo ip netns exec gw nft list ruleset | grep -c accept

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

初めは全部止めて、必要なものを通す

デフォルトを「止める」にして、必要な通信だけを許可すると、書き漏らしても安全な側に倒れます。逆にデフォルトが「通す」だと、書き漏らした通信が全部通ってしまいます。

この考え方をデフォルト拒否といいます。多くの組織で、最初の方針に使われます。

例: 事務所用のルール

コード: bash
# 例です。ラボでは入力しません。
table inet office {
  chain input {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    iifname "lo" accept
    ip saddr 192.168.10.0/24 tcp dport 22 accept
    tcp dport { 80, 443 } accept
  }
}

事務所用の例を一行ずつ読む

policy drop で、初めは全部止めます。始まった接続の返事と、機械自身の内側の通信(lo)は通します。

22番は 192.168.10.0/24 の管理用の網からだけ、80番と443番は誰からでも許可します。それ以外は、どの行にも合わず、止まります。

順番を変えると結果が変わる

広いルールを先に書くと、後ろの細かいルールは一度も読まれません。例えば「22番を全員に許可」の後に「22番を拒否」を書いても、拒否の行は意味がありません。

具体的な例外を上に、広い決まりを下に書きます。一覧を読むときも、上から順に確かめます。

同じ条件の二つの行を探す

コマンド
printf 'allow tcp 22\ndeny tcp 22\nallow tcp 80\n' | grep -n 'tcp 22'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある間違い

注意

「一覧の全部を読んで、一番厳しい行が勝つ」と思う人が多いです。一つの一覧では、最初に合った行で決まります。あとの行が拒否でも、上の許可で通信は通ります。順番が結果を決めます。

発展: 自分の事務所のルール

小さな店で、ウェブを公開し、店長のPCだけがSSHで管理する場合を考えます。デフォルトを拒否にして、必要な行を三行で書いてみましょう。

次に、書いた行の順番を入れ替えて、結果が変わる通信があるかを調べます。

このラボとソースについて: NAT ゲートウェイのラボ:nftables でマスカレードとポート転送をブラウザーで学ぶ

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。