Copyright © 2000-2005 eazyfox. All Rights Reserved.
HOME| Firewall | Security| 製品紹介| SecuTool| Forest| Hello| Link| 掲示板| 雑談掲示板| SiteMap| Contact
Home > Hello > ホームサーバの構成

ホームサーバの構成

当サイトのサーバとソフトウェアの構成をメモ代わりですが公開しておきます。

ハード構成

初代(2003/09/12〜2004/03/11)

CPU AMD K6-2 400MHz 本来Pentium166が動くマシンですがメルコのアクセラレータを使って66MHz×6で動かしています
Memory 160MByte SDRAM 本体32M+128M増設です。66MHzの動作です
MotherBoard NEC MA16C リース切れのオフィス用途のPCを貰ってきました。Pen166〜233が動く機械です
HDD ST32122A DMA33で動く2GのHDD一本で動かしています。いらないものはすべて削除して空き容量600Mを確保していました

現在は現役を引退していますがK6-3/400を載せてサーバ構成のテスト用マシンとして使っています。あらためてK6-3の速度には驚かされます。実質2代目のPen3-700と同じくらいの処理速度を持っています。

2代目(2004/03/11〜)

CPU Intel Pentium3 750MHz(Coppermine) Coppermine(Socket370)です。今となっては旧式非力ですが消費電力は20W以下なので以前使用していたK6-2/400といい勝負。我が家で唯一の稼動中Intel製CPUです
Memory 256MByte SDRAM 規格はPC-100です。もう少し容量がほしいのですがPC-100/133の値段が高すぎですね
MotherBoard Chaintech CT-6SFV SiS630搭載のFlex-ATXマザーです。ドライバはChaintechには無く、SiSから630用のドライバを落してつかっています。どうやら欧州でOEM供給用の製品のようです。ドライバはSiSのHome > Support&Download から落とします
HDD ST320413A SeagateのATA100対応の20Gです。CT-6SFVがATA66対応なので性能を発揮していません。容量は1Gくらいしか使わないので、余ったスペースは遊んでいます。
パティションはシステム7G、データ10G、Norton Ghost用3Gになっています。NortonGhost用のパティションはWindows上ではドライブレターを振っていないのでGhost実行時のみ参照できるようにしています

VGAやLANアダプタはSiS630内蔵の物を使っています。VAGは相当ひどいですが見る機会も少ないので我慢できます。サーバ専用のハード構成ですのでクライアントとして使用している機器に比べるとスペックは3世代くらい違いますが、充分な(主観的ですが)処理能力だと思います。

ソフトウェア構成

OS Windows2000 OSはWindows系を選択しました。Linuxに移行するのはもう少し自信が付いてから・・・
httpサーバ apache2+ActivePerl 定番です。mod_perlも入れてみましたがボトルネックはデータの参照のようで余り効果はありませんでした。それ以前に私のサイトの掲示板はアクセスが少ないので・・・
ftpサーバ CerBerusFTP 余計な機能が一切無いFTPサーバです。サイトのコンテンツのUploadとLogの保存にだけ使用しています
smtp・popサーバ ArGosoft Mail Server iMail Expressと両方installして簡単なArGoにしましたが、機能はiMailのほうが上です
Mail Enable White/Black Listからメーリングリストまで使えるFreeなメールサーバです。ちょっと設定がややこしいけど
NAT RRAS Windows標準のルーティングとリモートアクセスサービスのIPルータ機能を使用。LAN側のDHCPサーバ機能とDNS-Proxy機能があるのでNATを構成するには便利。
Firewall RRAS付属のパケットフィルタ RRASのパケットフィルタはポートの範囲指定ができないのですがIP Routerとして統合された機能を持っているため仕方なく使用しています
PktFilter RRASからPktFilterに変えました。ルールは一回作るだけなのでテキストでも問題なし。ステートレスなので動作も機敏
AntiVirus AVG6 定番。UpdateとScanをスケジュール実行しています。
DynamicDNS DiCE 定期的に更新する設定になっています
時刻同期 Dimension4 サービスとして動作する時刻同期ツール。時計の誤差がグラフで出る優れもの
リモート運用 VNC サーバのキーボードとマウスは外しています。操作は全てVNCを使ってリモートで行っています

