[ @FreeDの設定 | FreeBSDトップ | SpamAssassin 設定 ]


サーバ構築

daemon


Introduction


今更ながら FreeBSD を使用したサーバの構築についてのメモ。
NTT 東日本によるFLET'S ADSL を使用して、EditNet という ISP に PPPoE で常時接続して、各種サーバを運用するためのメモ。 EditNet を選択したのは、固定 IPアドレスが利用でき、 逆引き DNS やセカンダリ DNS の設定を行ってくれるから。 FreeBSD を各サーバに使用しているというのも理由の一つではある。

機能


サーバ上で実現した機能を以下に示す。

  • PPPoE 接続
  • ゲートウェイ
  • パケットフィルタリング
  • NAT
  • シリアルコンソールによるアクセス
  • PPP によるダイアルアップサーバ

カーネル再構築


インストールは通常通りに行い、まずはカーネルの再構築を行う。
カーネルレベルで必要なのは PPPoE 接続、IPFW によるパケットフィルタリング、 NAT による IP アドレス変換機能なので、 カーネルコンフィグレーションでそれらを有効にしつつ、 不要な機能やデバイスを削除する。

以下に現在使用中のカーネルコンフィグレーション概要を示す。

options NETGRAPH PPPoE 対応
options NETGRAPH_ETHER
options NETGRAPH_PPOE
options NETGRAPH_SOCKET
options IPFIREWALL IPFW によるパケットフィルタリングサポート
options IPFIREWALL_VERVOSE IPFW のログ出力
options IPFIREWALL_VERVOSE_LIMIT=500 ルールセット毎に 500 行のログを出力
options IPDIVERT natd による IPアドレス変換
options TCP_DROP_SYNFIN syn flood 攻撃/nmap によるスキャンへの対策
pseudo-device tun PPP を利用するために tun デバイスを有効にする

カーネルから削除した機能・ドライバ

options MATH_EMULATE 浮動小数点演算プロセッサは内蔵しているので不要
options INET6 IPv6 は現状では不要
options MD_ROOT Momory Filesystem を root デバイスにはしないので不要
options NFS_ROOT Network File System を root デバイスにはしないので不要
options CD9660_ROOT CDROM ドライブを root デバイスにはしないので不要
options SMP マルチプロセッサではないので不要
options APIC_IO
device eisa eisa デバイスは装備していないので不要
device fdc0 Floppy ドライブは装備していないので不要
device fd0
device fd1
device ahb
   :
SCSIデバイスは使用しないので不要
device asr
   :
RAIDコントローラは使用しないので不要
device card PCCARD は装備していないので不要
device pcic0
device pcic1
pseudo-device sl SLIP は使用しないので不要
pseudo-device gif IPv6 は使用しないので IPv4/IPv6 トンネルデバイスは不要
pseudo-device faith
device firewire IEEE 1394 は装備していないので不要
device sbp
device fwe

コンフィグレーションファイルの設定が終了したら 通常の方法でカーネルの再構築を行う。

PPPoE の設定


ppp (8) を利用するための設定を行う。
PPP とは Point to Point Protocol の略で二点間を直接接続するプロトコル。 主に電話線を利用して IP 接続を利用するために利用されてきたが、 最近の aDSL では多くの ISP が PPPoE(PPP over Ethernet)として利用している。
PPPoE は簡単に言うと、PPP プロトコルを Ethernet 上を通す事により認証する技術。
PPP の仕様は RFC1134 で初めて提唱され、以後改訂や仕様の追加変更を経て、 現在は RFC1570、1661、1662、1994、2153、2284、2484 により定義されている。

設定ファイルは /etc/ppp/ppp.conf を使用する。 このファイルで PPPoE 接続で使用インタフェースや各種オプション、 そして昨今有名になった MTU 等を設定する。
また、NTT がフレッツユーザ向けに展開しているフレッツスクエアに ppp の接続先を変更しないで接続するためのマルチセッションの設定を行う。

default:

set device PPPoE:インタフェース # PPPoE 接続で使用するデバイス名称

set mru 1454 # MRU(最大受信単位)を 1454 バイト

set mtu 1454 # MTU(最大送信単位)を 1454 バイト

set log Phase tun command # ログ出力項目の設定

accept CHAP # 認証方式は CHAP のみ

set speed sync # 同期デバイスとして使用

set timeout 0 # アイドルタイマ機能を使用しない

set ctsrts off # ハードウェアフロー制御を off にする

provider:

set authname ユーザID # ISP に接続するための ID

