★ 便利な構内サーバー

 このページでは、家庭内LANに転がしておくと便利なサーバーを紹介しています。多くはWindowsでもLinuxでもFreeBSDでも存在しますが、ここでは主にFreeBSDによる実例を挙げています。Macについては所有していませんので、申し訳ありませんが自由研究とさせてください。

 DHCPサーバー  (02 Jun 2003)
 Samba 〜Unixで実現するマイクロソフトネットワーク共有サービス〜  (06 Nov 2002)
 プリンタの共有 (11 Nov 2002)
 セキュリティ (18 Feb 2003)
 その他の話題 (01 Mar 2003)
 プリントサーバーを使おう  (14 Jun 2003)
 プリントサーバーとDHCP (20 Sep 2003)
 NTP Network Time Protocol 〜時計の自動調整〜  (14 Feb 2004)
 ホスト名とIPアドレス  (23 Mar 2004)
 hostsファイル (23 Mar 2004)
 DNS (06 Jun 2004)

DHCPサーバー ↑戻 ★

 DHCPはDynamic Host Configuration Protocolの略で、ホストの設定を自動で行うための規格です。LAN内にDHCPサーバーを1台置いておくと、DHCPに対応した機械をネットワークにつないで立ち上げると、自動的にネットワークの設定が終わってしまうというスグレモノです。クライアントマシンの設定が劇的に簡単になります。

 サーバープログラムはUnix系ですとISCDHCPサーバーが有名です。ISCからソースを落としてきてコンパイルしても構いませんが、とてもメジャーなソフトウェアなので、たいていのサーバーOS・ディストリビューションでは、デフォルトでインストールされているか、あるいはパッケージとして後から簡単にインストールできるでしょう。Linux系の場合はいくつか注意しなければならない点があるため、ディストリビューションについてきたものを使うのが無難です。ソースからインストールする場合はPPxPでも述べたように、configureを実行してmake、スーパーユーザーになってmake install、です。

 クライアントの方はさらにメジャーで、Unix・Windows(95以降)など、多くのOSで普通は付いてきます。Macもある程度以降からは標準で付いているはずです。Windowsなどでは表立っては出てきませんが、OSのネットワーク設定の中に組み込まれています。「IPアドレスの自動設定」という機能はDHCPの事だと思ってまず間違いありません。

 DHCPを使うと決めたら、まずLAN内にDHCPサーバーを1台置きましょう。なるべく長い時間動いている機械を1台選んで、それをDHCPサーバーに仕立て上げます。今回はルーターマシンを使うのが手っ取り早いでしょう。決めたらDHCPサーバーをインストールします。Linuxはパッケージから入れたほうが無難でしょう。FreeBSDもパッケージがあります。FreeBSDはカーネルのBPFという機能を有効にする必要がありますので、場合によってはカーネルをリビルドする必要があります(と書かれてよく分からない人は、インストールしたままのカーネルは通常BPFが有効になっているので、そのまま放っておけば大丈夫)。

 次に、DHCPサーバーの設定ファイルを書きます。インストールするとなにやら複雑な例が付いて来るので、この通りに書かにゃあかんのか・・・と勘違いする人が多いようですが、以下のような感じでOKです。

subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.64 192.168.1.126;
    max-lease-time 864000;
    default-lease-time 432000;
    option subnet-mask 255.255.255.0;
    option routers 192.168.1.1;
    option domain-name-servers プロバイダのDNS鯖;
    option broadcast-address 192.168.1.255;
}

ISC dhcpd version 3を使う人は、さらに先頭に、

ddns-update-style none;

と書いておきます。これを通常は/etc/dhcpd.confとしてセーブします。場合によっては/usr/local/etc/dhcpd.confかもしれません(インストールの仕方によって違います)。あとはdhcpd.leasesという空のファイルを作っておきます。場所はこれまたシステムによって違ってきますが、うちの場合だと/var/db/dhcpd.leasesとなっています。

 dhcpd.confファイルの内容は・・・見れば分かりますね。この例だと192.168.1.0/24ネットワーク内のDHCPクライアントに、192.168.1.64〜192.168.1.126のアドレスを割り付け、ネットマスクとして255.255.255.0を、デフォルトゲートウェイ(routers)として192.168.1.1を、DNSとしてプロバイダのDNSを、ブロードキャストアドレスとして192.168.1.255を設定するようにクライアントに伝えます。max-lease-timeとdefault-lease-timeは家庭内LANならこのまま使っていれば問題ないでしょう。単位は秒なので、デフォルトで5日間、要求があれば最大10日間、IPアドレスを "貸し出し" ます。実際にはリース期間終了前にクライアントから更新の要求が来るのであまり意識する必要はありませんが、短くしすぎるとdhcpd.leasesが異様に太るのでほどほどに。

 用意ができたらdhcpdを立ち上げます。エラーが出ていないようでしたら、LAN内のクライアントをDHCPを使うように設定して立ち上げなおしてみてください。IPアドレスやDNSが自動的に設定されるはずです。例えばWin98SEの場合:


「コントロールパネル」から「ネットワーク」をダブルクリック


こんなのが出るので「TCP/IP->カード名」をダブルクリック


「IPアドレス」タブを選んで「IPアドレスを自動的に取得」にする


DNSは「使わない」にしておけば自動設定される
OKを押すとリブートを要求されるのでリブート


リブートが終わったらwinipcfgで確認するとよい
(「スタート」-「ファイル名を指定して実行」でwinipcfgと入力)


詳細ボタンを押すとDNSやDHCPサーバーも確認できる

追記: Win2KやXPで設定を確認する場合は、コマンドプロンプトを開いて ipconfig /all とするのが手っ取り早いです。(02 Jun 2003)

 注意点。ファイアウォールでLAN内パケットの制限をしている人は、穴を開けないとちゃんと動きません。DHCPクライアントはIPアドレスを決めるためにDHCPを使います。逆に言うと、DHCPを使う時点ではまだIPアドレスが決まっていません。そのため、最初に投げるデータの始点アドレスは0.0.0.0になっています。例えば、LAN側ネットワークが192.168.1.0/24の時に、それ以外のアドレスを落としている場合、DHCPの最初のデータが通りません。始点アドレスが0.0.0.0で、終点ポートが67のパケットは通すように設定してください。その反対向きの(ブロードキャストになります)始点ポートが67のパケットも通すようにします。FreeBSDのipfwのkeep-stateとかは使っても無意味です(IPアドレスが決まってないから)。

追記: UNIX USERの2002年6月号にDHCPの設定方法が載っています。それによると、NICが2つ以上ある場合、NICごとに必ず1つはsubnetステートメントが必要のようです。DHCPを運用しないNICに対するsubnet文の中身は空でOK。

