2009年4月12日日曜日

Debian(lenny)でルータ!

研究室のDHCP兼ルータサーバを引き継いだのですが、
時期が中途半端だったために、えらい苦労しました。

思うにサーバは構築途中で誰かが引きついじゃいけませんね。
資料が残っていても、実際その資料を書くまでに何を試して何をやってなかったかが
わからないので、ものすごい労力の無駄が発生します。。。

一から構築するなら、それも経験になるけど、
半端に引き継ぐと結局知識も体系的につかないので、あまり嬉しくない。

つまりは動作確認ぐらいしてから卒業して欲しかった(怒)ということで。
いや、せめて設定を変に飛ばさずに、順々にやってくれれば…。



閑話休題。



というわけで、Debian(Lenny)でルータを構築しました。

ルータにも色々種類がありますが、今回構築したのはNAT/IPマスカレードです。
N個のプライベートアドレスしかないのサーバが外にアクセスする際、
そのネットワークの元締め(ゲートウェイ)であるルータが持っているM個のグローバルに
それぞれ結びつけるというものです。

DHCP、iptablesのインストール、固定IPを持つホストの設定、
それからiptables設定スクリプトのの基礎設定までは前任者がやってくださっていたのですが、
iptablesの設定スクリプトをいくらいじってもルータとして機能してくれませんでした。

原因はカーネルモジュールの不足。
iptable_natというモジュールをロードしないと、Debianはルータとして動いてくれません(;_;)

まず以下のコマンドで、iptable_natをロード。

# modprobe iptable_nat

それから、以下のコマンドでロードされた結果を確認。
もし、iptable_natがなければ、何も出力されないので、上のコマンドをもう一回試しましょう。

# lsmod|grep iptable

>> 出力結果

iptable_filter 2560 1
iptable_nat 4616 1
似たようなのが何行か続く。

そして、起動時に自動でモジュールがロードされるように設定します。

# echo ‘iptable_nat’ >> /etc/modules

カーネルモジュールのロードに必要な作業はここまで。
次にNAT/IPマスカレードを有効にするために、以下の設定を行います。

# vi /etc/sysctl.conf

======================
net.ipv4.tcp_syncookies = 1 # syn攻撃対策
net.ipv4.ip_forward = 1 # NATを有効化
net.ipv4.icmp_echo_ignore_broadcasts = 1 # Smurf攻撃対策
net.ipv4.icmp_ignore_bogus_error_responses = 1 #

======================

ところで、ip_forwardは/proc/sys/net/ipv4/ip_forwardにもファイルがあるのですが、
どういう従属関係なんでしょう??
後日、確認。

ここまで設定したら、マシンを再起動。

起動したら、ようやっと用意したiptables.shを実行する段階に移ります。
synフロッドなどのセキュリティ対策の設定を省くと以下のような感じです。
ユーザ定義チェーンを使ってINPUT(ルータへの外部からのアクセス)、FORWARD(転送)を
MYCHAIN処理に飛ばして、両者の処理を一括して書いています。

======================
#!/bin/sh

# 既存の設定をクリア
iptables -F
iptables -t nat -F POSTROUTING
iptables -X

# NAT/IPマスカレードのための設定
iptables -t nat -A POSTROUTING -s 192.168.0.0/16(自分のネットワークを書く) -o eth0 -j MASQUERADE

# 基本ポリシ
# OUTPUT(ルータから外部へのアクセス)はACCEPT許可する
# INPUT(外部からルータへのアクセス)とFORWARD(転送)は原則DROP禁止。
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

# INPUTとFORWARDの処理を一括して設定するために
# 両者をMYCHAINというユーザ定義チェーンに結びつける
iptables -N MYCHAIN
iptables -A FORWARD -j MYCHAIN
iptables -A INPUT -j MYCHAIN

#-------------------------------#
# MYCHAIN == INPUT and FORWARD access
#-------------------------------#

# 自分自身(ローカルホスト: lo)からのINPUT、FORWARDは許可
iptables -A MYCHAIN -i lo -j ACCEPT

# 内部LANからのアクセスも許可
iptables -A MYCHAIN -i eth1 -j ACCEPT

# 既に確立されたアクセスについても許可
iptables -A MYCHAIN -m state --state ESTABLISHED,RELATED -j ACCEPT

# 特定のポートに対するアクセスを許可する
# ここではSSH、DNS、HTTP、HTTPの8080番を許可
iptables -A MYCHAIN -p tcp -m state --state NEW --dport 22 -j ACCEPT
iptables -A MYCHAIN -p tcp -m state --state NEW --sport 22 -j ACCEPT
iptables -A MYCHAIN -p udp -m state --state NEW --dport 53 -j ACCEPT
iptables -A MYCHAIN -p udp -m state --state NEW --sport 53 -j ACCEPT
iptables -A MYCHAIN -p tcp -m state --state NEW --dport 80 -j ACCEPT
iptables -A MYCHAIN -p tcp -m state --state NEW --sport 80 -j ACCEPT
iptables -A MYCHAIN -p tcp -m state --state NEW --dport 8080 -j ACCEPT
iptables -A MYCHAIN -p tcp -m state --state NEW --sport 8080 -j ACCEPT

# icmpは原則OK
iptables -A MYCHAIN -p icmp -j ACCEPT

#------------------------------#
# MYCHAIN end
#------------------------------#
======================

MASQUERADEの行の位置は未だに良く分かっていない。。。
とりあえず動くのでOK。

最後にこのシェルスクリプトを/etc/network/if-up.d/以下にコピー。
これで毎回ネットワークが起動するたびに読み込んでくれる、と。

LAN内部から外部ホームページが見れることだけ確認してOK。

ルータサーバが完成しましたー♪

0 件のコメント: