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


サーバ構築

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 接続で使用インタフェースや各種オプション、 そして昨今有名になった MUT 等を設定する。

default:

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

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

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

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

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

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

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

accept CHAP # 認証方式は CHAP のみ

nat enable no # pppの提供する nat は使用しない

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

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

set ifaddr LOCAL REMOTE # 固定IPアドレスを使用するので設定する

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

set mode ddial # 接続後にモードを ddial に設定する
default:で始まる行は必ず行頭から始め、 それ以外の行は必ず先頭にスペースかタブを入れなければならない。

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

ppp_enable YES
ppp_mode background
ppp_profile default
パケットフィルタリング

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_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_interface NATによる変換を実施するインタフェース
natd_flags -f /usr/local/etc/natd.conf
シリアルコンソールによるアクセス

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

-P

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

# 端末デバイス getty プログラム 端末タイプ 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 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 プログラム 端末タイプ getty の起動 root ログインを拒否
デバイス "/usr/local/sbin/mgetty" unknown on insecure




Last Update: Feb. 14 2005 Copyright © Mitzyuki IMAIZUMI 2002,2004,2005 All Rights Reserved,