Samba 〜Unixで実現するマイクロソフトネットワーク共有サービス〜 ↑戻 ★

 SambaはUnix上でマイクロソフトネットワーク共有サービスを実現させるためのパッケージです。Sambaを導入するとUnixマシンをWindowsクライアントのファイルサーバーに仕立てることができます。逆に、Windowsファイルサーバーのクライアントとなることもできます。Sambaは大きくsmbd・nmbdから成ります。前者がファイルアクセスの中核部分で、後者はMSネットワークの名前の管理を担当する部分になります。

 このソフトウェアも非常にメジャーなものですから、デフォルトでインストールされることが多いでしょう。インストールされていなくても通常はパッケージで提供されているはずです。ソースからインストールする場合は上記Webサイトからソースを持ってくるとよいでしょう。日本語版も存在します。現時点での最新版は2.2.6、日本語版は2.2.4-ja-1.0です。ここでは2.2.6をソースからインストールして使ってみます。

 早速ですが、Samba 2.2.6にセキュリティーホールが見つかって、いきなり2.2.7がリリースされました(2002年11月20日)。

 日本語版とそうでないものの違いは、ユーザー名やホスト名に日本語を使えるかどうか? で、Samba 2.2.x の特徴日本Sambaユーザ会)に分かりやすい表が載っています。ファイル名に関しては、日本語版でなくとも日本語を使えるようになっています。Windowsマシンから書き込んだファイルを、Windowsマシンから参照するだけならば特に問題はありません。しかし、Windowsマシンから名前が日本語のファイルを書き込み、それをUnix側から参照する場合は多少問題があります。

 ソースを持ってきて展開したら、普通にインストールしてください。インストールしたらsmb.confを書かないといけません。これがちょっと面倒。swatというWebを使ってSambaを設定できるツールも添付されてきますが、これはこれでswatを動かすための設定が必要です。ここではsmb.confを直接エディタで編集してみます。ソースからデフォルトの状態でインストールすると/usr/local/samba/lib/smb.confになりますが、パッケージの場合は/etcだったり/usr/local/etcだったりするのでマニュアル類を参照してください。

 サンプルとして付いてくるsmb.conf.defaultはなにやらパラメータがいっぱいありますが、2.2.6の添付文書の docs/htmldocs/UNIX_INSTALL.html を見ると、実質5行の超シンプルな例が載っています。前者を元にして不要なパラメータを削除していくか、後者を元にして必要なパラメータを追加していくかするとよいでしょう。

 とりあえず超シンプルな例で試してみると、Win98以降、NT4SP3以降ではちゃんとアクセスできないことが分かります。これは、パスワードが暗号化されて送信されているためで、ちょっとした設定が必要になります。ちゃんとアクセスできた人も、homesというフォルダがあって何か間抜けなので、これも直しましょう。あと、一応日本語に関するパラメータも設定しておきます。すると、以下のようになります。太字の部分が超シンプルな例から追加・変更した部分です。

[global]
    workgroup = KATEI-NAIRAN
    encrypt passwords = yes
    client code page = 932

[homes]
    guest ok = no
    read only = no
    browseable = no

 workgroupはWindowsで使っているワークグループを設定します。Win98SEあたりだと、コントロールパネル→ネットワーク→識別情報あたりにあります。

 encrypt passwordをyesに設定した場合、smbpasswdファイルを作る必要があります。ソースからデフォルト設定のままインストールすると/usr/local/samba/privateに出来上がるファイルで、/usr/local/samba/bin/smbpasswdという設定プログラムで生成します。これまたパッケージなどからインストールした場合はパスが/usr/binだったり/usr/local/binだったりするので、マニュアル類を参照してください(以下同様)。スーパーユーザーになって、以下のように実行します。

# /usr/local/samba/bin/smbpasswd -a 追加したいユーザー
New SMB password: パスワードを打ちます
Retype new SMB password: 確認のためもう一度
unable to open passdb database.
Added user ユーザー名.

 ユーザー名はUnix上に実在しなくてはなりません。Windowsクライアントで使っているユーザー名と同じにしておいた方が楽です。Windowsクライアントのユーザー名に日本語とかスペースが入ってたりとかする人は、この際ですから半角英数字だけのユーザー名に直しておくとよいでしょう。

 Sambaでアクセスしたいユーザーを新たに追加したいときも上の例のように-aを付けてsmbpasswdを実行します。「unable to open passdb database」というメッセージは、二度目以降は出ません。パスワードを変えたい場合は、変えたいユーザーでUnixログインし、smbpasswdを引数なしで実行します。スーパーユーザーになってsmbpasswd ユーザー名と実行してもOK。

 設定が終わったら、smbdとnmbdを立ち上げます。inetdから立ち上げる方法もありますが、ここではお手軽にデーモンとして立ち上げてみましょう。

# /usr/local/samba/bin/smbd -D
# /usr/local/samba/bin/nmbd -D

 これでWindowsマシンから自分のホームディレクトリにアクセスできるようになっているはずです。うまくいったらブート時にデーモンが実行されるよう、rcスクリプトを変更しておきましょう。

 Microsoftネットワーククライアントのクセとして、「時間が経たないとPCが認識されない」という傾向があるので、一発で見つからなかった場合はコーヒーでも飲んでからもう一度確認してください。あるいは、エクスプローラーのアドレスに \\ホスト名 と指定すると見えることもあります。それでもだめだったらsmb.confを確認しましょう。

プリンタの共有 ↑

 この調子でプリンタも共有できます。まずはUnix上でプリンタが正しく動いていなければ話にならないので、その確認から行います。プリンタシステムにもいろいろありますが、ここではBSD系の方式で説明します。Linuxもプリンタに関してはBSD系と互換性のある場合が多いはずですが、通常は設定ツールが付いてくると思いますので、ディストリビューションのマニュアルを参照して下さい。

 とりあえず、プリンタを適当なポートへつないでください。つないだら、そのポートが生きていることを確認します。例えば、FreeBSDでAT互換機のパラレルポートにつないだのなら、通常のI/O・割り込み設定ならば/dev/lpt0が対応しますので、このデバイスノードがあることと、ルートになって echo test. > /dev/lpt0 とやってみて、「test.」と印字されることを確認しておいてください(ポストスクリプトプリンタの場合はもっとややこしいです)。システムが変わるとデバイス名が全然違うのが普通なので、各システムのマニュアルを参照してください。

 次に/etc/printcapを見ます。コメントアウトされていないプリンタがあることを確認して下さい。全部の行がコメントアウトされている場合は、適切そーな(ぉぃぉぃ)プリンタのコメントを外して下さい。で、プリンタ名を覚えておきましょう。普通はlpです。一つだけおまじないがあって、:mx#0:というパラメータを書き加えておきます。FreeBSDにはこんなのが付いてきました。コメントアウトされているのでコメントを外します。

