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_modeはddialを指定していたが、
そうすると 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というファイルを作成し、
以下の内容を記述する。
ブートメッセージが表示された後、シリアルコンソールからログインするために
/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に
記述する。
このファイルは 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に以下の記述を追加する。
最後はモデムを接続するシリアルポートを mgetty+sendfaxが監視する様に、
/etc/ttysに以下の記述を追加する。
# 端末デバイス
|
getty プログラム
|
端末タイプ
|
getty の起動
|
root ログインを拒否
|
デバイス
|
"/usr/local/sbin/mgetty"
|
unknown
|
on
|
insecure
|
|
|