woodyでウェブサーバ

私のメモです。参考になればいいですが、間違っていたらごめんなさい。

戯れ言

--------------------------------------------------------

Thanks to logo of debian GNU/Linux




























サーバならDebian

これまでVineLinuxでサーバを立てていたが、kernel + base system + apache + Xだけ 入れたいのに、いらないモノがゴッソリ入ってしまう。サーバを選択してインストール したのに1.2GBも食う。そこで、最小インストールには最適なDebianをCube型PCのサーバ用OSと した。

インストール

最近だと雑誌の付録とかに付いてくるようになったが、ADSL環境にあるなら ネットワークインストールがお奨めである。 Debianのウェブページから辿っていくと、 インターネット経由の Debian GNU/Linux のインストール に行き着いた。ここからリンクされている最小のCDからISOイメージをダウンロードし、CD-RWに焼いて インストールした。

インストールは特に難しいこともなく、NorthBridgeにあるPCI to AGP Bridgeを認識 しない以外は全てのデバイスを認識した。リブート後のパッケージの選択では、Xとウェブサーバを 選択してインストールした。インストール後の容量は450MB弱。さすがDebian。。。

Back to MENU

Xの設定

EPIA-Mシリーズで使われているNorthBrigde CLE266は、まだXでサポートされていない。 しかし、VIAはLinuxへも協力しているようで、 VIA Arenaというサポートページで Linuxのドライバも公開している(公開場所はここ)。 そこから同じカーネル&Xのバージョンを使っているMandrake8.2用のドライバをダウンロードして 入れてみた。解凍して出てくるInstallation.txt、vinstallを読みながら、手動でインストールして XF86Config、/etc.modulesを設定したが、カーネルのバージョン(ディストリビューションの リビジョン含む)が違うためドライバをロードできなかった。 VIAのドライバは使えないので、VESAドライバで立ち上げたところなぜか画面がモニターからはみ出て しまう。これはなぜかScreen Sectionの8bbp、24bbpを設定しているDisplay Subsectionを削除したら ちゃんと表示されるようになった。

VESAドライバの割に、i815よりも綺麗である。また、ウェブを見たりした感じでは 不安定という印象は無かった。なかなか良いと思われる。とはいえ、サーバにXは不要なので /etc/inittabのinitdefaultを3に設定し、/etc/rc3.d/S99xdmをK99xdmにした。

Back to MENU

apacheの設定

DebianもVine同様にある程度セキュアな設定があらかじめしてあるので、 特に設定を行っていない。但し、SSIとcgiを動かすために、コメントアウトさている次の 行のコメントアウトを解除した。

LoadModule includes_module /usr/lib/apache/1.3/mod_include.so
AddHandler cgi-script .cgi
AddType text/html .shtml
AddHandler server-parsed .shtml

もちろん、SSIを走らせるディレクトリには、OptionにIncludesを追加している。
また、charsetをEUC-JPに指定しているhtmlファイルが文字化けするので、AddDefaultCharset off に設定した。

Debianではapacheがwww-dataというユーザ権限で動いている。そのため、 公開する文書があるディレクトリ以下は、次のパーミッションに設定した。

ディレクトリに読みとり権限を与えないのは、indexファイルが無かった際にディレクトリ一覧を 表示させないためである。またファイルはwww-dataユーザorグループ以外からは読みとれ無いよう、 最小限の設定にしている。

その他(認証の設定、不要なサービスの停止など)は VineLinuxの時と同じである。

恐らく、セキュリティ上学ばなくてはならないこと、設定を改善すべきところが あるのだろうが、取りあえずはこれでまともにウェブページが表示され、SSI、CGIが動くようになった。

Back to MENU

iptablesの設定

後述にあるように、サーバでsshdを走らせて別のPCからPuTTYで管理するため、 以前よりportが1つ多く空くことになる。VineLinuxでサーバを立ててた時は、iptablesに ポートを設定していなかった。今回は、ローカルアドレス からのsshd(port 22)とwww(port 80)、及びインターネット側からのwww(port 80)を 許可することとした。但し、プロトコルを指定しないとportの設定は有効にならないようなので、 合わせてプロトコルも指定した。一例を以下に示す。これは/etc/network/interfaceファイルに 追記されている。