lp|local line printer:\
        :sh:\
        :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs:mx#0:

これはかなり単純な例です。通常この程度で動くはずです。最初のlpがプリンタ名、最後の行に出てくるlp=/dev/lpt0 というのが先ほど確認したプリンタが接続されているポートです。

 次に、printcapのsdパラメータで指定されているディレクトリがあるかどうか確認します。この例ですと/var/spool/output/lpdです。ない場合は作って適切にパーミッションを設定します。FreeBSDの場合、通常はオーナー・グループをdaemonにして、パーミッションは770にします。

 これができたら、lpdが立ち上がっているか確認します。立ち上がっていなければ立ち上げて下さい。FreeBSDの場合は/stand/sysinstallを使うか、直接/etc/rc.confを編集して、ブート時に自動的に起動するようにしておくとよいでしょう。で、プリンタをつないで電源を入れ、用紙をセットし、echo test. | lpr としてみます(注: リダイレクトではなくパイプです。また、プリンタ名がlp以外の場合は、lprの-Pオプションでプリンタ名を指定する必要があります)。これでプリンタから「test.」と印字されればOKです(しつこいようだけどPSプリンタの場合はもっと面倒)。だめな場合は各システムのマニュアルを参照してなんとか解決して下さい。

 ここまで来たらSamba側の設定を行います。[printers]セクションを追加して、printable = yes とし、pathにスプールディレクトリを指定し、スプールディレクトリを作ります。Sambaのスプールはオーナーはroot、パーミッションは777(誰でも書き込み可能)にし、stickyビットを立てます(chmod +t)。あとはsmbd / nmbdを再起動するだけです。他はデフォルトの設定のままでほぼ動いてしまうはずです。

[global]
    workgroup = KATEI-NAIRAN
    encrypt passwords = yes
    client code page = 932

[homes]
    guest ok = no
    read only = no
    browseable = no

[printers]
    printable = yes
    path = /var/spool/samba

 試しにWindows側からUnixホストをエクスプローラーなどで見ていましょう。lpという名前のプリンタがあるはずです。普通にネットワークプリンタとして設定して、何か印刷してみましょう。巨大なグラフィックなども試しに印刷してみて下さい。おまじないmx#0を忘れていると、途中で印刷が止まることがありますので。

 動かなかった場合、Samba側の設定としては、/usr/local/samba/bin/testparm を使ってパラメータを点検してみてください。printingパラメータが自分のシステムと合っているか、printcapファイルはprintcap nameパラメータが示す場所にあるか、print commandは自分のシステムのlprコマンドの書式と合っているか、を確認し、違っていたら smb.conf に書き加えます。

 印刷データ(ファイル)の流れも手がかりになります。Windowsで印刷が行われたデータは、まずSambaのスプールディレクトリに現れます。スプールが終わるとlprが起動され、今度はlpdのスプールディレクトリに現れます。大き目のデータならばlsコマンドで確認できるはずですので、どこまでデータが行ったか、ある程度追跡することができます。

セキュリティ ↑

 マイクロソフトネットワーク共有サービス(プロトコル的にはNetBIOS)は非常にアタックの対象になりやすいプロトコルなので、セキュリティには気を使った方が身のためです。

 まず、ファイアウォール(ルーター)でインターネットに対してポート137/138/139をブロックします。これを忘れると、場合によってはファイルやプリンタが世界中に公開されてしまいます。NetBIOS(over TCP/IP)を標的とした攻撃を避けるためにもこの設定は重要です。基本的にNetBIOSはUDPを使いますが、TCPもブロックしておいたほうがいいでしょう。ついでに、この設定を行うと、ISDNルーターなどで「定期的に接続しようとする」という現象が直ることがあります。

