Archive for 3月 2010

内部LAN専用DNSの構築

LANとは、Local Area Netoworkの略なので、「内部LAN」の「内部」が冗長ではあるが、
「HTTPプロトコル」みたいで(HTTPはHyper Text Transfer Protocolの略)分かりやすいのでそう書く。

微妙で回避可能(hostsファイルにホスト名を追記するなど)な問題だったのでほっておいたけど、なぜそうなるのか理由が
理解できていなかったので調査内容をメモ。

LANを構築し、外部ネットワークに接続出来るように設定する。
そのLAN内に、外部に公開したい(例えば)Webサーバーの設定をしてポートを開けたりなんなりして公開したとする。
これで特に問題なく公開は出来るのだが、
そのWebサーバーが所属するネットワークから名前で(つまり、内部から内部宛で)そのWebサーバーを参照することが出来ない。
参照することが出来ない、と言うか、現在の環境だとルーターの設定画面につながってしまう。
無線LAN環境(Bufferlo WHR-G)にしている位な話で特に変わったことはないと思う。

なんとなくダメなんだろなくらいにしか考えていなくて結局真相を理解できないままでずっといたのだが、
◇自宅内DNSサーバーの構築◇初心者のためのLinuxサーバー構築講座☆お便利.com☆

「LAN内の サーバー には、同じLAN内の他の クライアント機 から FQDN でのアクセスができない。」

と言う記述の中の

同じサブネット内の ホスト機 同士では、NATもIPマスカレードも無関係ですから、

というのが目からウロコだった。
というわけで、内部LAN用DNSを立ち上げることにする。
BINDはインストールされているものとします。
環境は

# named -v
BIND 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2

設定内容は、ネームサーバーホスト名はns.example.comで、ドメインはexample.comとして記載しています。
関係ないけど「example.com」って説明用に予約されているんですねぇ。http://example.com/

設定ファイル(named.conf)