up iptables -F
up iptables -P INPUT DROP
up iptables -P FORWARD ACCEPT
up iptables -P OUTPUT ACCEPT
up iptables -A INPUT -i lo -j ACCEPT
up iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
up iptables -A INPUT -p tcp -i eth0 -s 192.168.0.0/24 --dport 80 -j ACCEPT
up iptables -A INPUT -p tcp -i eth0 -s 192.168.0.0/24 --dport 22 -j ACCEPT
up iptables -A INPUT -p tcp -i eth0 -s xxx.xxx.xxx.xxx/yy --dport 80 -j ACCEPT
  # 設定の初期化
  # INPUTの全てを破棄
  # FORWARDの全てを許可
  # OUTPUTの全てを許可
  # ループバックアドレスは全て許可
  # 接続済みのものは全て許可
  # ローカルアドレスのwwwを許可
  # ローカルアドレスのsshを許可
  # インターネットの指定したアドレスのwwwを許可

Back to MENU

sshdの設定

今回、Cube型PC用のモニタやキーボードは買っていないので、 別のPCからリモート管理することになる。セキュアなリモート管理方法として、 telnetの代わりにSSH2(OpenSSH protocol version2)を使った。 下のウェブサイトを参考に、以下の目的で各種設定した。

PuTTYの設定は、Windowsのページを参考のこと。

  1. /etc/ssh/sshd_configの設定

  2. いろいろ調べた末、sshd_configの設定を下のように変更した
    Protocol 2
    PermitRootLogin no
    RSAAuthentication no
    PasswordAuthentication no
    # sshdが使用するprotocolバージョン。SSH1を使用しないので2のみを記述
    # rootでのログインを許可するかどうか。sshログイン用のユーザを作成後に無効にした。
    # DSAを使用するためRSAでの認証は許可しない。
    # 鍵ではなくパスワード認証によるログインは拒否するのでno
    但し、PuTTYでPassword認証でログインしながら設定していたため、 ちゃんと鍵のみでログインできるようなってからPasswordAuthenticationはnoにした。


  3. /etc/hosts.allow、/etc/hosts.denyの設定

  4. sshd_configで認証方法を制限したが、どのアドレスからの接続を許可する かは設定できないようだ。参考にしたウェブの中にはListenAddressで指定できるという ものもあるが、実際に設定してもそのような動作はしなかった (SSH1用なのか?)。 よくよく調べると、ListenAddressはネットワークカードが2枚ある時にどちらか一方だけ から接続を受け付けるような場合に使うようだ。
    さて、sshdへアクセスするホストの制限は、/etc/hosts.allowと /etc/hosts.denyで設定する。具体的には次のように設定した。

  5. ユーザの作成と公開鍵のコピー
  6. sshdで接続するユーザを作成し、~/.ssh/以下に PuTTYのputtygen.exeで作成した公開鍵をコピーする。(以下はフロッピーにて コピーをする場合である)

    # useradd -m User Name
    # mount /floppy
    # su User
    # mkdir /home/User/.ssh
    # cp /floppy/key file /home/user/.ssh/authorized_keys2
    # chmod 600 /home/user/.ssh/authorized_keys2
     # -mはユーザディレクトリ作成&スケルトンコピーのオプション

     # 以下はUserとして作業する
     # ssh用設定ディレクトリを作成
     # ファイル名はSSH2なのでauthorized_keys2とする
     # 公開鍵のパーミッションをUser以外は読めないように変更

    Windowsで作成した公開鍵は、改行文字(^M)が入っていないかを チェックすること。またputtygen.exeで作成した公開鍵を「Save public key」で保存した ファイルは、上述のauthorized_key2ではなくSSH1用の鍵(authorized_keys)である。 SSH2での公開鍵は、putygen.exeの 「Public key for pasting OpenSSH authorized_keys2 file」の下に出てくる文字列を メモ帳にコピー&ペーストしたもので、中身は1行の文字列である。