set authkey パスワード # ISP に接続するためのパスワード

set ifaddr LOCAL REMOTE # 固定IPアドレスを使用

add default HISADDR # 接続先を default route に設定する

set mode ddial # 接続後にモードを ddial に設定する

square:

set authname guest@flets # フレッツスクエアに接続するための ID

set authkey guest # フレッツスクエアに接続するためのパスワード

nat enable yes # フレッツスクエア宛は ppp の nat

add 220.210.194.0/25 HISADDR # フレッツスクエア宛の静的ルーティング

add 220.210.195.0/26 HISADDR

add 220.210.195.64/26 HISADDR

add 220.210.199.0/27 HISADDR

add 220.210.203.0/27 HISADDR

add 220.210.199.128/28 HISADDR

add 220.210.199.160/28 HISADDR

add 220.210.199.192/29 HISADDR

add 220.210.199.176/28 HISADDR

add 220.210.199.216/29 HISADDR

add 220.210.199.32/27 HISADDR

add 220.210.199.200/29 HISADDR

add 220.210.197.0/27 HISADDR

add 220.210.199.64/28 HISADDR

add 220.210.199.208/29 HISADDR

add 220.210.198.0/26 HISADDR

add 220.210.196.0/25 HISADDR

add 220.210.196.128/26 HISADDR

add 220.210.196.192/27 HISADDR

add 220.210.199.144/28 HISADDR
default:provider:square: で始まる行は必ず行頭から始め、 それ以外の行は必ず先頭にスペースかタブを入れなければならない。
ルーティング情報は 2007/11/27 現在の情報であり、 変更になる可能性がある。

上記設定を行った上で ppp (8) コマンドを実行して接続動作を確認する。 動作が問題ない場合は 起動時に ppp 接続が開始される様 /etc/rc.conf に以下の設定を追加する。
当初、ppp_modeddial を指定していたが、 そうすると ppp 接続が開始される前にバックグラウンドで実行してしまうため ppp で使用する tun デバイスが生成される前に named (8) 等が起動されてしまい、 正常にサービスが提供できなくなってしまう。 そこで、接続開始までは background を指定し 接続が確立した後で ddial を設定する様にする。

ppp_enable="YES" ppp を有効にする
ppp_mode="background" ppp は background モードで実行
ppp_profile="-unit0 provider" 使用するプロファイルを指定
ppp_nat="NO" ppp による nat は使用しない。

フレッツスクエアは /usr/local/etc/rc.d/square を作成し、 起動時に自動接続される様に設定する。 作成した起動スクリプトは最近の FreeBSD の流儀を継承した作りなので、 /etc/rc.conf に自動起動するための設定を追加する。

square_enable="YES" square 接続を有効にする
square_flags="-ddial -unit1 square" 使用するプロファイルを指定

パケットフィルタリング


ipfw (8) を使用してパケットフィルタリングを行い、 ファイアウォールとして動作させる。
パケットフィルタリングの基本設定は /etc/rc.firewall に定義されており、 /etc/rc.conf で変数を定義する事により最低限のフィルタリングは可能である。
但し、標準の設定はあくまでも簡易的な設定なので、 独自の設定ファイルを用意して 詳細な設定を行うことにより詳細な設定を独自に定義する。
基本的なポリシーを以下に示す。
  • 断片化したパケットは拒否
  • インターネットからの ping は拒否
  • ローカルネットワーク内の通信は全て許可
  • ppp 経由の通信は全て許可
  • インターネットから private アドレスを詐称して到達するパケットは拒否
  • NetBIOS は拒否
  • 通信が確立したパケットは許可
  • インターネットからの WWW 接続(ポート80)要求は許可
  • インターネットからの SSH 接続(ポート22)要求は許可
  • インターネットからの SMTP 接続(ポート25)要求は許可
  • インターネットからの POP 接続(ポート110)要求は許可
  • インターネットからの DNS 接続(ポート53)要求は許可
  • 時刻問合わせパケット(Port 123)は許可
上記設定を行った上で動作を確認する。
特にルールの初期化を実行すると全ての通信が遮断されるので、 設定の確認を実施している場合は必ずコンソールを確保して作業するのが望ましい。
動作が問題ない場合は起動時にルールが適用される様に /etc/rc.conf に以下の設定を追加する。

firewall_enable="YES" firewall を有効にする
firewall_script="設定ファイル名" 設定ファイルのフルパス

NAT の設定


