突発ひっそりiptables

スピーカー:Takeshi@インフラ系の人 さん

iptablesとは?

Linux標準のパケットフィルタリングNATの機能

ipchainsの後継のようなもの

わかりにくい、とっつきにくいイメージがありますが 理解すると使いやすいので布教したい! by Takeshi

tableとchain

table

処理する「対象とルール」について記述するところ

テーブル名用途
filterパケットを処理するためのテーブル。(-t オプションが指定されていない場合) このテーブルがデフォルト
nat**ネットワークアドレス変換 (NAT) **に使用。
mangle特別なパケット変換に使われる。パケット処理の優先度付けを行う。通信品質を制御するQoS(Quality of Service)に利用される。
raw特定パケットの追跡除外をする。他の機材へ通したい時など。(例)DNSのパケットに関しては、別サーバで処理

※rawテーブル、mangleテーブルは特殊なものなので、ハンズオンは割愛

chain

テーブルで処理する「タイミング」

以下、ざっくり簡単に

  • PREROUTING ・・・外部から入ってきてすぐ(ルーティング前)
  • INPUT ・・・ローカルマシン宛に入ってきた時(ルーティング後)
  • OUTPUT ・・・ローカルマシンからパケットが生成された後(ルーティング前)
  • FORWARD ・・・ローカルマシン経由で他のマシン宛に転送する時(ルーティング前)
  • POSTROUTING ・・・外部へ出ていく時(ルーティング後)

わかりやすい図があるのですが…↓のような感じ(まずかったら消します)

受信 │ raw PREROUTING mangle PREROUTING nat PREROUTING ├ ┌─── ROUTING ───┐ mangle INPUT │ filter INPUT │ │ │ ─Local Process─ mangle FORWARD │ filter FORWARD raw OUTPUT │ ├ │ mangle OUTPUT │ nat OUTPUT │ filter OUTPUT │ └─── ROUTING ───┘ │ mangle POSTROUTING nat POSTROUTING │ 送信

filterテーブル

iptabelesコマンド (ルールの確認)

# iptables --list
# iptables -nvL

オプション

  • -L/--list ・・・ルールを一覧表示する
  • -t [table] ・・・テーブルの指定(指定しないと -t filter)
  • -n ・・・IP アドレスやポート番号を数値で表示する。 デフォルトでは、ホスト名、ネットワーク名、サービス名で表示される。
  • -v ・・・詳細を表示する。インターフェース名(in/out)、 ルールのオプション等
# iptables -nvL Chain INPUT (policy DROP 2785 packets, 491K bytes) pkts bytes target prot opt in out source destination 1026K 292M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 4997 498K ACCEPT all -- * * 192.168.55.0/24 0.0.0.0/0 36424 2132K ACCEPT tcp -- * * 0.0.0.0/0 192.168.55.1 tcp dpt:22

target

パケットをどう扱うか

  • ACCEPT ・・・パケットの通過を許可する
  • DROP ・・・パケットを破棄する(破棄したことを通信相手に伝えない)
  • REJECT ・・・パケットを破棄する(破棄したことを通信相手に伝える)
  • LOG ・・・パケットのログを記録

policy

何も記述がない時(つまりチェイン内に該当ルールがない)のtarget

iptabelesコマンド (ルールの追加、削除)

追加

iptables -A INPUT -p tcp -d 192.168.55.1 --dport 22 -j ACCEPT

削除

iptables -D INPUT -p tcp -d 192.168.55.1 --dport 22 -j ACCEPT iptables -D INPUT [番号]

-Dで削除するときの番号は、そのチェイン内で上から数えて何番目?かを指定する

オプション

  • -A, --append [chain] ・・・チェインの最後にルールを追加する

  • -D, --delete ・・・指定ルールを削除する。行番号での指定も可

  • -I --insert [chain] [rulenum] ・・・指定行にルールを挿入する

  • -p ・・・プロトコルの指定

  • -d ・・・宛先(パケットについている宛先)

  • --dport [port] ・・・受信側(サーバ側)のポート番号を指定

  • -j [target] ・・・jumpパケットの処理を記述