Back to MENU

sshで参考にしたウェブページ

カーネルの再構築

どうせやるなら徹底的にということで、ネットワーク向けにカーネルを 再構築することとした。

# apt-get install kernel-source-2.4.18
# apt-get install kernel-package
# apt-get install libncurses5-dev
# cd /usr/src
# tar jxvf kernel-source-2.4.18
# ln -s kernel-source-2.4.18 linux
# cd /usr/src/linux
# make menuconfig
  ### 安定版の最新カーネル
  ### Debianのカーネル再構築ツールmake-kpkg用に必要
  ### make menuconfig用に必要
  ### ソースのあるディレクトリに移動
  ### apt-getでインストールされるのはbz2ファイルなので、それを展開
  ### 展開して出来たディレクトリkernel-source-2.4.18へのシンボリックリンクlinuxを作成
  ### /usr/src/linuxへ移動
  ### コマンドラインなのでmake menuconfigを使う

設定のポイントは次の通り。

できあがったコンフィグレーションファイルは これ。 その後は、カーネルを再構築してdpkgコマンドでインストールする。

# make-kpkg --revision 20030211 kernel-image
# cd ..
# dpkg -i kernel-image-2.4.18_20030211_i386.deb
(/etc/lilo.confを確認)
# lilo -v
  ### 適当なリビジョンを設定してカーネルの再構築
  ### 一つ上のディレクトリに移動。コンパイルに成功しているとkernel-image*.debファイルがあるはず。
  ### dpkgでインストール。liloをインストールするかと聞かれるが、取りあえずはnoを選択。

  ### liloの設定を確認した後、新しいカーネルが使えるようにliloをインストール

できあがったカーネルで起動したところ、問題なく起動した。但し、woodyインストール 直後のdmesgで認識(?)していた次のモジュールはmodprobeで組み込めなかった。 実際にデバイスが使われていないのでirqが割り振られていないためと思われる。

カーネルの再構築(ATA133対応)

VIA ArenaVIA EDEN用ドライバのページ から、North Bridge "VT8235"用のLinuxドライバパッチファイルがあることを知った。 早速パッチを当ててみる。

まず、Linux Arena へ行き、Linux用IDEドライバパッチ をダウンロードする。後は以下の手順でパッチを当ててカーネル再構築を行う。

# mkdir {適当なディレクトリ}
# cd {適当なディレクトリ}
# wget http://downloads.viaarena.com/drivers/IDE/ATA133-Linux-PatchFile-V20.zip
# unzip ATA133-Linux-PatchFile-V20.zip
# gunzip mdk8.2-patch-2.4.18-vpide.gz
# cp mdk8.2-patch-2.4.18-vpide /usr/src/
# cp /usr/src/linux/drivers/ide/ide-timing.h /usr/src/linux/drivers/ide/ide-timing.h.back
# cp /usr/src/linux/drivers/ide/via82cxxx.c /usr/src/linux/drivers/ide/via82cxxx.c.back
# cp /usr/src/linux/include/linux/pci_ids.h /usr/src/linux/include/linux/pci_ids.h.back
# patch -p0 < mdk8.2-patch-2.4.18-vpide
  ### 作業用に適当なディレクトリを作成
  ### 作成したディレクトリに移動
  ### wgetでパッチをダウンロードする
  ### unzipコマンドで解凍
  ### 解凍された*.gzファイルをgunzipで解凍する。ここではMandrake用のパッチを使った
  ### パッチを/usr/srcディレクトリにコピーする。
  ### mdk8.2-patch-2.4.18-vpidでパッチの当たるファイルのバックアップをとる(計3つ)。
  ### どのファイルにパッチが当たるかは、mdk8.2-patch-2.4.18-vpidをvi等で見ると分かる。
  ### "diff"で始まる行にパッチが当たるファイルが記述されている。
  ### パッチを当てる。

パッチを当てると、1カ所パッチが当たらない部分があり、via82cxxx.c.rejと言う ファイルが/usr/src/linux/drivers/ide/以下に作成される。内容を見ると、削除する「via_80w = 0;」 という行がオリジナルファイルに無いためにエラーになっている。元々削除するものだったので、 このエラーは問題ないだろう。