※ 逆に、LAN向きにはこれらのポートを開けておかないとSambaがまったく使えなくなるので念のため。

 Samba側の設定もしておきます。設定するパラメータはinterfaces / bind interfaces only / hosts allow / hosts denyなどがあります。smb.confで設定します。ファイアウォールで落としてあれば基本的には必要ないのですが、何かの間違いでファイアウォールが筒抜けになってた場合のことを考えると、設定しておいた方が安心でしょう。

 interfacesはSambaが使うインターフェースを設定するパラメータですが、現在出回っている文書類では、「デフォルトではプライマリネットワークインターフェースのみが使われる」と書いてあるものが多いです。しかし、Samba 2.2.6のsmb.confの説明を見ると、「By default Samba will query the kernel for the list of all active interfaces and use any interfaces except 127.0.0.1 that are broadcast capable.」(デフォルトでは、Sambaはカーネルにすべての利用可能なインターフェースを問い合わせ、127.0.0.1以外のブロードキャスト可能なインターフェースはどれでも利用する」となっていますので、グローバル側のインターフェースも利用される可能性があります

(18 Feb 2003 追記) ということで、interfacesを指定せずに使っていると、予期せぬインターフェースにブロードキャストをしてしまうことがあります。ファイアウォールがあれば防げますが、それはそれでlog.nmbdにPermission deniedというログがいっぱい残ります。interfacesを指定しておけばこの現象は防げます。インターフェースはIP/maskペアや、ネットワークIF名で指定できます。

 bind interfaces onlyは、主にnmbdのブロードキャスト受信の制御のためにあります。interfacesを設定しても、bind interfaces onlyを設定しないと、nmbdは全部のインターフェースのブロードキャストを受けてしまいます。ということで、yesにしておくとよいのですが、そうすると、interfacesにループバックインターフェースを書いておかないと、smbpasswdやswatが動かなくなるので、interfacesに127.0.0.1を書いておかなければなりません。

 これらのパラメータは、主にグローバルなインターフェースを持っているホストの場合に、つまり、ルーターとして使っているマシンにSambaをインストールした場合に使うとよいパラメータですが、PPPサーバーなどになっている場合は「永続的ではないインターフェースをうまく扱えないのでこのパラメータは使ってはいけない」となっています。自信がなければ使わない方がいいかもしれません。

 hosts allowとhosts denyは接続を許可するホストと許可しないホストを書きます。このパラメータはセクションごとに設定できるので、共有リソースごとにアクセスを制限することもできます。通常はこちらでアクセス制限をかけるとよいでしょう。ループバックアドレスはhosts denyに書かない限り、常にアクセスを許可されます。

 お手軽に書くのならこんな感じでしょう。

[global]
    workgroup = KATEI-NAIRAN
    encrypt passwords = yes
    client code page = 932
    interfaces = 192.168.1.2/24
    hosts allow = 192.168.1.

[homes]
    guest ok = no
    read only = no
    browseable = no

[printers]
    printable = yes
    path = /var/spool/samba

 これらのパラメータもソースアドレス偽装などの攻撃には無力です。ファイアウォールの設定も必須です。設定したら再起動を忘れずに。

 もう一つ、Sambaに見られる面白い現象があります。SambaをインストールしたマシンにUnixユーザーアカウントが二つ以上ある場合、自分のものではないアカウント名を使ってエクスプローラーに「\\hostname\someone」(この形式をURNと言います)と打ち込むと、他人のホームディレクトリを見ることができます。このとき、ユーザー名とパスワードを聞かれた場合は自分のユーザー名とパスワードを入力します。「バグじゃないのか??」と思う人も多いようですが、Unixでは他人のホームディレクトリは参照を制限していないのが普通です。制限したい場合はchmodで簡単に設定できます。逆に書き込み可能なディレクトリを作ることも可能です。同じホスト上にいる他人とファイルをやり取りする場合、これが一番簡単な方法です。

 Sambaでホームディレクトリをアクセスする場合、アクセスしている共有名は単にUnix上のディレクトリのホームディレクトリに対応する(=他人のホームディレクトリ)のであって、さっき打ち込んだユーザーの権限(=自分)でそのディレクトリにアクセスしているだけです。smbpasswdでユーザーを作るとき「ユーザー名はUnix上に実在しなければならない」と書きましたが、それはユーザー名がそのままUnix上のアクセス制御に使われるからなのです。

 逆に言うと、Unix的に適切なパーミッションを設定すれば、ディレクトリによって人に見せたり、見せなかったりが簡単にできるということです。グループ単位の設定ももちろんOKです。ホームディレクトリを丸ごと見せたくない場合は、ホームディレクトリのパーミッションを、自分以外読み書き不可にしてしまえばOK。

 とにかくご当人以外はホームディレクトリへのアクセスを不可能にしたい、という場合は、[homes]セクションにvalid usersを設定します。この場合、他人のディレクトリを見ることができなくなりますから、ファイルをやり取りする場合は適当な共有フォルダを別に作る必要があります。

[global]
    workgroup = KATEI-NAIRAN
    encrypt passwords = yes
    client code page = 932
    interfaces = 192.168.1.2/24
    hosts allow = 192.168.1.

[homes]
    guest ok = no
    read only = no
    browseable = no
    valid users = %S

[printers]
    printable = yes
    path = /var/spool/samba

 valid usersに設定するのは%uではなく、%Sです。ログインしたユーザー名が共有名と同じ場合にアクセス可能、です。%uを設定してしまうと、ログインしたユーザーがアクセス可能、という意味になりますから、全然制限になりません。しつこいようですけど、設定したら再起動を忘れずに。

 他人のホームディレクトリも参照可能にした場合、つまり上記の設定をしない場合、実在する人間を示さないユーザー、いわゆる擬似ユーザーについても、/etc/passwdにホームディレクトリが設定されていれば、同じようにURNを打ち込むことでそのディレクトリが見えてしまいます。通常、/etc/passwdはrootも含め、いくつかの擬似ユーザーがシステムによって設定されています(試しに/etc/passwdをのぞいてみると、ずいぶんと知らないユーザーが多いことでしょう)。パーミッションの設定が適切ならば問題はないはずです。

 しかし、うっかりrootさんのホームディレクトリ(/rootになっていることが多いです)が誰でも読めるようになっていたりすると、\\hostname\rootと打ち込むことで、rootさんの大切なファイルがみんな流出してしまいます。他にも「/」をホームディレクトリに持つユーザーさんがいると、そのユーザー名をURNに指定することで、「/」 以下、全部のファイルを(パーミッションに従って)読むことができます(もう一度言っておきます、パーミッションが適切なら問題ないのです。/etc/passwdは読めますが、シャドウパスワードファイルはもちろん読めません)。

 これを便利と考えるか、気持ち悪いと考えるかは人それぞれですが、気持ち悪いと考える人は、何か対策を講じたくなるでしょう。正攻法はアクセスを許可するユーザーだけを[global]のvalid usersに書いておく方法ですが、ユーザーが増えていくと修正を忘れたり、行が長くなったりと煩雑になります。比較的小規模なシステムで楽に動く方法として、パスを指定してしまう、という方法があります。

[global]
    workgroup = KATEI-NAIRAN
    encrypt passwords = yes
    client code page = 932
    hosts allow = 192.168.1.

[homes]
    guest ok = no
    read only = no
    browseable = no
    path = /home/%S

    [printers]
    printable = yes
    path = /var/spool/samba

 一般的なユーザーは /home/someone というホームディレクトリを持っているのが普通ですので、普通のユーザー名を共有名にしたURN(\\hostname\someone)を打ち込むと、%Sがユーザー名に置き換わってアクセスできます。しかし、例えばrootさんのように/home以下にホームディレクトリを持っていない場合は、/home/root のようなディレクトリはありませんから、アクセスに失敗します。

 この方法は、ホームディレクトリが複数のパーティションにまたがる(規模の大きいシステムでありがち)ような場合は当然のようにうまく行きません。path = ~%S とか path = %H とか書きたくなりますが、それでは何も書かないのと一緒ですね。シンボリックリンクなどで解決することになるのかな。

その他の話題 ↑

コメント

 エクスプローラーでネットワークホストを見ているときに、表示を「詳細」にするとホスト名の横にコメントが出ますが、これは server string というパラメータで設定します。また、共有名の横にもコメントが出ますが、これは comment というパラメータで設定します。

[global]
    server string = moz dancing samba
    workgroup = KATEI-NAIRAN
    encrypt passwords = yes
    client code page = 932
    hosts allow = 192.168.1.

[homes]
    comment = Home directory
    guest ok = no
    read only = no
    browseable = no
    path = /home/%S

[printers]
    printable = yes
    path = /var/spool/samba

ファイル名の大文字・小文字

 MS-DOS〜Windows 3.1までは、ファイル名はすべて大文字で、. の前が8文字まで、後ろ(いわゆる拡張子)が3文字までと決まっていました(8.3形式)。同じソフトウェアでバージョンが増えてくると、ファイル名を決めるのに苦労したものです。

 これではあまりにも使いにくいと思ったかどうかは知りませんが、Win95になってファイル名の8.3制限はなくなり、小文字も使えるようになりました(vfat形式)。しかし過去との互換性のためか、ファイルの比較時に大文字・小文字は区別されず、8.3形式に収まらないファイル名の場合は別名として8.3形式のファイル名も生成されます。全部大文字のファイル名を作ると、なぜか最初の文字だけ大文字になって残りは小文字にされます。

 スペースを含めることもできますが、コマンドラインで指定する場合は " " でくくらないといけないので面倒です。余談ですが、何を考えたのか、MicrosoftはWin95になってデフォルトのプログラム置き場を "c:\program files"(AT互換機の場合)にしたため、コマンドラインから使いくいこと・・・。「スペースが使えます!」ってアピールしたかったのかもしれませんが、子供がおもちゃを見せびらかしてるんじゃないんだから。あと、「My なんちゃら」のシリーズ。"My Document" とか。他人のファイルをわざわざ自分のディレクトリに保存させることはないだろうから「My」は冗長なだけ。「doc」で十分。しかも日本語版では「マイ ドキュメント」とかカタカナになってて、しかも半角で、もう最悪です。日本語にするなら「文書」とかにした方がいいんじゃないの?

 Unixでは . の前も後ろも、文字数に規定はありません。それどころか、一つのファイル名に . を複数入れることもできます。大文字・小文字は完全に区別されます。Sambaではこのあたりの挙動を多少調整できます。よく使われるパラメータは、case sensitive と preserve case でしょう。どちらも yes にすると、Unix的な挙動になります。case sensitive を no にし、preserve case を yes にすると、Win95的な挙動になります。デフォルトではWin95に近い挙動をするように設定されています。

アーカイブ属性

 Windowsにはファイル属性として「アーカイブ属性」というのがあります。この属性はファイルを生成・変更などしたときにセットされる属性です。なので、通常ほとんどのファイルでセットされているはずです。じゃあ、いつリセットするのかというと、アーカイバやバックアップツールが、バックアップしたファイルのアーカイブ属性をリセットすることを想定しています。こうすることで、次回アーカイブ・バックアップ時に、アーカイブ属性がセットされているファイルだけを操作の対象にすればよいので便利ですね。

 「想定しています」と書きました。FTP Exchange(Webサイトにファイルを一括アップロードするツール)など、一部のツールで利用することができます(私も使っています)が、実際にアーカイブ属性を操作するツールはとても少なく、普通は使われない属性です。WindowsでもUnixでも、ファイル変更時刻で操作対象ファイルを選択するツールが多く、Unixではアーカイブ属性自体がありません。したがって、Unixマシンにファイルをコピーすると、アーカイブ属性は失われてしまいます。

 Sambaでは、Windowsには実行権を示す属性がないことに着目して、ファイルのオーナーの実行属性をアーカイブ属性の代わりに使うことができます。デフォルトでそういう設定になっているため、SambaでUnixマシン上にファイルを作りUnixマシンでファイルを見ると、思いっきり実行権を示す属性が付いてしまいます。Unixに慣れた人が見るとかなり気持ち悪いです。これがイヤな人は、

    map archive = no

としてこの機能を止めておきましょう。

日本語の取り扱い

 先ほどちょっと触れた日本語ファイル名ですが、Windowsマシンから書き込んだファイルをUnixマシンから見ない場合には、特に何もしなくてもうまく動くはずです。Unixマシン側が日本語を扱えなくても平気です。Unixから見る場合、まずUnixマシンで日本語が扱えなければなりません。そして、coding systemパラメータをUnixで使っている文字コード体系と合わせる必要があります。普通はEUCにしますが、そうすると1バイトカタカナを使ったファイル名はUnix側でうまく扱えないでしょう。coding systemをシフトJISなどにすることもできますが、そうするとUnix側でLANG環境変数を設定しないと、全部の日本語ファイル名が化けます。

 化けていても変な風にいじらなければ動作上問題はありません。Windowsマシンから見れば相変わらず正しいファイル名に見えます。化けているファイルをUNIXマシン側から消すときは、ワイルドカードを使って何とかします。Windowsマシン・UNIXマシン両方から参照するファイルについては、日本語は使わないのが賢明です。

 coding systemとしては他にHEXとCAPというのがあります。HEXは文字コードを16進数で書き出します。CAPはUNIX上でMacとのファイル共有も実現する場合に指定します。いずれも人間が読める形にはなりませんが、Windows側でどんなファイル名を使おうが、Unix側のキーボードから確実にファイルを指定できる利点はあります。欠点は長すぎるファイル名を扱えない点でしょうか。

 なお、日本語以外のシステムで文字エンコーディング方法を設定するには、character set パラメータを設定します。また、client code pageはファイル名として有効な文字や大文字・小文字の判別などに使われるパラメータで、こちらは必ず設定しておく必要があります。

 先ほど述べたコメントや、サーバー名・ワークグループ名などは、Samba日本語版を使わないと正しく設定できません。日本語版ではないSambaを使う場合、Windowsクライアントのワークグループ名などに気をつけなければなりません。

プリントサーバーを使おう ↑戻 ★

 プリンタを共有するためには、基本に返ってマイクロソフトネットワーク共有サービスを使う方法や、上述のSambaを使う方法もありますが、追加投資をしていいのなら(Unixマシンへ投資する余裕がないのなら?)、市販のプリントサーバーを導入する手もあります。プリンタの背面コネクタに直接取り付け、そこからイーサネットケーブルをハブまでつなぐものが主流です。値段は5000〜6000円。Mac/Win/Unix共用の場合が多いです。製品としてはMELCOLPV2-T1Planex Communications(PCi)のEthernet Print Server Mini2などが有名。

 設定は概ねWindowsから行えます。PCiのものはUnixからでもarpとtftpを使えば可能です。通常はIPアドレスを設定する程度です。Unixから使う場合はlprで普通にネットワークプリンタとして使えます。Windowsから使う場合はクライアント側(Windowsマシン)にプリンタドライバとは他にもう一つドライバを入れないといけない場合が多いみたいです。ちょっと面倒。

 もしSambaサーバーがあれば、Samba経由で単品プリントサーバーへ流せば、クライアント側のポートドライバは不要になります(通常のプリンタドライバは必要)。面倒な設定はなるべくサーバー側へ、という精神です。

 Sambaサーバーがあるということは、そのマシンにプリンタポートがついていれば、別にプリントサーバーを入れなくても、SambaサーバーをそのままプリントサーバーにしてしまえばOKです(それが普通です)。しかし、Sambaサーバーとプリンタの設置位置が離れている場合とか、プリンタが2台以上ある場合とか、Sambaサーバー機にプリンタポートがない(あるいはふさがっている)場合などに案外便利です。実は、単品のプリントサーバーを導入したのは、Libretto 20を改造したらI/Oアダプタが使えなくなって、プリンタがつながらなくなったから、だったりします。

 Sambaは1サーバーで複数台のプリンタを扱えますから、プリンタ(とプリントサーバー)を何台導入しても、Sambaマシンは一つで済みます。同じホスト内にたくさんのプリンタが見える形になるので、この方が便利かもしれません。欠点は、Windows・Samba・lpd・プリントサーバーと4段スプールされるので、印刷開始までが長くなること、でしょうか。

 設定は案外簡単です。まず、プリントサーバーをUnixから使えるようにします。具体的にはIPアドレスを設定し、printcapでリモートプリンタを指定します。lprでプリントできることを確認したらSambaをリスタートさせます。もし、Sambaの設定がデフォルト設定のままならば、この時点でWindowsマシンからUnixマシン経由で単品プリントサーバーが見えるようになっているはずです。

 実際にFreeBSDマシンからPCiのMini2を設定してみます。まず、IPアドレスを割り当てます。設定にはtftpを使いますが、tftpを使うためにはMini2のIPアドレスが分からないといけません。でもIPアドレスはまだありませんね。鶏が先か卵が先か。では困るので、arpを使い、ハードウェアアドレス(MACアドレス)に一時的にIPアドレスを割り付けます。ハードウェアアドレスはMini2本体に書いてあります。

# arp -s 192.168.1.32 00:12:34:56:78:9A

 一時的にIPアドレスを割り付けたら、tftpで設定ファイルを取り込みます。

$ tftp 192.168.1.32
tftp> ascii
tftp> get config.txt
Received 329 bytes in 0.1 seconds
tftp> quit

設定ファイルはこんな感じ。

01 BoxName      : 1P_PrintServ56789A
02 BoxVersion   : 3.21 (fixed)
03 BoxNodeID    : 00-12-34-56-78-9A (fixed)
04 DHCP/BOOTP   : OFF
05 BoxIPAddress : ほにゃらら
06 Gateway      : ぺけぺけ
07 SubnetMask   : ごにょごにょ
08 NetWare      : Disable
09 PrinterMode  : Normal (Fast, Normal, Slow)
10 Printer1Name : lp1 (fixed)

 「ほにゃらら」「ぺけぺけ」「ごにょごにょ」をネットワーク構成に応じて書き換えます。書き換えたらtftpで送り込み、resetをgetすることで設定を反映させます。

$ tftp 192.168.1.32
tftp> ascii
tftp> put config.txt
Sent 329 bytes in 0.1 seconds
tftp> get reset
tftp> quit

 終わったらarpエントリを削除しておきましょう。

# arp -d 192.168.1.32

 次に/etc/printcapを設定します。おそらくローカルプリンタの設定が書いてあると思いますから、それをコピーして編集するのが楽でしょう。

lp|local line printer:\
        :sh:\
        :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs:\
        :mx#0:
pm700c|PM-700C on the network:\
        :sh:\
        :rm=192.168.1.32:rp=lp1:sd=/var/spool/output/pm700c:lf=/var/log/lpd-errs:\
        :mx#0:

 「lp|local printer」の部分が元からあったエントリーです。このエントリーをそのままそっくりコピーして書き換えたのが下の「pm700c|PM-700C ...」の部分です。pm700cの部分はWindowsから見たときのプリンタ名となり、「|」の後ろはコメントになりますので、それなりに考えてつけましょう。ローカルプリンタと違うのがプリンタの指定方法で、lp=/dev/lp0の部分をrm=IPアドレス:rp=lp1と書き換えます。このlp1というのはMini2内でのプリンタデバイス名で、先ほどの設定ファイル中の「10 Printer1Name : lp1 (fixed)」の部分に対応しています。他のプリントサーバーでは違う名前かもしれません。スプールディレクトリも変更しておきましょう。

 printcapでスプールディレクトリを変更したので、実際にスプールディレクトリを作り、元のスプールディレクトリのマネをしてパーミッションを設定します。

# cd /var/spool/output
# mkdir pm700c
# chown daemon:daemon pm700c
# chmod 770 pm700c

 これでUnixからpm700cという名前でプリントサーバーのつながったプリンタにプリントできるはずです。lpr -P pm700c とやって適当に文字を打ち込んでCTRL+Dを押し、実際に印刷できるかどうか確認してみましょう。あとはSambaを再起動すれば、Windowsからプリンタが見えるようになります。

追記: このままだとlprコマンドの#オプションで複数部数の指定をした時に正常にコピーが作成されませんでした。printcapのマニュアルを読んでみると、ネットワークプリンタにデータを送るときに、部数分データを送りつけるための指示子として rc というのがあります(remote.resend_copies)。これを指定して、

pm700c|PM-700C on the network:\
        :sh:rc:\
        :rm=192.168.1.32:rp=lp1:sd=/var/spool/output/pm700c:lf=/var/log/lpd-errs:\
        :mx#0:

とすることで正常に動くようになりました。(14 Jun 2003)

プリントサーバーとDHCP ↑

 ここではプリントサーバーを固定IPで設定しましたが、DHCPを使うこともできます。プリントサーバーがIPアドレス取得にDHCPを使うような設定してしまえば、あとはサーバー側でプリントサーバーのIPアドレスなどを全部操れるので、ネットワーク構成の変更があったときなどは便利です。

 まず、DHCPサーバーの設定から行います。プリントサーバーのIPアドレスがころころ変わってしまうのは面倒ですので、MACアドレスとの対応を1:1で固定してしまうことにします。dhcpd.confを以下のように書き換えます。

subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.64.192.168.1.126;
    max-lease-time 864000;
    default-lease-time 432000;
    option subnet-mask 255.255.255.0;
    option routers 192.168.1.1;
    option domain-name-servers DNSのアドレス;
    option broadcast-address 192.168.1.255;
    host pm700c {
        hardware ethernet 00:12:34:56:78:9a;
        fixed-address 192.168.1.32;
    }
}

