木曜日, 2月 23, 2006

iptables で router(ルーター)

ずっと前にiptablesの話を書こうと言っていました。
やっと実現。

といっても、フィルターの部分は次回に。
今回はルーターとしての動作について書きます。
iptables自体はデフォルトで組み込まれているので、インストールとかは問題ないですね。

後は設定ファイルを作ります。といっても、コマンド羅列したスクリプトです。
--------------------------------
#!/bin/sh

trusthost='192.168.2.1'
internal_ip='192.168.0.0/16'

my_internet_ip='xxx.xxx.xxx.129'
my_internal_ip='192.168.1.1'

echo 1 > /proc/sys/net/ipv4/ip_forward

##############
#Flush & Reset
##############
iptables -F
iptables -t nat -F
iptables -X

##############
#Deafult Rule
##############
iptables -P FORWARD DROP
iptables -A FORWARD -i eth0 -o eth1 -s $internal_ip -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 --protocol tcp --dport 80 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#################
#SNAT(masquerade)
#################
iptables -t nat -A POSTROUTING -o eth1 -s $internal_ip -j SNAT --to-source $my_internet_ip

#################
#DNAT(masquerade)
#################
iptables -t nat -A PREROUTING -i eth1 --protocol tcp --dport 80 -j DNAT --to-destination $trusthost
--------------------------------
これを実行すれば、ルーターとして動作します。

最初の部分は変数の定義。自分の2つのIP(内側と外側)や、プライベートネットワークのアドレス、後で出てくるポートフォワード(port foward)先のホストなんかを定義してます。
echoの行はルーターとして動作させるために必要です。これをしないとFORWARDが使えません。

次の部分は、まさに初期化。デフォルトのテーブル以外にNAT用のテーブルも使います。

その次がやっとルール。
ここでは、「すべて拒否」の後、「内から外は許可」、「外から80番ポートへのアクセスはtrusthostに転送」、「コネクションが確立した後のパケットは両方向許可」のルールを作成しています。
まあ、最後のは少し嘘ですが、イメージはそんな感じです。このルールを書かない状態が存在するのか謎です。

最後の二つがSNAT(sourceに基づくアドレス変換)とDNAT(destinationによるアドレス変換)です。
この二つがルーターとしては肝ですかね。まあ、シンプルですけど。
MASQUERADEを使った書き方もありますが、PPP接続のように動的にIPが変わる場合に使うものです。
そうでない場合はSNATやDNATを使います。(と、manに書いてある)

これで、プライベートネットワークからインターネットへの接続が許可されます。
さらに、80番ポートへのアクセスはプライベートネットワーク内のホストの80番に転送されるわけですね。
同じように書いていけば、転送するポートやホストを増やせます。
まあ、そんなルール、書かずに済んだほうが幸せな気もしますが。

0 件のコメント: