http://www.jspeed.ne.jp/



俺でも解るIPTABLES
1.フィルタリングとアドレス変換

パケットフィルタリングとは:
パケットのヘッダー部分を見て、 設定した条件(送信元IPアドレスや宛先IPアドレス、ポート番号など)と一致するかどうかを判 定して、 一致する場合は設定したアクション(転送、破棄、アドレス書き換えなど)を行うものである。

アドレス変換とは:
パケットのヘッダー部分を見て、設定した条件と一致するかどうかを判定し、 一致する場合はヘッダーのIPアドレスやポート番号を書き換えるものである。

2.ipchainsとの違い

などと ipchains と iptables を比較して、解説してるページがあるが混乱するだけなので、ipchainsのことは忘れてしまった方が良いと思う。よってここでは解説しない。

 
3.「テーブル」という概念

パケットフィルタリング専用の 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の関係は下図を見ると解りやすいと思う。

 
5.iptablesコマンドのオプション

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ちゅ〜のは特別なことをしてるそうで、単純にフィルタリングを掛けるだけでは使えない。使えるようにするには上記のモジュールをロードする必要がある。

 

 


[PR]動画