だいたい分かりますね。編集したらdhcpdを再起動しておきます。プリントサーバーの設定は「04 DHCP/BOOTP」を「ON」とするだけです。残りの必要なパラメータはDHCPから取得できます。

NTP Network Time Protocol 〜時計の自動調整〜 ↑戻 ★

 PCの時計というのは往々にして狂っています。それも数秒とかかわいいもんじゃなくて、放っておくと分の単位でずれます。ちょっと前に実験したところでは、一日に数秒狂うのが当たり前のようです。電源を切るとバッテリバックアップになりますから、また狂い方が変わってきます。ひどいのになるとバックアップ用の電池が死んでいて、電源を入れると1970年1月1日0:00になっていたりします。

 まあ、バックアップ用電池が死んでいる場合は別として、時計が狂っていても通常はあんまり不都合がありません。しかし、年越チャットをやるときなどはやはり正確な時間が知りたい(笑)ものです。また、ネットワーク内の認証システムや、makeなどの開発ツールで正確な時刻が必要な場合があります。例えば、ネットワーク共有しているドライブ上でmakeをしている場合、あなたのビルド直後に隣の人がソースファイルを編集・セーブして、「もう一度makeして♪」とあたなに言った場合、もし、隣の人のPCの時計があなたのPCの時計よりあまりにも遅れていると、makeがかかりません。

 というわけで時計は時々合わせておきましょう。117が便利です。以上。

・・・

んなアホな!

 コンピューターなんだからもっと楽に、そして正確に合わせる方法があります。Windowsの場合、ドメインに参加していれば、ドメインコントローラーの時刻に自動的に同期するようです(ヘルプの受け売り)。ドメインに参加していない場合や、ご本尊であるドメインコントローラーの時刻、そしてUnixホストの時刻はNTP(Network Time Protocol)やSNTP(Simple NTP)といったプロトコルで校正することができます。

 激しく余談だけど、SNTPってSNMPやSMTPと紛らわしいよね。

 Windows 2000・Windows XPの場合、NTPクライアントの機能は既に組み込まれています。特にWindows XPの場合は設定が非常に簡単です。タスクトレイの時計をダブルクリックしてカレンダーと時計の載っている「日付と時刻のプロパティ」ダイアログを出します。タスクトレイに時計を出していない人はコントロールパネルから日付と時刻を変更するアイコンを次々クリックして出してください(GUIによって出し方が違います)。

 Windows XPの場合、このダイアログに「インターネット時刻」というタブがあります(Windows 2000以前のOSにはありません)。ドメインに参加していない場合、大概は「自動的にインターネット時刻サーバーと同期する」にチェックが入っていて、time.windows.com が選ばれているでしょう。ネットワークが常時接続環境ならば、設定はこれだけです。従量課金環境の場合、このまま放っておくと無駄に発呼が増えることになります。LAN内に複数のホストがある場合、そのうちの1台だけを外部時刻サーバーと同期させるようにし、他のホストは外部と同期を取っているホストを参照するようにした方がよいでしょう(後述します)。

 time.windows.com はMSの運営しているサイトなので、日本で運営しているサイトを指定したいと思う人もいるかもしれません。そういう場合、通信総研(CRL)Internet Multifeedが共同管理している実験サーバーがありますので、これを指定するとよいでしょう。実験サーバーですので未来永劫使える保証はありませんが、当面の間は運用を継続するようです。ホスト名は以下のとおりです。
