IRCDの導入
katsumi@xb4.so-net.ne.jp
鮮度: 2000年12月16日(土)
更新: 2000年12月22日(金)
ircd.conf の定義に関して説明する。
はじめに
ircd.conf の反映
ircd.conf の変更を反映させる場合は、ircd に "kill -HUP" し反映する。
管理
パスワードなどが定義されるので、管理には十分注意すること。
ircd.conf は、他ユーザーが見られないようにしておくべきである。
ircd.conf の構文確認
ircd.conf を書き換えたら、chkconf で記述が正しいか確認する。
# chkconf
ircd.conf
# cd /usr/local/etc
# cp example.conf ircd.conf
# chmod 600 ircd.conf
指令 |
指定 |
名称 |
M |
必須 |
irc サーバの情報を定義 |
書式 |
M:<サーバ名>:<IPアドレス>:<設置場所>:<ポート番号>
|
例
M:csa.bu.edu::Boston University Computer Science Department:6667
M:csa-irc-server:128.197.13.20:Boston University Computer Science Department:6667
M:jo1upk.ymt.prug.or.jp:192.168.1.1:Kodaira Tokyo Japan:6667
サーバ名
サーバのFQDNやホスト名を定義
FQDNを使用しない場合は、必ず「IPアドレス」を記述する。
間違って他機器の FQDN は使用しないように注意すること。
この記述が、IRC空間でのサーバ名となる。
IPアドレス
irc サーバのIPアドレスを定義
サーバ名で FQDN で記述されている場合は、省略可能である。
複数のIPアドレスが有る場合は、この定義で確定する。
これは対外接続の場合に使用するIPアドレスとなる。
設置場所
サーバ機の設置場所を定義
ポート番号
他ircサーバから接続されるポート番号を定義
指令 |
指定 |
名称 |
A |
必須 |
irc サーバの管理者情報を定義 |
書式 |
A:<管理者名および場所>:<管理者電子メールアドレス>:<備考>::
|
例
A:Helen Rose - Boston University CS Department:Helen Rose:Client Server::
管理者名および場所
管理者の氏名とそのサーバの設置場所を定義
管理者電子メールアドレス
管理者の電子メールアドレスを定義
備考
何か書きたいことがあれば自由に記述
指令 |
指定 |
名称 |
P |
必須 |
各種接続のためにポートを指定(標準 6667) |
特権など各種設定を行うなかで(後述)、様々な接続が必要なってくる。
その接続の種類毎にポートを使い分けた方が良い。
config.hでUNIXPORTを定義してコンパイルした場合はUNIXドメインも使用可能である。
書式 |
P:<IPアドレス>:<*>:<IPアドレスのマスク>:<ポート番号>:
|
例
P::::6667:
P:206.252.192.20:::6668:
P:::147.210.*:6669:
P:::128.2.0.0:6664:
IPアドレス
接続を許可するIPアドレスを記述
空の場合は、全機器の接続を許可。
IPアドレスのマスク
接続を許可する機器のIPアドレスのマスクを記述
ワイルド指定 |
*、0 が使用可能
|
"P:::192.168.*:6664:" と "P:::192.168.1.0:6664:" は同じ。
ただし、* を 192.16*.1 のような定義は不可
|
接続クラス
接続方法を接続種類によって分離するクラスである。
サーバ同士の接続用クラスとクライアント用のクラスとを
分離して定義し利用する。
Y 行は、クラスの記述が必要な行より先に記述すること。
「sendQ」以外を空にすると 0 と解釈される。
記述の仕方次第でクラスが決まる |
サーバクラス |
Y:<クラス番号>:<PING間隔>:<接続確認間隔>:<最大接続数>:<SendQ>::
|
クライアントクラス |
Y:<クラス番号>:<PING間隔>::<最大接続数>:<SendQ>:<ローカル制限>:<グローバル制限>
|
サーバクラスの例 (その1)
Y:1:90:300:1:4000000::
Y:2:90:300:1:4000000::
※クラス番号 1は、必須である。
サーバクラスの例 (その2)
サーバ接続用の定義であり、
以下の場合では、クラス2で接続する。ポート番号は、6667〜6668を利用する。
Y:1:600:300:1:4000000::
Y:2:600:300:1:4000000::
このような定義がある状態で、以下の
c 行および
N 行を定義することとなる。
c:192.168.1.1:SRV1:irc.kodaira.jo1upk.ymt.prug.or.jp:6667.6668:2
N:192.168.1.2:SRV2:irc.osaka.test.or.jp::2
クライアントクラスの例 (その1)
Y:10:90::100:512000:10:32
Y:11:90::100:512000:0.1:0.2
Y:12:90::100:512000:3:3
Y:13:90::100:512000:2:2
Y:14:90::100:512000:1:1
※このクラス番号毎に、接続可能クライアントを『I,i』でマッピングし、
同時に接続可能なセッション数などを決定することになる。
Y:13:90::100:512000:1:1
この場合であれば、1つのみ許可される。
クライアントクラスの例 (その2)
Y:10:900::100:512000:10:32
Y:11:900::100:512000:0.1:0.2
Y:12:900::100:512000:3:3
Y:13:900::100:512000:2:2
Y:14:900::100:512000:1:1
定義した各クラスにおける、
・最大接続数
・Ping間隔
・同時に接続可能なチャンネル数
の定義を行う。
この例では、Pingは、900秒間隔で実施。最大接続数を 100としている。
ローカル制限およびグローバル制限の差を定義することで、クライアント種類毎に、
同時に接続できるチャット・チャンネルの数など、制限できるようになる。
例えば、クラス 14 においては、1:1 で、同時に1つまでしか開けないというクラスを
定義したに過ぎない。
これを、クラス 14 を利用するようにクライアント接続許可を定義する
i,I 行を定義することで、制御できるようになる仕組みである。
クラス番号
任意の数字を記述
ここで各々のクラスを区別する。
他の行のクラス記入欄にはこの数値を記述。
サーバとの接続時クラス番号が大きい方を優先する。
PING間隔
何秒ごとにPINGするかを定義
サーバー接続の場合は、サーバ双方で同じ値を使用することが望ましい。
接続確認間隔
何秒間隔で他サーバからの接続確認するかを設定
重要な接続ほど確認間隔(値)を小さくし設定すると良い。
最大接続数
接続できる最大数を設定
■サーバ接続の場合
自動接続可能な接続数を設定
CONNECT コマンドを使用した場合は、この制限を受けない。
■クライアント接続の場合
sendQ
sendQ を何バイトとするか定義
(config.h に定義された MAXSENDQLENGTH に制約されない。)
ローカル制限
サーバ自身への複数のクライアント接続(クローン接続)を規制
書式 |
"<同一ホストからの最大複数接続数>.<同一ホストかつ同一ユーザからの最大複数接続数>"
|
省略時 |
0 (無制限) |
■同一ホストからの最大複数接続数
1つの数字のみ定義された場合は、「同一ホストからの最大複数接続数」と解釈する。
■同一ホストかつ同一ユーザからの最大複数接続数
identd を使用して判断する。
ident サーバから応答がない場合には、"unknown"というユーザ名が使用されるが、
これは「同一ホストかつ同一ユーザからの最大複数接続数」とはならない。
グローバル制限
複数のクライアント接続を規制する
「ローカル制限」と異なり、他のサーバへ接続している数もカウントする。
したがって、ローカル接続も含まれるため「グローバル制限」では、
ローカル制限と同じかより大きい値を使用すること。
クライアント接続を許可するホストを定義
I 行とi 行とが混在定義された場合は、i 行の条件が優先する。
したがって、I 行で条件を定義しても、i 行でマッチしてしまうと無駄な定義となる。
定義順ではなく、i 行を検索しマッチしなければ、I 行を検索することとなる。
i 行に書かれたホスト
・ニックネームの変更不可
・チャンネルオペレータ権限が貰えない(@になれない)
I 行に書かれたホスト
・クライアントとしての全機能を保有する
・チャンネルオペレータ権限を付与できる(@になれる)
制限付き
|
i:<クライアントのIPアドレス>:<パスワード>:<ホスト名>:<ポート番号>:<クラス番号>
|
通常
|
I:<クライアントのIPアドレス>:<パスワード>:<ホスト名>:<ポート番号>:<クラス番号>
|
例
i:*@*::::13
i:*@*:foobar:::13
i:::*@*.???:13
I:*@192.168.*::::12
I:*@128.197.*::*@*.bu.edu::10
I:::hrose@csa.bu.edu::10
I:::*@ppp*.bu.edu::12
クライアントのIPアドレス
接続を許可するクライアントのIPアドレスを記述
"username@128.197.27.1" のようにユーザ名も併用する場合は、
クライアント側に ident サーバが設置されている必要がある。
空の場合は、この条件でのマッチングはしない。
ただし、下の「ホスト名」かどちらかに条件を明記する必要がある。
パスワード
接続にパスワードを必要とさせる場合には定義する
ホスト名
接続を許可するクライアントのホスト名を記述
「クライアントのIPアドレス」と同じようにユーザ名を併用する場合は
ident サーバがクライアント側に設置されている必要がある。
空の場合は特別の意味を持つ。
条件検索としては、1.「ホスト名」を検索。
条件に一致した場合、そのホスト名で接続を許可する。
条件に一致しない場合、2.「クライアントのIPアドレス」の検索を実施する。
条件に一致した場合、例えホスト名が逆引き可能であっても、
IPアドレスの接続を許可する。
「ホスト名」が空の場合は、利用可能な場合「クライアントのIPアドレス」
での検索に一致したとしてもホスト名で接続を許可する。
ポート番号
クライアントが利用するポート番号を記述
※空や 0 を記述した場合は、全ポート許可
クラス番号
この定義で、利用できる最大ユーザ数が決定する
オペレータとしてアクセスするホストの情報を記述
グローバルオペレータ
|
O:<ホスト名>:<パスワード>:<ニックネーム>:<ポート番号>:<クラス番号>
|
ローカルオペレータ
|
o:<ホスト名>:<パスワード>:<ニックネーム>:<ポート>:<クラス番号>
|
※ローカルオペレータでないと使用できないコマンドがある。
例
O:*.bu.edu:Zaphod:Trillian::10
O:hrose@csa.bu.edu:Zaphod:Trillian::10
o:*.bu.edu:ITBites:jhs::10
O:rocker@csa.bu.edu:T0eiVgHrqeKTQ:Rocker::10
ホスト名
サーバーオペレータとして接続許可するホストを定義
"username@hostname" のように username を併用した場合、ident サーバを使用する。
パスワード
接続時必要となるパスワードを記述
■config.h で CRYPT_OPER_PASSWORDを定義した場合
cryptされたパスワードを記述する。
ircdディレクトリの下にあるcryptディレクトリの中にあるプログラムを使用する。
ニックネーム
サーバオペレータとして接続を許可するニックネームを記述
ただし、このニックネームでなければサーバーになれないということではない。
詳しくはOPERコマンドを参照のこと。
ポート
未使用。空にしておく。
クラス番号
この定義で、利用できる最大ユーザ数が決定
適切な
I 行のために
I 行で使用する
クラス番号より小さい番号を使用した方が良い。
指令 |
指定 |
名称 |
c,C |
ネットワーク環境定義 |
サーバ接続 |
このC 行または c 行で自サーバーと相手サーバに接続するかを設定
c 行を利用する場合
チャット中データは圧縮(zlibを使用)される。
したがって config.h において、ZIP_LINKS を定義してなければならない。
接続先のサーバが圧縮形式でのリンクを拒否したり、サポートしていなかった場合は
自動的に非圧縮形式で接続される。
記述に際にしての注意事項
また、C 行は3つ以下にとどめておいた方が良い。
クライアントへの遅延や
ネットワークに余分なトラフィック増加など問題が起こるためである。
また複数文書いた場合、最下行に記述されたサーバから優先し接続する。
圧縮接続 |
c:<ホスト名またはIPアドレス>:<パスワード>:<サーバ名>:<ポート番号>:<クラス番号>
|
非圧縮接続 |
C:<ホスト名またはIPアドレス>:<パスワード>:<サーバ名>:<ポート番号>:<クラス番号>
|
例
ホスト名またはIPアドレス
接続するホスト名またはIPアドレスを記述
"username@" をホスト名やIPアドレスの前に付けて identサーバを用いた
マッチングも利用できる。
パスワード
接続先の管理者と相談して決めたパスワードを記述
パスワードは、相手のサーバの
N 行に書かれているパスワードと
一致する必要がある。
またペアとなっている自サーバの
N 行のパスワードとは
違うものにした方が良い。
サーバ名
相手の IRC空間でのサーバ名を記述
相手のM行に書かれた「サーバ名」を書けばよい。
ただし、後述する
N 行で
「ドメインマスク」を使用してサブドメインの集約を行っている場合、
M 行で定義された「サーバ名」を記述せずに集約されたサーバ名を使用すること。
ポート番号
接続するポート番号を記述
■
M 行に記述した UDP-ping用ポート番号と異なる場合
書式 |
<接続するポート番号>.<UDP-ping用ポート番号>
|
の書式で記述する。
空の場合は自動接続とはならず、相手サーバからの接続を待ち続ける。
クラス番号
指令 |
指定 |
名称 |
N |
ネットワーク環境定義 |
サーバ接続 |
書式 |
N:<ホスト名またはIPアドレス>:<パスワード>:<サーバ名>:<ドメインマスク>:<クラス番号>
|
例
C:hrose@cs-ftp.bu.edu:bigspark:cs-ftp.bu.edu:6667:2
N:hrose@cs-ftp.bu.edu:bigalpha:cs-ftp.bu.edu::2
C:irc-2.mit.edu:camelsrk00l:irc-2.mit.edu::2
N:irc-2.mit.edu:andsoarellamas:irc-2.mit.edu:1:2
c:irc-2.mit.edu:camelsrk00l:irc-2.mit.edu:6667.6668:2
N:irc-2.mit.edu:K6yiH\i87f5:irc-2.mit.edu:1:2
ホスト名またはIPアドレス
接続しに行くホスト名またはIPアドレスを記述
"username@"をホスト名やIPアドレスの前に付けて
identサーバーを用いたマッチングも利用可能
パスワード
接続先の管理者と相談して決めたパスワードを記述
パスワードが相手のサーバーの C 行に書かれているパスワードと一致する必要がある。
またペアとなっている自サーバの
C 行のパスワードとは違うものにした方が良い。
ただし、config.h で CRYPT_LINK_PASSWORD を定義してコンパイルしている場合は、
パスワードを暗号化されたパスワードを記述すること。
その際には、ircd ディレクトリの下にある cryptディレクトリの中にあるプログラム
を使用する。
サーバ名
相手の IRC空間でのサーバ名を記述
相手の
M 行で定義された「サーバ名」を記述すれば良い。
ただし、「ドメインマスク」を使用してサブドメインの集約を行っていた場合、
M 行で定義された「サーバ名」を記述せずに集約されたサーバ名を使用すること。
ドメインマスク
数字を定義する
この数字を使ってサブドメインの集約を行う。
詳細は、マニュアルを参照のこと。
クラス番号
指令 |
指定 |
名称 |
K,k |
任意 |
締め出すアカウント |
"ユーザ名@ホスト名" の形式で、サーバから締め出すユーザを指定
k 行は、「ユーザ名」の変わりに「認証」を利用
ident サーバの応答という点では同様であるが、
「認証」では本来認めない UNIX以外のタイプからの応答も認める。
ただし、その場合ユーザ名の前に "-" が付与される。
これは自サ−バにのみ適用される。したがって、他のサーバでは
(そのサーバでも記述されていない限り)、IRC で接続可能。
通常の規制 |
K:<ホスト名またはIPアドレス>:<対象時間または注釈>:<ユーザ名>:<ポート番号>:
|
UNIX以外も視野に入れた規制 |
k:<ホスト名またはIPアドレス>:<対象時間または注釈>:<認証>:<ポート番号>:
|
例
k:*.alaska.edu::*FSSPR:0
K:acs*.bu.edu:0800-1200,1300-1700:*:0
K:*foo.edu:Use server irc.bar:*:0
K:*toto.fr:Use port 6666:*:6667:
k:129.69.*:identd (rfc1413) required:unknown::
k:=129.69.*:identd (rfc1413) required:unknown::
ホスト名またはIPアドレス
接続を拒否するホスト名またはIPアドレスを記述
ホスト名、またはIPアドレスを記述。
ワイルド指定 |
* の使用可能 |
同様にIPアドレスのbitmask(例えば127.18.*を127.18.0.0と書く)も使用可能
|
IPアドレス指定の場合、正引きの可否に関わらずIPアドレスで判定する。
正引き不可のときのみの判定にしたい場合は、"=" を前に付けること。
対象時間または注釈
通常、接続を拒否する理由として使うメッセージを記述
空にした場合は、省略時の文章が利用される。
クライアント接続中、時間に到達した場合は、5分前に警告を発し追い出す。
■例:サーバのローカルタイムで 8:00〜12:00および、13:00〜 17:00の間接続を不可
"0800-1200,1300-1700" のように定義する。
ユーザ名
対象とするユーザ名を記述
ident サーバからの応答を利用
ident サーバのタイプがUNIX以外の時は、その応答を利用せずに、
USER コマンドのパラメータを使用する。
認証
対象とするユーザ名を記述
ただし必ずしもUNIXタイプであるident サーバの応答を必要としない。
ただしその場合には、応答の前に "-" を付加する。
他は、「ユーザ名」と同様である。
ポート番号
対象とするポートを記述
※空や 0 を定義した場合は、全てのポートを禁止する
リーフ
リーフ "leaf" として接続することを強制する。
1つの他サーバーとだけしか接続してないということであり、
他にも他サーバーのリンクツリーを制限させることが可能。
この制限に従わない場合には、そのサーバーとの接続を切断する。
書式 |
L:<禁止するホスト名のマスク>::<サーバ名>:<リンクツリーの深さ>:
|
例
L:::kaja.gi.alaska.edu::
L:::cm5.eng.umd.edu:1:
L:*.edu::*.au::
禁止するホスト名のマスク
L 行で指定したサーバ名が、マッチするサーバと接続しないよう制限する
ワイルド指定 |
*、? の使用可能。空にした場合、*と同様。
|
SERVER コマンドを受信するたび確認する。
サーバ名
L行で制限するサーバのサーバ名を記述
リンクツリーの深さ
L 行で制限するサーバが接続するサーバに関し、SERVER コマンドを受信するたび、
ホップ数を参考にリンクツリーの深さを調べるが、そのホップ数を定義する。
空の場合、1 と見做し、リーフであるよう制限する。
0 の場合、どのサーバとも接続させないということとなる。
ハブとして接続することを許可する。
ハブ自体は config.h のHUBで定義するが、
ハブを設定すると複数のサーバに接続することができるため、
独立したサーバと接続するとき以外は、H 行を定義すること。
書式 |
H:<サーバ名のマスク>::<許可するサーバ名>::
|
例
H:*::cs-ftp.bu.edu::
H:*.mit.edu::irc-2.mit.edu::
サーバ名のマスク
許可したハブが、どのサーバと接続して良いか記述する。
ホスト名ではなくサーバ名で記述する。
許可するサーバ名
ハブとして接続を許可するサーバ名を記述
自マシンからの自動接続を規制する。
大きい複雑な状況にあるネットワークと接続している際に役立つ。
書式 |
D:<否定されたサーバ名>:<否定されたクラス番号>:<サーバ名>:<クラス番号>:
|
例
D:*.edu::*.fi::
D::2:eff.org:3:
否定されたサーバ名
サーバ名のマッチングという方法で記述する。
サーバが同じ IRC空間、ネットワーク上にあれば、この D 行は機能する。
否定されたクラス番号
クラス番号のマッチングという方法で記述する。
クラス番号で結ばれたサーバが同じIRC空間、 ネットワーク上にあれば、
この D 行は機能する。直接に接続されていなくても構わない。
サーバ名
D 行が機能した場合にどのサーバへの自動接続を禁止するかサーバ名で記述
クラス番号
D 行が機能した場合、どのサーバへの自動接続を禁止するかクラス番号で記述する。
クラス番号で結ばれたサーバへの自動接続を禁止する。
直接に接続されていなくても構わない。
サーバプログラムのバージョンやコンパイルオプションを基づき、
接続されるサーバを制限する。
書式 |
V:<バージョンのマスク>:<フラグ>:<サーバ名のマスク>::
|
例
V:IRC/020901*::*::
V:*:*/D:*::
V:IRC/020902*:IRC/K:*.edu::
バージョンのマスク
禁止するサーバプログラムのバージョンを記述
ワイルド指定 |
* の使用可能 |
例えば 2.9.1 なら 020901となる。
マイナーバージョンアップも視野に入れて020901*とした方がよい。
また 2.10 から前に「サーバのタイプ」を付けるようになった。
ircd ではid、"IRC"となっている。区切りには/(スラッシュ)を使う。
|
フラグ
ircd/s_debug.cで定義されたフラグを記述
VERSION コマンドの応答が、ここで定義したフラグとなっていた場合、
そのサーバーとの接続を拒否する。
例えば、D を記述すると DEBUGMODE と定義してコンパイルされたサーバが
接続された場合、拒否する。
K を記述すると OPER_KILL となる。
「バージョンのマスク」と同様、2.10 から「サーバのタイプ」を指定できるようになった。
サーバ名のマスク
対象とするサーバ名のマスクを記述
クラスの最大接続数になっている場合、
サーバ自体が最大接続数となっている場合、
または、認証に失敗したクライアントを他サーバへ斡旋する。
書式 |
B:<クラス番号またはホスト名のマスク>::<サーバのホスト名>:<ポート番号>:
|
例
B:-1::irc.stealth.net:6667:
B:*.fi::irc.funet.fi:6667:
クラス番号またはホスト名のマスク
対象とするクライアントをクラス番号、ホスト名、IP、IPのビットマスクで指定
"All connections in use" のようなエラーが出る場合、
サーバーが完全にいっぱいであり、サーバはクライアントのホストも
クラスも知ることが出来ない。このような場合は、空にすること。
サーバのホスト名
斡旋先のサーバのホスト名を記述
ポート番号
斡旋先のサーバのポートを記述
詳細は、doc/SERVICE.txtを参照。
書式 |
S:<ホスト名のマスク>:<パスワード>:<サービス名>:<サービスタイプ>:<クラス番号>
|
例
S:eep.local.net:thisisapassword:EepInfo:0:1
ホスト名のマスク
サービスとして接続を許可するホストのIPやホスト名を記述
パスワード
SERVICEコマンドで使用するパスワードを記述
サービス名
サービスで利用する名前を定義
サービスは、ニックネームを持たず、この名前はニックネームと異なり
S 行で定義しているもの以外は、変更不可である。
サービスタイプ
サービスタイプを記述
ここで、どのような特権を保有するか定義する。
タイプは、ircd/service_def.h の中に定義されている。
複数のタイプを保有するときは、ビットの和を定義すれば可能である。
クラス番号
クライエントの接続可否を外部プログラムを利用して制限する。
ただし、config.h で R_LINES を定義しておく必要がある。
プログラムの引数は、USER コマンドから得られる、
・ユーザ名
・ホスト名
・ident サーバの応答
の3つが引数となる。
プログラム出力は、
・"Y <メッセージ>"
接続許可。メッセージ破棄。
・"N <メッセージ>"
接続拒否。メッセージとして、その理由を表示。
であること。
書式 |
R:<ホスト名>:<プログラムのフルパス>:<ユーザ名>:::
|
例
R:csl.bu.edu:/home/hrose/bin.sun3/sun3access:*:::
ホスト名
対象とするホスト名を記述
プログラムのフルパス
使用するプラグラムのフルパス(絶対パス)で記述
ircd プロセスのユーザ権限で、このプログラムも実行できる必要がある。
ユーザ名
対象とするユーザ名を記述
特定のサーバを隔離する
これは同じ IRC空間全てのマシンに、
同じ Q 行を定義しておかないと、
隔離しようとするサーバが接続してきた際に、
IRC空間として一貫性が保てなくなる。
その際には、独立サーバとなる可能性がある。
実装としては、新しいサーバがブロードキャストされてた際に、
新しいサーバがこの Q 行と一致した場合、
そのブロードキャストしたサーバ(SERVER コマンドを転送してきたサーバ)
との接続を切断するようになる。
例
Q::this server is too slow and lags the net:cm5.eng.umd.edu::
隔離理由
隔離する理由を記述
サーバ名
対象とするサーバのサーバ名を記述
[斎藤さんち]