まずは、named.confを

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//
// named.caching-nameserver.conf
//
// Provided by Red Hat caching-nameserver package to configure the
// ISC BIND named(8) DNS server as a caching only nameserver
// (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// DO NOT EDIT THIS FILE - use system-config-bind or an editor
// to create named.conf - edits to this file will be lost on
// caching-nameserver package upgrade.
//
options {
        //listen-on port 53 { 127.0.0.1; };
        //listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
 
        // Those options should be used carefully because they disable port
        // randomization
        query-source    port 53;
        // query-source-v6 port 53;
 
        allow-query     { localnets; };
        allow-query-cache { localnets; };
        allow-transfer  {localnets;};
 
        forwarders{
                192.168.1.1;
        };
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
 
 
view localhost_resolver {
        match-clients      { localhost; };
        match-destinations { localhost; };
        recursion yes;
        include "/etc/named.example.com.zone";
};
 
view internal {
        match-clients           {localnets;};
        match-destinations      {localnets;};
        recursion       yes;
 
        include "/etc/named.rfc1912.zones";
        include "/etc/named.example.com.zone";
};

ざっと説明すると、
・optionsでは、IPV6対応を無効(listen-on-v6, query-source-v6 )
・問い合わせ元、転送先を制限(allow-query, allow-query-cache, allow-transfer)をlocalnetsに制限。
「localnets」はちなみに予約語で、RedHatの/etc/named.confによると

localnets — ローカルシステムが接続しているネットワークのIPアドレスと一致。

です。
・forwardersには、現在のネットワークのルーターのアドレスを指定します。
・「localhost_resolver」と「internal」には「/etc/named.example.zone」でゾーンファイルを指定します。ルートゾーンの定義等は「/etc/named.rfc1912.zones」に定義されているので必要であればそれもインクルードします。

外出し設定ファイル

1
2
3
4
5
6
7
8
zone "example.com" {
        type master;
        file "example.com.db";
};
zone "1.168.192.in-addr.arpa" {
        type master;
        file "1.168.192.in-addr.arpa.db";
};

正引き、逆引きのファイルを指定します。

正引きゾーンファイル

1
2
3
4
5
6
7
8
9
10
11
12
13
$TTL    86400
@       IN      SOA     ns.example.com.  root.example.com.(
                                      2004031903 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN      NS    ns.example.com.
        IN      MX 10 ns.example.com.
 
router  IN      A       192.168.1.1
svn     IN      A       192.168.1.2
example.com     IN     A     192.168.1.3

とりあえず、ルーターが1, サブバージョンで使うマシンが2, それ以外で「example.com」が自分を指すようにしました。

逆引きゾーンファイル

1
2
3
4
5
6
7
8
9
10
11
$TTL    86400
@       IN      SOA     ns.example.com.  root.example.com.(
                                      2004031903 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN      NS    ns.example.com.
        IN      PTR   example.com.
1       IN      PTR     router.example.com.
2       IN      PTR     svn.example.com.

なんだか(ホスト・ドメイン名を置き換えてるため)設定そのまま貼り付けたわけじゃないのでこれで実際に動くのか微妙かもしれません。
これでservice named startで起動しておきます。

そして、今までネームサーバーとなっていたルーターのDNSサーバーの設定(多分どっかにあるはず)を、今設定したネームサーバーのIPアドレス(192.168.1.3)に設定すればOKです。

これでしばらく運用していたのですが、どうしても内部ネットワークに置いてある公開用自ドメインのWeb画面にアクセスするとルーターの設定画面に飛んでしまう現象があった。(ネットワーク接続直後は必ずだが、なぜか10分くらいして再度試すとうまく自ドメインのサイトに接続出来る)

DNSサーバー側のキャッシュをクリアしたり、クライアント側のキャッシュをクリアしたりしていたのですがどうにも解消されませんでしたが、ある時以下ページを見っけました。

sasapurinのブログ: Windows XPにおけるLAN内DNS使用時の不具合

具体的に言えば、「DNS Client」と言う表示名の「Dnscache」サービスが災いしている。このサービスの説明はこの様に記述されている。

「このコンピュータのドメイン ネーム システム (DNS) 名を解決およびキャッシュします。このサービスが停止した場合、このコンピュータは DNS 名を解決できず、Active Directory ドメイン コントローラーを見つけることができなくなります。このサービスが使用不可にされた場合、このサービスに明示的に依存するサービスはすべて起動できなくなります。」

しかし弊害と言えば、ActiveDirectory環境下におけるドメインサーバを見失うということだけらしい。とりあえずサービスを再起動してみたところ名前解決の失敗が一時的に(数日間)解消される事を確認した。どうせAD環境ではないんだからと思い切ってサービスを停止して様子を見ることにした。見事に名前解決に失敗することは無くなった。全端末サービスを停止して回った・・なんてうざったいサービスなんだろう。

ほんとにうざったいサービスだ(笑)。ActiveDirectoryがダメになるだけだしサービスからこれを停止して手動に切り替えしてみた。
そうすると同様の現象は出なくなった。

ただ、DNSClientを止めると、Windows系の開発で良くやる(かな?)Windows\system32\drivers\etc\hostsファイルの指定も効かないっぽいが、その時だけDNSClientが立ち上がっていれば良い。


CosminexusとIISの連携

Cosminexusには、インプロセスHTTPサーバーというのがついていて、もちろんこれを使ってWebサーバーとして動作させることが出来るのですが、
Webサーバーの機能は使いたい場合けどWebアプリケーションはCosminexusで、という場合も多いと思います。
これは、Apache+Tomcatならmod_proxy_ajp等を使ってやります(Hitachi Web Serverを使った場合も同様かも?)
今回は、Internet Information Serverと連携させる方法をメモします。
SSL接続の場合です。

環境は
Window Vista SP2 Home
IIS 7.0(ヘルプの目次に「IIS 7.0 の詳細情報」とあったので多分。バージョンの確認方法がよくわからん)
uCosminexus Developer Professional 評価版 08-50-T1

Cosminexus側の設定

Cosminexusの設定は、マニュアル(http://www.hitachi.co.jp/Prod/comp/soft1/manual/pc/d3M1160/EM110072.HTM)を参考にしています。

・Microsoft IIS用リダイレクタ動作定義ファイル
以下ファイルを編集します。

\CC\web\redirector\isapi_redirect.conf

ほとんどデフォルトでいいと思いますが、SSLで動作させるので、以下の設定値をtrueにします。

gateway_https_scheme=true

・ワーカ定義ファイル
ほとんどデフォルト設定でいいと思いますが、ワーカ名を確認するため以下ファイルを参照します。

\CC\web\redirector\workers.properties

worker.list=worker1
worker.worker1.port=8007
worker.worker1.host=localhost
worker.worker1.type=ajp13

ワーカー名は「worker1」で、ポートは「8007」というのを覚えておきます。

・Microsoft IIS用マッピング定義ファイル
どのURIにアクセスがあった場合、どのワーカーを使うかを定義します。
以下ファイルです。

\CC\web\redirector\uriworkermap.properties

/examples/*=worker1

デフォルトは上記の値ですが、例えばコンテキストルートが/TESTのJSPアクセスだけCosminexusに転送したい場合は

/TEST/*.jsp=worker1

とかにすれば良いです。ワーカー名は前述のワーカ定義ファイルで定義したワーカ名を指定します。

IIS側の設定

これもマニュアルがあったんだ。それを参照します。
http://www.hitachi.co.jp/Prod/comp/soft1/manual/pc/d3M0600/EM060300.HTM

しかしこう見ると、「リダイレクタ」だの「リソース」だの「アクセラレータ」だの用語にカタカナ語が多くてさっぱり意味不明ですよね。
とはいえ和訳したらもっと気持ち悪い感じになりそうだけど。

・仮想ディレクトリの作成
[サイト]-「Default Web Site]-[仮想ディレクトリの追加]で以下設定で追加。
エイリアス:hitachi_ccfj
物理パス:\CC\web\redirector

その後、「ハンドラマッピング」-「機能のアクセス許可の編集」を選択して「読み取り」「スクリプト」「実行」の3つ(3つしかないが)にチェックを付けます。この設定はすごいわかりにくい。
あと、ここ多分重要ですが、上記の「エイリアス」は仮想ディレクトリではありますが、エイリアス名は多分なんでもいいんじゃないかな?
どのURIの場合どこに飛ばす、というのは「Microsoft IIS用マッピング定義ファイル」でやっているし、実際動いた。

・Webサーバの認証機能の解除
この設定は「認証」が「匿名認証」のみになってたので良いのかな?

・ISAPIフィルタの設定
[Default Web Site]-[ISAPIフィルタ]で右ペインを右クリックして「追加」を押して追加します。(わかりにくい!)
フィルタ名:hitachi_ccfj
実行可能ファイル:\CC\web\redirector\isapi_redirect.dll

・SSLの設定
とりあえず証明書はテスト用で動作だけできれば良い感じですのでそのように。
[ホーム]-[サーバー証明書]-[自己署名入り証明書の作成]で[TEST]と入れて作成。

・バインド
[Default Web Site]-(操作ペインの)[バインド]で、以下追加
種類:https
IPアドレス:未使用の IP アドレスすべて
ポート:443
SSL証明書:TEST

これで動くようになったと思う。
なぜIISで動かしたかと言うと、ASP(Active Server Pages。ASP.netではない)とJSPが混在しているアプリケーションだったからです。
最新IISでも、インストール時に「Classic ASP」みたいなのを選択すればそのまま動くのを発見してやってみた次第です。
やっぱApacheのがいいわ。


Installation of Geeklog

教えてもらって初めて知ったのですが、GeeklogというCMSがあるそうな。
「Geek」とは
http://ja.wikipedia.org/wiki/%E3%82%AE%E3%83%BC%E3%82%AF
自分の認識では、コンピュータ技術が大好きなオタクって感じでしょうか。

現在ぱっと見だと、WordPressよりももしや親切な感じなのでは?と思っちゃいますが使ってみないとね。
日本語公式サイトは以下

http://www.geeklog.jp/

早速入れてみます。
環境。

[]# cat /etc/redhat-release
CentOS release 5.3 (Final)
[]# httpd -v
Server version: Apache/2.2.3
Server built:   Jan 21 2009 22:01:41
[]# php -v
PHP 5.2.11 (cli) (built: Sep 21 2009 14:49:09)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies

ダウンロード

#wget http://www.geeklog.jp/filemgmt/visit.php?lid=443

MySQLの文字セット・参照順序確認
文字セットはutf8で、参照順序はutf8_general_ciが良いらしい。

mysql> show character set like 'utf8';
+---------+---------------+-------------------+--------+
| Charset | Description   | Default collation | Maxlen |
+---------+---------------+-------------------+--------+
| utf8    | UTF-8 Unicode | utf8_general_ci   |      3 |
+---------+---------------+-------------------+--------+
1 row in set (0.00 sec)

特に問題ないので、これでインストールします。
先ほどダウンロードしたアーカイブを解凍し、Web公開する予定のフォルダにシンボリックリンクを張ります。

#tar zxvf geeklog-1.6.1-jp-extended-1.0.tar.gz
#ln -s geeklog-1.6.1-jp-extended-1.0/public_html/ geeklog

これで、http://server/geeklog/admin/installにアクセスすると、設定画面が表示されます。
geeklog-setting

画面は言語設定を日本語に変えた後ですが、デフォルトは英語でした。
パーミッション変更設定のコマンドも表示されているので便利ですね。確かosCommerceもこんな感じで便利だったような・・・。
表示されたコマンドをコピーしてそのまま実行しておきます。

chmod -R 777 /www/labs/geeklog-1.6.1-jp-extended-1.0/db-config.php /www/labs/geeklog-1.6.1-jp-extended-1.0/backups/ /www/labs/geeklog-1.6.1-jp-extended-1.0/data/ /www/labs/geeklog-1.6.1-jp-extended-1.0/logs/error.log /www/labs/geeklog-1.6.1-jp-extended-1.0/public_html/siteconfig.php /www/labs/geeklog-1.6.1-jp-extended-1.0/public_html/backend/geeklog.rss /www/labs/geeklog-1.6.1-jp-extended-1.0/public_html/images/articles/ /www/labs/geeklog-1.6.1-jp-extended-1.0/public_html/images/topics/ /www/labs/geeklog-1.6.1-jp-extended-1.0/public_html/images/userphotos

これで再度設定画面を表示させると、警告部分が出なくなったので「新規インストール」を押下してみますが、
なぜか英語版画面に切り替わってしまうだけなので、切り替わった画面から「New Install」を押下します。

ここでまたもや気付く。
やはりデータベースやユーザーは作成が必要ですよね。(前回も同じことを言ってるが・・・)
まあそこまで自動化するには実際create databaseやgrantを実行するユーザーの設定をどこかで書かなければいけないのでそれは当り前か・・・。

ということでgeeklogで使用するデータベースとユーザーを作成します。
(パスワードは仮にgeeklogとします。)

mysql> create database geeklog;
Query OK, 1 row affected (0.00 sec)
 
mysql> grant all on geeklog.* to geeklog@localhost identified by 'geeklog';
Query OK, 0 rows affected (0.07 sec)

これで先ほどの設定画面に戻って「Install」ボタン押下で、「Installation of Geeklog 1.6.1 complete!」と出ればインストール完了です。
下の方に、

Security Warning

Don’t forget to do 3 things:

Remove or rename the install directory, /www/labs/geeklog-1.6.1-jp-extended-1.0/public_html/admin/install.
Change the Admin account password.
Set permissions on /www/labs/geeklog-1.6.1-jp-extended-1.0/db-config.php and /www/labs/geeklog-1.6.1-jp-extended-1.0/public_html/siteconfig.php back to 644.

と出ています。親切だ!
ということで、/admin/installは権限なしに、geeklog-1.6.1-jp-extended-1.0/db-config.phpとsiteconfig.phpは権限644に変更しておきます。

# chmod 000 geeklog/admin/install
# chmod 644 geeklog-1.6.1-jp-extended-1.0/db-config.php
# chmod 644 geeklog-1.6.1-jp-extended-1.0/public_html/siteconfig.php

これで無事稼働させることが出来ましたが、新しくユーザーを登録する部分でうまく追加されない現象。
原因までは調査出来てはないけど、.htaccessを置いて以下記載をすることで動きました。

php_value mbstring.http_output "pass"
php_flag mbstring.encoding_translation Off

Xserverでのインストールについて
http://www.geeklog.jp/article.php/20060603071712656

XServerじゃないんだけど、確かにmbstringの設定が一部違っていました。
これでサンプル用ユーザーを作ったので以下で触ってみてください。

http://labs.4sure.jp/geeklog/

ID:sampleadmin
pass:sampleadmin

これも収拾付かない事態になりそうならば一旦制限を掛けますのでよろしくお願いいたします。