ntp1.jst.mfeed.ad.jp
ntp2.jst.mfeed.ad.jp
ntp3.jst.mfeed.ad.jp

 Windows 2000の場合、net timeコマンドおよびWindows Timeサービスで同様のことができるようですが、何せヘルプが分かりにくい(ない?)ので各自自由研究とします。訳わからんようなら次に述べる桜時計を使うのもテです。ごちゃごちゃやるとサービスとして動かすこともできる模様です。

 Windows 95/98(多分MEも)の場合、OSに時刻同期の機能が組み込まれていませんので、アプリケーションで同様の機能を実現します。比較的簡単に使えるソフトウェアとして桜時計があります。1997年からバージョンアップがありませんが、問題なく動きます。適当なディレクトリにskrw021.lzhを展開してskrwatch.exeを起動したら、NTPサーバー名/IPアドレスに適当に上記のサーバー名を入れ、「オンライン」を押します。終了を押せばこの一度で校正動作は終わりです。「常駐する」にチェックを入れて閉じるを押すと、タスクバーに入って適当な間隔で校正を行ってくれます。動作を確認したらスタートアップフォルダにショートカットを放り込んでおくとよいでしょう。必要に応じて「起動時にオンラインにする」にチェックを入れます。

 Unixの場合はntpdate、ntpdやxntpdといったプログラムを使います。FreeBSD 4.9の場合ntpdateとntpdが入っています。ntpdateは実行したその場で時刻を合わせるプログラムで、ntpdは継続して自動的に時刻を校正するプログラムです。また、ntpdはNTPサーバーとしても振舞うことができます。ntpdateはスーパーユーザーで ntpdate サーバー名 と打つだけで時刻を校正してくれます。

 ntpdは /etc/ntp.conf という設定ファイルを使って設定します。といっても中身は簡単で、こんな感じです(もちろんスーパーユーザーで編集します)。

server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
driftfile /etc/ntp.drift

 serverは時刻同期をとるサーバーを指定します。複数指定でき、指定したサーバーすべてを使って同期をとります。driftfileというのは時計の動作速度がどのくらいずれているかを記録しておくファイルです。ntpdは時間をあわせるだけでなく、時計の進み具合も調整してくれます。したがって、動作時間が長くなるにつれて校正の間隔は長くなり、校正しなくても時刻がそれほどずれなくなります。しかし、電源を切ってしまうと校正した時刻も、時計の進み具合の調整量もおじゃんになってしまうので、忘れないように記録しておくのです。設定ファイルを書いたらスーパーユーザーのままntpdを実行します。

 ntpdの場合、同期状態に入ると、時刻の精度は概ね1/100秒以内に入ります。桜時計の場合は進度調整が行われないので、これより一桁ほど悪くなります。時刻の同期がとれると、ntpdはNTPサーバーとして動作を始めます。もちろん、Windows・Unixを問わず、LAN内のほかのクライアントから利用可能です。なお、電源投入直後の時刻校正は、ntpdではなくntpdateを使うのが一般的です。ndpdateで時刻を合わせておき、ntpdで時計の進度を調整して時刻の精度を保つ、という運用になります。ntpdateは放っておくと徐々に時刻を合わせようとしますが、電源投入直後は一気にあわせたほうが都合がよいため、-b を指定するとよいでしょう。ちなみに、-q を指定すると実際の時刻設定を行わなくなります。時計がどれくらいずれいているか? を調べるときに便利です。

 FreeBSDの場合、どちらもスタートアップスクリプトから自動で実行させることができます。rc.conf に以下のように書き加えます。

ntpdate_flags="-b ntp1.jst.mfeed.ad.jp"
ntpdate_enable="YES"
xntpd_enable="YES"

ntpdate は /stand/sysinstall からも設定できます。Configure→Networking→Ntpdateで設定します。

 NTPはUDPポート123を使います。宛先ポートが123なのは当然として、始点ポートも通常は123です。1024未満のポートは特権ポートのため、ファイアウォールでふるい落とされている場合があります。そのような場合は宛先ポートが123のUDPパケットを、逆ルールを動的生成(FreeBSDのipfwのkeep-stateルール)して通過させるように、ファイアウォールルールを書き加える必要があります。

 従量課金の場合、多数のホストで時刻同期を設定すると、ばらばらにネットワークに接続しに行くため、無駄な接続時間が多くなります。LAN内に時刻同期サーバーを一台置いて、そのサーバーを使って他のホストを同期するように設定すれば、無駄な接続はなくなります。桜時計の場合、「SNTPサーバーとして動作する」にチェックを入れるとこの機能が簡単に実現できます。ntpdの場合は自動的にNTPサーバーになっているはずです。LAN内で一台だけ外部のNTPサーバーを参照するように設定したNTP/SNTPサーバーを動かし、LAN内の他のホストはこのサーバーをNTPサーバーとして指定すれば、外部のサーバーを参照するのは1台だけになり無駄な発呼が減ります。