Firewallの詳細はパケットフィルタ方式のFirewallにまとめました。使っているソフトは全て定番の製品ばかりです(たぶん)。特別な設定ありませんが参考までに

ftpサーバ 接続許可アドレスを192.168.1.0/24と設定する。また動作するNICからInternet側を外して外部からの接続を受け付けない
Mailサーバ ドメインは3つ指定。smtpは承認が必要とする
VNC 接続可能アドレスを192.168.1.0/24と設定する

運用中のドメイン

現在運用しているドメインはdynDNSのeazyfox.homelinux.orgのほかにメール用のドメインと仕事用メールのドメインの3つが動いています。いずれapacheをバーチャルドメイン対応に設定を変更して別のサイトを立ち上げようと思っています。


サーバ設定の記録


Mod_Perlの導入

apacheでCGIを高速化する手法の代表的なものがmod_perlの導入である。筆者はCGIもPerlもapacheも詳しくないのでサイトを巡って情報を集め、入れて試すだけなので間違っているかもしれないが、Windowsのapache2での事例が少ないため参考程度に見てください。

導入の手順

  1. apache2のインストール
  2. ActivePerlのインストール
  3. ppm3の実行
  4. httpd.confの編集
  5. startup.plの作成
  6. apacheのrestart

1〜2については他のサイトのほうが詳しいのでここでは省略します。ActivePerlのinstall時に必ず3.で実行するppm3を忘れずにインストールしてください。
3.のppm3を使ってのmod_perlインストールの実行は本家mod_perlのサイトの情報からDOSウィンドウを開いて

「ppm3 install http://theoryx5.uwinnipeg.ca/ppms/mod_perl.ppd」と入力します。

すると指定のサイトからモジュールをDownloadしてインストールまでを勝手に実行してくれます。まず最初にDownloadのメッセージが出て、数分で"install〜〜〜"というメッセージが大量に出てきます。
それが終わると"mod_perlのpleace〜"とmod_perlをどこにインストールするのか?というメッセージで止まるのでapache2をインストールした先にあるmodulesフォルダを指定します。例えば"C:\Program files\Apache Group\Apache2\modules"というようにフルパスで指定します。するとすぐにインストールが終了しますが、この終了時にDOS画面に表示されたメッセージの下から5行くらいをよく見てください。
そこにはhttp.confに「LoadFile "C:/Perl/bin/perl58.dll"」と「LoadModule perl_module modules/mod_perl.so」を追加しろ!とスタートスクリプトで「Apache2 ();」を実行しろ!という内容が表示されているはずです。

最初のLoadFileの後のperl58.dllとそのパス名は環境により異なります。C:/ActiPerl/bin/perl59.dllかもしれないしC:/Perl/bin/perl56.dllかもしれません。ActivePerlのインストール先とバージョンにより異なるということです。

(注意) 筆者は最初ActivePerlをC:\Program Files\ActivePerlというフォルダにインストールしたところppmでの実行スクリプトがロングファイル名に対応していなかったためエラーが発生してインストールできませんでした。ActivePerlはC;\Perlにインストールしたほうがいいようです(ppmを使わずスクリプトを編集すればいいのですが、やり方がわかりません))

ではmod_perlをppmでインストールしたときに表示されたメッセージのとおりhttpd.confを編集(追加)します。Win32用の説明を参考にしてください。

LoadFile "C:/Perl/bin/perl58.dll" 必ずLoadModuleの前にこのLoadFileを挿入します
LoadModule perl_module modules/mod_perl.so mod_perlのモジュールをLoadするように指定します
PerlRequire "C:/Apache2/conf/extra.pl" スタートアップスクリプトを指定します。スクリプトの内容は下記に示します
   
Alias /perl/ "/Apache2/perl/" エイリアスでmod_perlで実行したいperlモジュールを置くフォルダに別名を与えます
<Location /perl> /perlという位置(ロケーション)についての設定
    SetHandler perl-script
    PerlResponseHandler
    ModPerl::Registry レジストリモードで実行させるときの指定です
    Options +ExecCGI このフォルダでCGIの実行を許可させます
    PerlOptions +ParseHeaders perlの実行時にヘッダを付加させます