natd (8) を利用するための設定を行う。
NAT とは Network Address Translation の略で、 ネットワークアドレス変換機能の事を示す。
プライベートアドレスしか付与されていないコンピュータは インターネットと通信を行う事ができないので、 パケットが通過する際にパケットの送信元に設定されているプライベートアドレスを 自分自身のグローバルアドレスに書き換えてインターネットに送信し、 戻ってきたパケットの送信先に設定されている自分自身のアドレスを 元の送信先プライベートアドレスに書き換えて パケットを送信したコンピュータに送信する仕組みである。

設定ファイル/usr/local/etc/natd.conf に以下の設定を行う。

deny_incoming no # 内部変換テーブルに存在しないパケットの入力を拒否しない
use_sockets yes # FTP data コネクション等を確立する際に socket を割り当てる
# ポートが衝突する場合でもコネクションを保証
same_ports yes # 変換時にできるだけポート番号を変更しないようにする
unregisterd_only yes # 登録されていない発信元のパケットのみを変換する
dynamic yes # IPアドレスの変更に動的に対応する
log no # 統計や情報を出力しない
verbose no # 起動時に daemon (3) をコールして制御端末から切り離す

起動時に natd が有効になるよう/etc/rc.conf に以下の設定を追加する。

natd_enable="YES" natd を有効にする
natd_interface="インタフェース" NAT による変換を実施するインタフェース指定
natd_flags="-f 設定ファイル名" 設定ファイルを明示的に指定

シリアルコンソールによるアクセス


サーバとして運用する場合、通常時はディスプレイやキーボードを接続しない。
しかし、その状態だと緊急時の作業が非常に困難になってしまうので、 緊急時にはシリアルコンソールを使用して操作を可能とする。
起動時にキーボードを検出した場合は内蔵コンソールを使用し、 そうでない場合はシリアルコンソールを使用するために、 ブートブロックに -Pオプションを設定する。 そのために、/boot.config というファイルを作成し、 以下の内容を記述する。

-P

ブートメッセージが表示された後、シリアルコンソールからログインするために /etc/ttys に以下の記述を追加する。

# デバイス getty タイプ 起動 root ログイン
ttyd0 "/usr/libexec/getty std.9600" vt100 on secure

PPP ダイアルアップサーバ


普段外出先からは @FreeD を利用してネットワークに接続しているが、 PHS なので都心部を離れると電波が届かない場合が多く、 また、aDSL が切断してしまった場合でもサーバにアクセスできるように ダイアルアップサーバ(PPPサーバ)として稼働させる。

ISP への接続は ppp (8) を使用したが、 PPP サーバとしては pppd (8) を使用して設定を行う。
pppd がサーバとして動作する様に /etc/ppp/options に以下の記述を追加する。

/dev/デバイス 通信に使用するデバイス名称
38400 デバイスで使用するボーレート
crtscts フロー制御にハードウェアフロー制御を使用する
lock UUCP 形式の排他ロックファイルを使用する
passive LCP で相手からの応答を待つ
LOCAL アドレス:REMOTE アドレス クライアントに付与するIPアドレスを指定する
domain ドメイン名 クライアントに設定するドメイン名を指定する
modem モデム制御線を使用する
ms-dns ネームサーバ Micorosoft Windows クライアント用の設定
netmask マスク インタフェースのネットマスクを指定
proxyarp PROXY ARP を使用する

次にクライアントから接続要求が有った場合に使用する認証情報を /etc/ppp/pap-secrets に記述する。

ユーザID * "" *
このファイルは root 以外は読み込み不可に設定する必要がある

次はモデム経由でシリアルポートに着信した場合に実行されるプログラムの設定を行う。
まずは ports を利用して mgetty+sendfax をインストールし、 PPP による接続要求があった場合には自動的に PPP セッションを起動し、 そうでない場合は通常のシリアル接続によるログインが可能な様に、 /usr/local/etc/mgetty+sendfax/login.config に 以下の記述を追加する。

/AutoPPP/ - a_ppp /usr/sbin/pppd auth +pap +chap login debug

更にシリアルポートに接続したモデムのハードウェア制御を有効にするために、 /etc/rc.serial に以下の記述を追加する。

modem d a 1 2

最後はモデムを接続するシリアルポートを mgetty+sendfax が監視する様に、 /etc/ttys に以下の記述を追加する。

# デバイス getty タイプ 起動 root ログイン
デバイス "/usr/local/sbin/mgetty" unknown on insecure




Last Update: Nov. 27 2005 Copyright © Mitzyuki IMAIZUMI 2002,2004,2005 All Rights Reserved,