ホスト名とIPアドレス

 マイクロソフトネットワーク共有サービスだけを使っている場合、各ホスト(PC)はホスト名で指定できます。基本的にIPアドレスが表に出てくることはあまりありません。しかし、他のサービスが絡んでくると、192.168.1.2といったIPアドレスで指定することになります。IPアドレスはちょっと長いし、打ちにくいし、台数が増えてくると対応を覚えておくのが面倒です。まあ、普通はどこかに一覧を書いておくことになるでしょう。でも、対応をどこかに書いておくのなら、それを元に自動で変換してくれないかなぁ、と思うのが人情というもの。ここではそのための手法をいくつか紹介します。

hostsファイル ↑

 Windowsにも、Unixにも、テキストファイルで書かれた一覧を元に、ホスト名とIPアドレスを自動変換してくれる機能が標準で備わっています。普通、hostsファイルと呼ばれるファイルを元に変換が行われます。Unixマシンの場合は /etc/hosts というファイルになっています。

 Windowsの場合、このファイルが非常に変なところにあるので知名度が低いのですが、あることにはあります(ちゃんと使えます)。Win2K・WinXPの場合、Windowsディレクトリの下の、system32\drivers\etc(例えば c:\winnt\system32\drivers\etc\hosts)という非常に深いところにあります。Win98/MEの場合は忘れました(Windowsディレクトリ直下か、system32の下か、多分どちらか)。システムドライブを検索して、hosts.* というファイルを探せばそれらしいものが出てくるはずです。サンプルとして hosts.sam というファイルが添付されていることもあります。

 実際に使うのは拡張子がない hosts というファイルです。Explorer の設定で登録済み拡張子を出さないようにしている人(初期設定がそうなってます)は、間違って hosts.txt というファイルを作ってしまうとなっかなか気が付きませんので注意してください。拡張子は全部表示しておいた方が安全です。

 ファイル形式は至極単純です。アドレスとホスト名をスペースかタブで区切って並べるだけです。# はコメントを示します。ホスト名の後ろには別名を書くこともできます。中をのぞいてみると分かりますが、localhost(127.0.0.1)が既に定義されていることが多いです。これはそのまま置いておきましょう。

# hostsファイル
127.0.0.1       localhost
192.0.2.1       rat
192.0.2.2       ox
192.0.2.3       tiger
192.0.2.4       hare
192.0.2.53      dns

 Unixの場合、もう一つ設定しなければいけない場合があります。システムにより多少異なりますが、/etc/host.conf /etc/nsswitch.conf あたりの設定を確認する必要があります。とはいっても、通常はデフォルトの状態でhostsが使えるようになっていますから、うまく動かなかったときに man hosts してみるのがよいと思います。

 編集が終わったら、pingなどで名前がアドレスに変換できているかどうか試しておきます。うまく動いているようでしたら、LAN内の全ホストにこのhostsファイルをコピーします。コピーする場所はもちろんコピー先のシステムで定められたフォルダにします。ファイルはフロッピーで持っていってもいいですし、FTPやSambaで引っ張ってもいいです。普通は適当なサーバー上の公開フォルダに置いておいて、他の各ホストがそのファイルを引っ張るようにします。UnixとWindowsでは改行コードが異なるので、FTPのASCIIモードで転送するのが安全です。

 この方式の欠点は、ホストが増減するたび、hostsファイルを編集して、LAN内の全ホストのhostsファイルを更新しなければならない点です。ホストが少なければ大した手間ではないのですが、増えてくると結構大変になります。

 また、何か問題が起きた場合に、hostsファイルの更新を忘れているホストがあると解決に手間取ることがあります(意外に盲点)。Winならスケジューラーやスタートアップで、Unixならcronや起動スクリプトで自動的に更新する機構を作った方が安全でしょう。

DNS ↑

 hostsファイルを使った方式は各ホストに名前-IPアドレスの情報を持たせていました。DNSを使う方式は、名前-IPアドレスの情報を持ったサーバーを1台(あるいは数台)用意し、他のホストはそのサーバーを参照して名前-IPアドレス間の関係を自動的に変換します。サーバーを立てるのがちょっと大変(よくハマる)ですが、サーバーを立ててしまえば他のホストの運用は格段に楽になります。特に、DHCPを使っている場合はDNSサーバーのアドレスも自動設定できるため、DHCPクライアントになっているホストは手動で設定する項目は何もナシでDNSの恩恵にあずかれます。

 注意は、設定を間違えると自サイト内でなーんにもアドレス変換できなくなるばかりか、外界にも迷惑をかけることがあるので、なんだかよく分からない人は手を出さない方が無難です。また、内部で独自に名前空間を作って、外部は今まで通りに使いたいと言う場合、変換するドメインによって使うサーバーを分ける機構が必要になり、これがまたそれなりに面倒です。ちゃんと考えないとハマります。

 手順は、まず、内部で使うドメインを決めます。そのドメインを外から使わないのであれば、適当に好きなドメインを使えばOKですが、外部で使われているドメインを使うと、中から外へアクセスできなくなりますから、ドメイン名の最後を適当に「.local」とかで終わらせておくといいでしょう。外からも使う予定がある場合、レジストラに登録したドメインを使い、内部専用のドメインは一段サブドメインを作っておくと楽です。

 次に、DNSキャッシュを立てます。必須ではないんですが、キャッシュを立てておくと内外のDNSサーバーの切り分けが楽になります。今はまだ内部用のサーバーがありませんから、キャッシュは外部のサーバー(=プロバイダから指定されたサーバー)を指すようにしておきます。ネットワーク内のホストはDNSとして今立てたキャッシュを見るように設定を変えておきます。DHCPサーバーの設定も、DNSとして今立てたキャッシュを教えるように変更します。

 できたら、内部専用のDNSサーバーを立てます。DNSサーバーソフトウェアをインストールし、ゾーンデータを書いて、設定ファイルを作り、起動します。nslookupなどでテストしてちゃんと動いていることを確認します。このサーバーは外からはアクセスできないようにしておきます(ファイアウォールなどで外からのアクセスを遮断しておきます)。

 最後に、キャッシュの設定を変更して、内部ドメインの名前の場合は、内部専用のDNSを見に行くようにすればできあがりです。ざっと手順を書きましたが、詳しく説明すると一冊本ができるほどの内容ですので、別のページにまとめておきました。フレッツADSL導入日誌 / ローカルDNSサーバー をご覧ください。

 ネットワーク内のホストが増減した場合、書き換えるのはDNSのゾーンファイルだけです。DHCPの設定や、各ホストの設定を変更する必要はありません。

Copyright (C) 1997-2007 You SUZUKI

$Id: servers.htm,v 1.10 2008/06/09 12:13:11 you Exp $