</Location>

つぎにスタートアップスクリプトを作成してhttpd.confと同じフォルダに保存します(上記のhttpd.confの指定でextra.plのフォルダを変えればどこでもいいはず)。スクリプトは下記の内容です。

use Apache2 ();
use ModPerl::Util ();
use Apache::RequestRec ();
use Apache::RequestIO ();
use Apache::RequestUtil ();
use Apache::Server ();
use Apache::ServerUtil ();
use Apache::Connection ();
use Apache::Log ();
use Apache::Const -compile => ':common';
use APR::Const -compile => ':common';
use APR::Table ();
use Apache::compat ();
use ModPerl::Registry ();
use CGI ();
1;

スクリプトの内容はmod_perlのWin32用のサイトから持ってきたものなので詳細は???です。ただ最初のApache2()を実行しないとModPerl::registry()が@INCに無いぞ!とApacheのエラーログに出力されます。これはApacheとApache2で参照するモジュールの保存先が異なるためらしいです。
あとは実行するPerlモジュール実行させてみてください。

この記述の内容で一応mod_perlの元で実行されているのを環境変数から確認できました。でもapacheのベンチマークでテストしたところmod_perl導入で劇的な効果はありませんでした。ただしmod_perlの導入で遅くなることはありませんでした。やはりボトルネックは掲示板起動時のデータ参照のようです。もしどこかが抜けているか間違っているのであればここが違うぞ!というメールをお待ちしておりますのでご指導下さい。

AcceptExエラーについて

Apache2で度々エラーログに
・セマフォがタイムアウトしました。 : winnt_accept: Asynchronous AcceptEx failed
・指定されたネットワーク名は利用できません。 : winnt_accept: Asynchronous AcceptEx failed.
・ネットワークに到達できません。: winnt_accept: Asynchronous AcceptEx failed.
とAcceptExのエラーが出力される。どうもWindowsのwinsockが原因らしいがVer.2.0.49 からconfに1行設定を入れることで回避できるようになった。
「MPM_WinNT」のモジュールのところに"Win32DisableAcceptEx"を追加するだけ。

# WinNT MPM
# ThreadsPerChild: constant number of worker threads in the server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_winnt.c>
  ThreadsPerChild 50
  MaxRequestsPerChild 0
  Win32DisableAcceptEx ←こいつを追加する
</IfModule>

これでログからいやなエラーは消滅する。Apache起動時にイベントログに
The Apache service named reported the following error:
>>> [Tue May 04 12:08:12 2004] [notice] Disabled use of AcceptEx() WinSock2 API
と赤Xで警告メッセージがでるが気にしなくてよい。
Windowsのwinsock2が実装しているAcceptExの仕様がUnix系のAcceptExと異なるためエラーが発生しているらしい。AcceptExは複数の要求が同時に来るようなケースではこまめに処理できるのでhttpサーバには適した処理なのだが、Microsoftに直す気が無いようなのであきらめるしかない。

ヴァーチャルホストの設定

apacheをヴァーチャルホスト(マルチドメイン・ヴァーチャルドメインとかの表現もある)の設定に変更した。変更はhttpd.confを編集するだけだが、気をつけないといけないことは単一ドメインで運用していたときのDirectory、CGI、Logに関する設定は全て無視されて全てVirtualHostの中にそれぞれのドメインごとに記述をしないといけないということらしい。単一ドメインの時との関係は

単一ドメインの設定 ヴァーチャルホストの設定  
ServerName
DocumentRoot
<Directory>
</Directory>
ServerName (単一ドメインのときのまま)
DocumentRoot (単一ドメインのときのまま)
<Directory> (ヴァーチャルホストに移動する)
</Directory>

<VirtualHost *>
 ServerName (上記の単一ドメインと同じものを記述する)
 DocumentRoot (上記の単一ドメインと同じもの)
 <Directory> (単一ドメインのときの記述をここに移動する)
 </Directory>
<VirtualHost *>
プライマリのVirtualHostではServerNameとDocumentRootは単一ドメインの指定と同じものを記述することになる。

設定した環境はシングルIP(DynamicDNS使用)で複数のホストを定義したものである。