後は上述のようにカーネルを再構築すればVT8235を認識し、ATA33→ATA100になり、 PIO→DMAになる。確認等は、パッチを当てる前後で
# hdparm -i /dev/hda
とするとDriver Supportの行にATA-6(UltraATA133)が表示されることで分かる。
(或いはhdparm -t /dev/hdaとして、ベンチマークをしてみると分かる。パッチを当てないと 4MB/sだった転送速度が30MB/s強になるはずである。)

参考

Samba によるCD-ROMの共有

最近では雑誌の1年分の記事がDVDになることが多い。 これをサーバに置いておけば、自分のPCから見ることが出来る上、自分のPCのCD-ROMドライブを 空けて置くことができる。そこで、Samba を使ってCD-ROMをWindows PCから見れるように設定した。

  1. Sambaのインストール
  2. これは、apt-get isntall sambaでOK

  3. smb.confの設定

  4. iptablesの設定
  5. Samba関係のportを空けるため、/etc/network/interfaceに次の設定を追加した。

ちなみにmount -t smbfsを使ってWindowsの共有フォルダをLinuxにマウントするには、次の設定 が必要である。

これでmount -t smbfs -o {Options} //{ServerName}/{ShareFolder} /{Mount Point} でマウント できるようになる。

DynamicDNSと DiCE

Yahoo!BBの仕様が変わったようで、12〜24hに1回グローバルIPアドレスが 変更されてしまう。そのたびに友達にIPアドレスを教えるのが面倒なので、 DynamicDNSを利用することにした。

  1. DynamicDNSの登録
  2. いろいろ探した結果、 ZiVE に決定した。理由は次の2つ。
    登録の画面や設定の詳細は、 GA PO さんDiCE,DynamicDNS設定が 登録画面もあって参考になります。

  3. DiCE の導入
  4. ZiVEでは、サーバ管理者がIPアドレスが変更するたびに設定しなくては ならない。それを自動で行うのがDiCEである。インストール方法などは、 GA PO さんDiCE,DynamicDNS設定 に書かれた通りである。その他の設定のポイントは次の通り。

DiCEの 動作とiptablesの追記

  1. DICEの動作
  2. iptablesに次のチェーンを追加する。

    上記の設定は、OUTPUT(INPUT)チェーンで、送信先(受信元)の IPアドレスがローカルのもの以外を/var/log/messegeファイルにログを記録する。 LOGのオプションの--log-levelによってログを取るレベル(ここではinfo)を、 --log-prefixによってLOGに残す文字列を指定している。

    チェーンを追加後、DiCEでZiVEの更新を行うイベントを実行する。 イベント後、
    # cat /var/log/messeges |grep iptables.log
    を実行して、どこに接続しているかを見ると、次の順で接続していた。

    1. 自分のDNSサーバ
    2. IPアドレス検出スクリプトのあるサーバ(beta.dyndns.org又はhi-ho.ne.jp)
    3. ZiVE

    後は上記iptablesに追加するだけである。

    ちなみに、上述のDiCEの動作は、次の通りと思われる。

    1. LANカードのIPアドレスをDNSサーバに問い合わせ
    2. これはLANカードにグローバルIPアドレスが 割り振られている時に有効

    3. 1で検出できない場合、外部スクリプトによりIPアドレスを検出
    4. ブロードバンドルータを使ってLAN内にサーバが有る 場合に使用される。

    5. 上記で検出したIPアドレスをZiVEに通知して更新

    ちなみに、2のスクリプトのURLは、DiCEをインストールした ディレクトリにあるipcheck.datファイルに記述されている。

  3. iptabelsのチェーンの追加
  4. 上記のログに記述されたIPアドレスを追加した。

    接続要求は必ず自分のサーバからtcpのport 80(= www)で行われる。 そのため、INPUTに接続を保持するチェーン(2つ目のチェーン)がある場合は、 改めてチェーン(1つ目)を追加する必要はない。