
俺でも解るIPTABLES
パケットフィルタリングとは: パケットのヘッダー部分を見て、 設定した条件(送信元IPアドレスや宛先IPアドレス、ポート番号など)と一致するかどうかを判 定して、
一致する場合は設定したアクション(転送、破棄、アドレス書き換えなど)を行うものである。
アドレス変換とは: パケットのヘッダー部分を見て、設定した条件と一致するかどうかを判定し、
一致する場合はヘッダーのIPアドレスやポート番号を書き換えるものである。
などと ipchains と iptables
を比較して、解説してるページがあるが混乱するだけなので、ipchainsのことは忘れてしまった方が良いと思う。よってここでは解説しない。
|
パケットフィルタリング専用の filter テーブルと、 NAT/マスカレード専用の nat
テーブルと分けて区別されている。(mangleテーブルってのもあるんですが、解説が省かれている解説サイトが多いので、特に覚えなくてもいいのか?) |
フィルタリング用 filterテーブル |
アドレス変換用 natテーブル |
FORWARD |
フォワードするパケット |
INPUT |
入力(受信)パケット |
OUTPUT |
出力(送信)パケット | |
PREROUTING |
送信時に変換するチェイン |
POSTROUTING |
受信時を変換するチェイン |
OUTPUT |
出力(送信)パケット | |
よくテーブルやチェインなどの概念を難しく解説している所があるが要は、 filter(テーブル)で使えるのがFORWARD,INPUT,OUTPUT(チェイン)で、 natで使えるのがPREROUTING,POSTROUTING,OUPUTということらしい。
これでフィルタリングとマスカレードの機能をちゃんと区別できる。
つまり、# /sbin/iptables -t nat -A
FORWARD ってのはありえないってこと。
また、書式の中で filter(テーブル)
は省略できる為、通常書かないようだ。つ〜か面倒だから誰も書かない。
4. filter テーブルの INPUT/OUTPUT
チェインは、ローカルマシンへのパケット だけに適応される
|
|
ローカルに出入りするパケットの流れと、ロー
カルを通過するパケットの流れを完全に区別して取り扱うようになった為、外部から入って来るパケットをフィルタするには、ローカルへのフィルタリング設定と、内部LAN
へのフィルタリング設定と、 両方指定する必要がある。 |
INPUT,OUTPUT,FORWARDの関係は下図を見ると解りやすいと思う。
iptablesの形式 # iptables [ -t <table> ] [
-A <chain> ] [ <条件> ] [ <アクション> ]
iptablesのオプション([ -A <chain> ])
|
-A(--append) |
指定チェインに1つ以上の新しいルールを追加 |
-D(--delete) |
指定チェインから1つ以上のルールを削除 |
-P(--policy) |
指定チェインのポリシーを指定したターゲットに設定 |
-N(--new-chain) |
新しいユーザー定義チェインを作成 |
-X(--delete-chain) |
指定ユーザー定義チェインを削除 |
-F |
テーブル初期化 | | iptablesのパラメータ([ <条件> ])
|
-p(--protocol) プロコトル |
プロトコル(tcp、udp、icmp、all)を指定 |
-s(--source) IPアドレス[/mask] |
送信元のアドレス。IPアドレスorホスト名を記述 |
-d(--destination)
IPアドレス[/mask] |
送信先のアドレス。IPアドレスorホスト名を記述 |
-i(--in-interface) デバイス |
パケットが入ってくるインターフェイスを指定 |
-o(--out-interface) デバイス |
パケットが出ていくインターフェイスを指定 |
-j(--jump) ターゲット |
条件に合ったときのアクションを 指定 |
-t(--table) テーブル |
テーブルを指定 |
-m state --state |
パケットの状態を条件として指定 stateは、
NEW、ESTABLISHED、RELATED、INVALIDが指定できる |
! |
-p、-s、-dなどで、条件を反転(〜以外となる) | | 上記パラメータにある-jのターゲット([ <アクション> ])
|
ACCEPT |
パケットの通過を許可 |
DROP |
パケットを破棄 |
MASQUERADE |
マスカレード |
SNAT |
送信元のアドレスの変換 |
DNAT |
送信先のアドレスの変換 |
LOG |
ログを取る |
REJECT |
パケットを拒否し、ICMPメッセージを返信 |
REDIRECT |
特定ポートにリダイレクト | |
とりあえず、他にかなりのボリュームのコマンドオプションがあるが、それについては設定例に出てくるたびに解説することにする。以下に設定例
iptableの初期化
# /sbin/iptables -F INPUT # /sbin/iptables -F OUTPUT # /sibn/iptables -F FORWARD |
この例では-Fオプション指定でINPUT、OUTPUT、FORWARDのテーブルを初期化している。 基本ポリシーの設定
# /sbin/iptables -P INPUT DROP #
/sbin/iptables -P OUTPUT DROP # /sbin/iptables -P
FORWARD DROP |
すべてのパケットを破棄するという意味。すべての穴をふさいでから必要なポートを空けていくのが良い。 外側に向ってマスカレード(NAT)
iptables -t nat -A POSTROUTING -s
192.168.1.0/24 -o eth0 -j MASQUERADE |
-t nat でNAT宣言、-A
POSTROUTINGでLAN内部から送信するパケットを対象にし、プライベートネットワークのアドレス(-s 192.168.1.0/16)を、ネットワークカードeth0から出る時( -o
eth0)にマスカレードしますよ〜となる。 特定の外部のサーバからパケットを受け入れる場合(NAT)
iptables -t nat -A PREROUTING -d
172.16.0.10 -i eth0 -j DNAT --to 192.168.1.10 |
-t nat でNAT宣言、-A
PREROUTINGで、外部ネットワークのアドレス(-d
172.16.1.10)から、eth0にパケットが送られてきたら(-i
eth0)、192.168.1.10に転送しますよ〜。 特定の外部のサーバからパケットを受け入れる場合その2(NAT)
iptables -t nat -A PREROUTING -d
172.16.0.10 -i eth0 -p tcp --dport 80 -j DNAT --to
192.168.0.10 |
-t nat でNAT宣言、-A
PREROUTINGで外部ネットワークから受信するパケットを対象に、外部ネットワークのアドレス(-d 172.16.1.10)から、eth0にパケットが送られてきた(-i
eth0)かつ、プロトコルがTCPでポートが80の場合、192.168.1.10に転送しますよ〜。 ゲームやる時必要になる静的NAT(NAT)
iptables -t nat -A PREROUTING -p tcp
--dport 7000 -i eth0 -j DNAT --to 192.168.0.10:7000 iptables -t nat
-A PREROUTING -p udp
--dport 7000 -i eth0 -j DNAT --to 192.168.0.10:7000 |
ネットゲーで、自分がサーバを提供する場合必要になる。-t nat でNAT宣言、-A
PREROUTINGで外部ネットワークから受信するパケットを対象に、tcpプロトコル及びudpプロトコル7000番のパケットが、eth0に送られてきたら、192.168.1.10の7000ポートに転送しますよ〜。
ループバックアドレス
iptables -A
INPUT -s 127.0.0.1 -d 127.0.0.1 -j
ACCEPT iptables -A
INPUT -s 127.0.0.1 -d 127.0.0.1 -j
ACCEPT |
ループバックアドレスに関してはすべて許可する。 ゲームやる時必要なフィルタリング
iptables -A
FORWARD -i eth0 -p tcp --dport
1024:65535 -j ACCEPT |
ネトゲーに必要なフィルタリング。EQでは1024番以降のパケット通さないとゲームできませんのでこの設定が必要。つ〜か通しておけば何のゲームでもできる。eth0から入ってきたパケット1024〜65535はクライアントに流す。ただしほとんどパケットを受け入れる状態になるのでゲームサーバーのアドレスが解っていたら指定するに限る。 www用フィルタリング
iptables -A
FORWARD -i eth0 -p tcp --dport 80
-j ACCEPT |
www用に80を設定。すでにお判りだと思うが、あとは自分で使いたいポートを好きなようにパケット通せば良い。smtpは25番とかね。ftpに関しては20:21を通すだけでなく下記のモジュールのロードが必要。
プライベートアドレス側からftpを使えるようにする
/sbin/insmod
ip_nat_ftp /sbin/insmod ip_conntrack_ftp |
ftpちゅ〜のは特別なことをしてるそうで、単純にフィルタリングを掛けるだけでは使えない。使えるようにするには上記のモジュールをロードする必要がある。
|