NameVirtualHost * ←すべてのIPアドレスを対象とするときは"*"を使う(IPごとにホストを指定しないときは*ということ)

# Default Site eazyfox.homelinux.org (Firewall&Forestをプライマリのサイトにするため最初に定義する)
<VirtualHost *>
 ServerAdmin xxxxxxx@softhome.net
 DocumentRoot D:/http_Doc/Firewall_Forest/ ←ここは単一ドメインで記述していたDocumentRootと同じものを書く
 ServerName eazyfox.homelinux.org ←ここは単一ドメインで記述していたServerNameと同じものを書く
 ErrorLog "|\"D:/LogData/rotatelogs.exe\" \"D:/LogData/Apache/FF_error%Y%m%d.log\" 86400 540"←ここは単一ドメインで記述していたErrorlogを移動させた
 # gif, jpg.png の呼び出しとLocalからのアクセス、カウンターへのアクセス記録をログに書き込まない
 SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)$" nolog
 SetEnvIf Remote_Addr 192.168.1. nolog
 SetEnvIf Request_URI "counter.cgi" nolog
 CustomLog "|\"D:/LogData/rotatelogs.exe\" \"D:/LogData/Apache/FF_access%Y%m%d.log\" 86400 540" combined env=!nolog ←ここは単一ドメインで記述していたCustomlogを移動させる

 <Directory "D:/http_Doc/Firewall_Forest/"> ←DocumentRootの設定はVirtualHostの中に移動させた
  Options FollowSymLinks
  AllowOverride None
  Order allow,deny
  Allow from all
 </Directory>

 ScriptAlias /cgi-bin/ "D:/http_Doc/Firewall_Forest/cgi-bin/" ←CGI Scriptの設定はVirtualHostの中に移動させた
 <Directory "D:/http_Doc/Firewall_Forest/cgi-bin">
  Options ExecCGI
  AddHandler cgi-script .cgi
  Allow from all
 </Directory>
</VirtualHost>

以上が1つのサイト分の定義。最初に設定したヴァーチャルホストがホストが見つからないときやIPアドレスだけでのアクセス時に表示されるプライマリのVirtualHostになる。以下同様に各サイトを<VirtualHost>〜</VirtualHost>に繰り返して定義する。単一ドメインのときに定義したログのローテーション、ScriptAliasもVirtualHostに移動していることに注意してほしい。

ついでに最近流行の30kを超えるIISのWebDavの脆弱性を狙ったアクセスの排除のためにダミーサイトをプライマリに変更した

SEARCH /\x90\x02\xb1・・・・アクセスのログ排除の対応
<VirtualHost *>
 ServerAdmin xxxxxx@softhome.net
 DocumentRoot D:/http_Doc/Dummy/
 ServerName dummy.com
 ErrorLog D:/LogData/Apache/dm_error.log
 CustomLog D:/LogData/Apache/dm_access.log common

 <Directory "D:/http_Doc/Dummy">
  Options FollowSymLinks
  AllowOverride None
  Order allow,deny
  Allow from all
 </Directory>
</VirtualHost>

<VirtualHost *>
ServerAdmin yyyyyy@softhome.net
DocumentRoot D:/http_Doc/eazyfox/
ServerName eazyfox.homelinux.org
プライマリのVirtualHostをダミーサイトに変更

ダミーサイトだが実際にフォルダを作成する(中身は空)
ダミーサイトなので名前は何でもよい
ここにダミーサイト専用のエラーログ名を設定する
ここにダミーサイト専用のアクセスログ名を設定する

Directoryも一応つけておいた。でもコンテンツは何も無い







ここからが本当の公開サイト

これでIPアドレスだけでサイト名が付随しないワーム系アクセスはダミーサイトへ行っていただける。


試していないのだがSetEnvIfやDirectoryの定義はVirtualHostの外でもいいように思われる。rotatelogs.exeを外部に出したのは筆者の趣味だけの問題だから気にしないでほしい。

RealVNCのLAN側への許可

RealVNCのレジストリを編集して192.168.1.xxxからのアクセスだけを許可するように設定する

HKEY_LOCAL_MACHINE\SOFTWARE\ORL\WinVNC3に "AuthHosts"をREG_SZで追加。設定値は"-:+192.168.1:"