[CTX]
[ALL]
合成演算子 ( &, |, ! )
上記でも説明しましたが、カンマ(,)の意味は、HostListで、"A,B"のような場合、ANDや、ORではありません。AND,
OR, NOTのような演算子は、 リストの特別なメンバによって、提供されます。
"&"
"hostList =A,&,B"のように使う、AND演算子で、Aが偽の場合、hostList
は、Bを評価せずに、トータルで偽になります。他の場合、全体で真になるためには、Bが真になる必要があります。
"|"
"hostList =A,|,B"のように使う、OR演算子で、Aが真の場合、hostList
は、Bを評価せず、トータルで真になります。他の場合、全体で真になるためには、Bが真になる必要があります。
"!"
"A,!,B"のように使う、NOT演算子で、Aの結果は反転され、続いて、Bがある場合、評価されます。 例)
PERMIT ="*:*:-T.9-16,&,hostList1 "
PERMIT ="*:*:-T.17-8,&,hostList2 " //
上記例と同じ意味です。
パラメータ置換
これらは、DeleGateのシンタックスを良く見せるため(もう)の、設定ファイル 書式ではありませんが、単純な再帰的置換え機構(階層的および、分散した、パラメータ部を一つのパラメータ(または、オプション)リストに組み立てます)です。
オプションとパラメータは、外部の"substitution
resources "(置換リソース)から、読込むこともできます。"+=file "のようなオプションは、オプションのリストが列挙された、"file "の名前を持つリソースに置換えられ、"name =+=file "のようなオプションは、"name =value "リストに置換えられ、この"value "は、"file "中に列挙されます。同様に、"name =xxx :+=file "のようなオプションは、リスト"name =xxx :value "によって置換えられます。
置換は、繰返し実行できます。この場合、相対リソース名は、DGPATH または LIBPATH 内で検索されます。デフォルトで、DGPATH ='+:.:${HOME}/delegate'の "+"は、"caller "(呼出したユーザ)リソースの場所を表します。例)"+=file2"が、呼出者ファイル"/usr/etc/file1"から参照される場合、"file2"は、"/usr/etc/file2"として、検索されます。リソース名は、"+={http://host/file1}"や、"+={http://host/file}"のようにURLで、指定できます。
paramRef == +=[URL ][?label ,[label ]*]
paramList == line
line
...
paramListPart == CASE label
paramList
ESAC
置換リソースは、オプション(または、パラメータ)のリストで、それぞれの行が一つのオプション(または、パラメータ)を表します。それぞれの行で、シャープ(#)に続く文字列は、コメントとして、無視されます。空白文字キャラクタ(
SPACE ,
TAB , LF,
CR)が、各行の最初または終わりにある場合無視されます。シングルクォート(')および、ダブルクォートは、取り除かれます。バックスラッシュ(\)に続く文字は、そのままの文字として扱われます。
例) 以下の5つの例は、他と同じ意味を持ちます。
置換リソースは、DeleGateが、SIGHUPを受けるか、CRONパラメータの"-restart"動作により、
再起動 したときに再読込されます。
他の置換 "name =-=URL "
は、URLのないようをローカルファイルシステム上(ACTDIR内)の一時ファイルに読込み、パラメータを"name=/path/of/temporary-file"に書換えます。これは、"-eCONFIGDATA=-=http://server/configData"のように、リモートリソースをCGIまたは、CFIプログラム経由にしたい場合、有効です。この場合、これらプログラムは、環境変数
CONFIGDATA("http://server/configData"の内容を含む一時ファイル名を値に持つ)で与えられます。
CFI と CFI スクリプト
クライアント・DeleGate間、または、DeleGate・サーバ間の通信は、CFI(Common Filter Interface)と呼ばれる簡単な仕組みを用い、DeleGateに関連付けたユーザ定義フィルタプログラムによって、抽出、または、変換できます。すでに存在するフィルタプログラムが、標準入力から受けて、標準出力に出力する場合、CFIプログラムとして、変更なしで使用可能です。CFIの使用法は、以下のようなパラメータで制御されます:
filterName ="filterSpec "
CMAP ="filterSpec ":filterName :connMap
filterName == FCL | FTOCL | FFROMCL |
FSV | FTOSV | FFROMSV |
FMD | FTOMD | FFROMMD
filterSpec == filterCommand | CFIscriptName
filterName
は、
FXX ,
FTOXX, FFROMXX
のような名前で、
XX は
CL (クライアント),
SV (サーバ),
MD (MASTER-DeleGate)の内の一つです。
FXX
のフィルタコマンドは、クライアントに対して、ファイルディスクリプタ0がバインドされ、DeleGateに対しては、ファイルディスクリプタ1がバインドされます。
FTOXX
と
FFROMXX のフィルタコマンドは、標準入力から入力を受け、
XX
に対してバインドされた標準出力へ、出力を投げます。
フィルタ(サーキットレベル情報において)以下のようにCMAPパラメータを使うことで、条件付で利かせることができます:
CMAP =filterSpec :filterName :ProtoList :dstHostList :srcHostList 例)
CMAP ="sslway:FSV:telnet:hostA:*"
は、HostA上のテルネットサーバに接続する場合のみ、SSLwayフィルタを利かせることを意味します。
FTOXX と、 FFROMXX フィルタで、
CFIスクリプトは、データタイプによって、それぞれのデータに、適したフィルタを選択して利かせることができます。FTOCL =filterCommand
のような、直接使用の変わりに、TOCL =filter.cfi
を指定でき、ここでのfilter.cfiは、CFIスクリプトフォーマットのファイルです。また、CFIスクリプトは、FTOCL =URL
のようにHTTPやFTP経由で、リモートホストから、読込むこともできます。CFIスクリプトのファイル名、または、スクリプト中で参照されるフィルタコマンドが、相対パス名で、指定される場合、それらは、LIBPATH 内を検索されます。
CFIスクリプトは、テキストデータで、"#!cfi"
マジックストリングで、始まり、それぞれ"--"によって区切られた、1つ以上のフィルタ設計書を含みます。
CFI script == "!#cfi" NL filterUnit [ "--" NL filterUnit ]*
filterUnit == filterRule [ filterRule ]*
filterRule == [ Action "/" ] ruleName ":" ruleBody
Action == "Output" | "Remove"
ruleName == "Filter" | "CGI" | "Header-Filter" | MIMEhdr
MIMEhdr == "Content-Type" | "User-Agent" | ...
X-hdr == "X-Status-Ver" | "X-Status-Code"
| "X-Request-Method" | "X-Request-Ver"| "X-Request-URL" | ...
ruleBody == string NL [ SP string NL ]*
Action (動作)を指定しない場合、入力ヘッダに
ruleName :ruleBody
を突合わせることを表します。入力メッセージが、ruleBody とマッチするフィールドボディをともなう
ruleName ヘッダ
を持つ場合、マッチします。
1つ以上のルールがマッチした場合、真になり、 filterUnit が採用されます。
filterUnit 内にマッチするルールが存在しない場合、
filterUnit は、無条件に採用されます。
現在、限られたMIMEヘッダセット(要求・応答メッセージ中の)のみがマッチングに使用できます。
オリジナルヘッダ中に含まれないいくつかの拡張ヘッダ情報でマッチすることもできます。
(例:応答メッセージ中のステータスコードを意味する、"X-Status-Code")
ヘッダruleName が"Filter"または、"CGI" または、"Header-Filter " の場合、例外的に、
それらは、動作(または、フィルタ)を指定し、入力データに利かせます。
"Filter" または、"CGI"フィルタの場合、入力メッセージのボディ部は、
フィルタプログラムの標準入力にパスされ、標準出力から出力されます。
また、出力データは、元の入力メッセージの変わりに、対象(クライアントや、サーバ)に転送されます。
転送メッセージ中の"Content-Length"は、ボディ部のサイズを示す値に調整され、転送されます。
"Header-Filter" フィルタの場合、メッセージのヘッダ部は、フィルタに授受されます。
HTTPメッセージ(Request-Line または、Status-Line)中のstart-line は、
"Request-Line:" または、"Status-Line:" をプリフィックスされたヘッダフィールドとして、
渡されます。
ruleName :ruleBody に対して、"Action /" をプリフィックスした場合、
いくつかの簡単な書換えは、ruleBody データを使用し、関連する、ruleName
に対して行われます。"Output/ruleName :ruleBody "は、
ruleName :ruleBody
フィールドを、ヘッダに付け加え(または置換え)る事を表します。"Remove/ruleName :ruleBody "は、ruleBody
にマッチするボディと、ruleName 名をともなうヘッダフィールドを削除することを意味します。
例) HTTP 応答メッセージの書換え
SERVER =http FTOCL =test.cfi
[content of test.cfi]
#!cfi
Content-Type: text/html
Filter: sed's/string1 /string2 /'
--
Content-Type: image/gif
Output/Content-Type: image/jpeg
Filter: gif2jpeg
URL書換えによるプロキシ動作
プロトコルの詳細と使用例
共通の表記
# delegated ...
特権のあるポート番号を使用するため、DeleGateをsuper-userで呼出す事を意味する
% delegated ...
super-user以外でDeleGateを呼出すことを意味する
firewall % delegated ...
DeleGateが、インターネットに/から到達できる、あなたのサイトに属したホスト上で動作していることを意味する
internal % delegated ...
DeleGateが、インターネットから隔離された、あなたの内部ホスト上で動作していることを意味する
external % ...
あなたのサイト外のホスト上で、何かすることを意味する
TCPrelay
SERVER =tcprelayパラメータをともなうDeleGateは、伝送内容を把握しないで、クライアント・サーバ間の通信を1つのTCP接続で中継します。このように、TCP上の任意アプリケーションプロトコルは、DeleGateのサポートするプロトコルリスト中に存在しなくても、SERVER=tcprelayによって、中継できます。しかし、この場合、サービスへの付加価値(キャッシュ,マウント,ログ)は、使用できません。クライアントからのリクエストによる、任意サーバへの接続は、できません。主接続以外に動的に他の接続を生成するアプリケーションプロトコル(FTPなど)は、中継できません。プロトコル上、元サーバ上で、他の名前に変わってしまうアプリケーションプロトコル(HTTP中の完全なURL指定など)も中継できません。
例) 同様の役割をする、TCP上の2つのプロキシ
# delegated -P25 SERVER =smtp://mailserver # delegated -P25
SERVER =tcprelay://mailserver:25
UDPrelay
SERVER =udprelayパラメータをともなうDeleGateは、伝送内容を把握しないで、クライアント・サーバ間の通信をUDPで中継します。これは、TCPのためのtcprelayと同様な、長所/欠点を持ちます。ルーティング情報が変更されるようなアプリケーションプロトコル(CU-SeeMeなど)もまた、udprelayで中継できません。
例) 同様の役割をする、UDP上の2つのプロキシ
# delegated -P53 SERVER =dns://nameserver # delegated -P53
SERVER =udprelay://nameserver:53
Socks サーバ
Socks-DeleGateは、SocksV4とV5の両方を受け付けます。しかし、SocksV5における、認証の仕組みは、まだサポートしていません。
例) Socks-DeleGate
# delegated -P1080 SERVER =socks 例) 上流Socksサーバ に転送する。
HTTP プロキシ/サーバ
例) 単一HTTPプロキシDeleGate
firewall % delegated -P8080 SERVER =http
このDeleGateを内部ホスト上のクライアントから使う場合、HTTP, HTTPS (Security), FTP , Gopher,
Waisのプロキシに "firewall :8080"を指定します。
例) HTTPプロキシDeleGate(カスケード)
firewall % delegated -P8888 RELIABLE =internal
internal % delegated -P8080 SERVER =http MASTER =firewall :8888
内部 ホストからの要求のみ受け付けるgeneralist DeleGateをfirewall
上で走らせ、firewall ホスト上のgeneralistを使用する、specialistを内部で、走らせる。generalistは、上流DeleGateとして、任意プロトコルの複数のDeleGateから、共有できます。
例) 元HTTPサーバDeleGate
host# delegated -P80 SERVER =http \
MOUNT ="/* /path/of/www/*" RELAY =no RELIABLE ="*"
".cgi"拡張子をともなう名前のファイルは、CGIスクリプトとみなされます。以下のように、MOUNTで指定したディレクトリ内の任意名のCGIスクリプトを使用できます。:
MOUNT ="/xxx/* cgi:/path/of/cgi-bin/*"
例) DeleGateをCGIプログラムとして使う
DeleGateを、HTTPサーバからのCGIプログラムとして使用できます。例)以下のように、HTTPサーバ(A)の"httpd.conf"ファイル中で指定する。
Exec /other/*
/path/of/cgi-delegate 次に、以下のような内容のファイル/path/of/cgi-delegateを書きます:
#!/bin/sh
delegated -Fcgi
MOUNT ="/-* =" \
MOUNT ="/www2/* http://wwwserv2/*" \
MOUNT ="/news/* nntp://newsserv/*"
これは、/other/www2/(HTTPサーバ"wwwserv2"の内容)と、/other/news/(NNTPサーバ"newsserv"の内容)を含む、擬似サブツリー"/other/"をサーバ(A)に追加します。
HTTP 伝送ログ書式
HTTPプロトコル用PROTOLOGフォーマットは、PROTOLOG="LogFilename :format "として、LogFilename
の後にポストフィックスした、オプションの指定書式により、変更できます。この場合、デフォルトのファイル名は省略できます。例)PROTOLOG =":%X"の指定は、NCSAライクの拡張コモンログファイル書式を作ります。デフォルトの書式は、PROTOLOG=":%C
%D"です。
%C
-- CERN-HTTPDのコモンログファイル書式
%c
-- ミリ秒解像度を持った日付を除き、%C と同じ
%D
-- DeleGateによる拡張
(connTime +relayTime :status )
%X
== '%C "%r" "%u"' Referer と
User-Agent付きのコモンログファイル書式
%r
-- 要求メッセージ中のReferer フィールド
%u
-- 要求メッセージ中のUser-Agent フィールド
%S
-- サーバへのCONNECT ステータス (c,m,p,d,s,v)
%Cにおける、クライアント情報部は、ホスト名,Ident,および、ユーザ名が、デフォルトで記録され、AUTH="log:"パラメータで、変更できます。
HTTPCONF parameter == what :conf
-- default: welcome.dgp ,welcome.shtml ,welcome.html,...
welcome:listOfWelcomeFiles
-- default: welcome.{dgp,shtml,html,cgi},index.{dgp,shtml,html,cgi},-dir.html
インデックスファイルか、"/path/"のように"/"で終わるディレクトリのURLのために使わなければならない、CGIスクリプトのリスト。これは、ファイル名の候補リストです。リストは"-dir.html"で終了することができ、これは、内臓インデックスジェネレータを意味します。リストが空の場合、空データが、インデックスデータの代わりになります。
search:pathOfSearchScript
-- default: none
"/path?search"のようなサーチ部をともなうURLに利かせるCGIスクリプトのパス。これは、全てのURLに利かせる全体的な設定です。また、このように、それぞれのMOUNTポイントに対して、ローカルな検索スクリプトを指定できます。
MOUNT ="/path2/* /root/of/path2/*
search:srcipt2". この、ローカルな設定は、全体的なものに優先します。特殊ローカル設定"search:-"で、MOUNTポイントに対する全体的な設定を無視できます。
methods:listOfAcceptableMethods
-- default: methods:OPTIONS,GET ,HEAD ,POST ,PUT ,... -- LOGFILE
に書かれたログ(HTTPCONF=methods:"+") を参照して下さい。 許可するHTTP機能を制限/追加する
例)
ver:1.0
HTTP/1.0 クライアント/サーバとして動作
svver:1.0
HTTP/1.0 サーバに対して、クライアントとして動作 (HTTP/1.0 で、要求を送信)
clver:1.0
クライアントに対して、HTTP/1.0 サーバとして動作
(応答中で、chunked エンコードを使用しない)
tout-wait-reqbody:period [30]
要求ボディ内の最初のデータを待つ最大値
tout-in-reqbody:period [15]
要求ボディ内の次のデータを待つ最大値
(クライアントサイドでの遅いフィルタプログラムのため、調整できます)
tout-cka:period [5]
クライアントの接続を確保する最大値
(タイムアウトは、それぞれのクライアントホストからの最初の接続のため10倍長くなっています)
max-cka:number [10]
キープアライブ中の単一ホストからのリレー要求の最大値
(それぞれのクライアントホストからの最初の接続に対しては10倍の値が提供されます)
max-ckapch:number [4]
クライアントホスト単位でのキープアライブ中接続の最大数
max-reqline:length [4k]
許容する要求文字長の最大値
max-reqhead:length [12k]
許容する要求ヘッダ長の最大値
max-gw-reqline:length [512]
他のプロトコルの他のサーバに転送する要求文字長の最大値
max-hops:number [20]
HTTPプロキシチェーンの最大ホップ数
tout-resp:period
[TIMEOUT=io ]
サーバからの応答待ち時間の最大値
xferlog:ftp
xferlog フォーマットでもFTP/HTTP処理を記録する
例)
HTTPCONF =search:/path/of/searchScript
MOONT ="/bin/* cgi:/path/of/cgi-bin/* search:-"
MOUNT ="/* file:/path/of/data/*"
FILETYPE parameter == suffix :gopherType :altText :iconName :contentType
-- default: FILETYPE =".txt:0:TXT:text:text/plain"
FILETYPE =...
ファイル名を、content-typeマッピングに定義
gopherType :
0 - text,
1 - directory,
4 - BinHex,
6 - uuencode,
9 - binary,
g - gif,
I - image,
...
altText :
テキストのみディスプレイ内の、アイコンイメージに対して表示するテキストを選択(<IMG ALT ="altText " ... >のように、HTMLテキスト中に埋め込まれた、IMGタグ)。
iconName :
binary, binhex, compressed, directory, document, ftp, gzip, image,
index, index2, movie, sound, tar, telnet, text, unknown, uu (see http://delegate /-/builtin/icons/) の内1つ。
contentType :
text/plain, image/gif, ... (RFC2045 参照)
例)
CGIENV parameter == CIGENV =name [,name ]*
-- default: CGIENV ="*"
Http-DeleGate の MountOptions
条件:
asproxy
DeleGateが、プロキシサーバとしてコールされた場合(完全なURL書式で要求されたURL)に、真。
withquery
要求されたURLが、 "?query "部を持つ場合、真。 制御:
moved
HTTPで、 "302 Moved"応答が返った場合以外、中継しない
useproxy[=proxyURI ]
"305 Use
Proxy"応答メッセージを生成。proxyURIが省略されるか、"direct"が与えられる場合、応答メッセージは、"Set-Proxy: DIRECT"として、 Set-Proxyフィールドをともなって送信されます。
他の場合、URIは、フィールド中に"Set-Proxy: SET; proxyURI=proxyURI"で、セットされます。
rcode={301|302|305|306|403|404}
指定したステータスコードの応答を返す。エラーメッセージをカスタマイズするとき有効です。
robots={no|ok}
ロボットによる検索の許可・不許可。NNTPとFTPでは、デフォルトは"no"で、他のプロトコルでは、"ok"です。
genvhost=host
サーバに転送される要求メッセージ中の "Host: host "フィールドをセット。
ftosv=-cc-charCode
サーバに転送されるHTTPヘッダのキャラクタセットを charCode (jis|sjis|euc|utf8)に変換する。
例)
"useproxy", "method", "dst", "withquery"
オプションは、元々、潜在的に厄介なアクセス(対象サーバのCGIプログラムを呼出すような)を拒否するために取り入れられました。例)POSTメソッドをともなう要求、または、"?"をともなうURLを、拒否する。:
MOUNT ="http:* = method=POST,asproxy,useproxy"
MOUNT ="http:* = withquery,asproxy,useproxy"
HTTP-DeleGate の
AUTH パラメータ
ユーザによるDeleGateの構成
DeleGateを構成する場合、柔軟に、それは、DeleGate管理者だけではなく、ユーザも行えるように、
(WWWリソース(元HTTP-DeleGate上の)提供者)DeleGateは、ユーザが設定した、構成パラメータを、
要求プロセス時毎に読むことをサポートしています。
そのパラメータは、MOUNTされたローカルファイルシステム上の、
"+=parameters" ファイルフォーマットで、
拡張子に".dgp"を持つファイルによって与える必要があります。
それは、-Fcgi と同様に動作し、
新しいプロセスを生成しないでに、効率を上げます。
例)
ニュースサーバN を、http://delegate /news/servN /にMOUNTする
(1) 起動時のパラメータによる
MOUNT ="/news/servN /* nntp://nntpserverN /*"
(2) CGI-DeleGateによる
MOUNT ="/news/* cgi:/dirPath /*"
[the contents of file:/dirPath /servN /welcome.cgi]
delegated -Fcgi MOUNT ="/* nntp://nntpserverN /*"
(3) ".dgp" ファイルによる
MOUNT ="/news/* file:/dirPath /*"
[the contents of file:/dirPath /servN /welcome.dgp]
MOUNT ="/* nntp://nntpserverN /*"
(この機能は、FTPのような他のプロトコルに適用するべきです...)
SHTMLファイルでのサーバサイドの実装(SSI )
元HTTP-DeleGateで、接尾辞".shtml"のつくローカルファイルは、
HTMLファイルとは、サーバサイドの実装 (SSI )のための特別なタグが含まれるのを除き、
".html"のつくファイルのように扱われ、METAは、クライアントに送信される前に、
HTTP-DeleGateによって、理解され、置換されます。
SSI タグ
<!--#echo var="varName " -->
varName で指定された値で置換されます。
varName は、以下のような、
"REMOTE_HOST " または、"HTTP_SERVER "
と同様な、任意のCGI互換名です。
<!--#include virtual="URL " -->
"virtual"属性で指定されたデータに置換されます。
"virtual" は、"proto ://server /upath "のような完全なURLまたは、
"/upath " のような部分URLとでき、http://delegate /upath として、
解釈されます。
"/"で始まらない"upath "のような相対URLは、shtmlファイルの
ベース(カレント)に対する相対として、解釈されます。
<!--#fsize virtual="URL " -->
<!--#flastmod virtual="URL " -->
それぞれ、指定したデータのサイズまたは、最終更新時間で、置換されます。
<!--#config timefmt=timeFormat -->
"#echo","#flastmod"などによって生成される時間文字列の書式を、
strftime(3)互換の書式で指定します。
(default: timefmt="%a, %d %b %Y %H:%M:%S %z")
META タグ
<META HTTP-EQUIV=fieldName content="filedBody ">
HTTP応答メッセージに"fieldName : fieldBody "ヘッダを生成します。
fileBody 内の以下のパターンは、前記のものとして、置換されます。
${varName } or
<!--#echo var=varName -->
${flastmod:URL } or
<!--#flastmod virtual=URL -->
${fsize:URL } or
<!--#fsize virtual=URL -->
${include:URL } or
<!--#include virtual=URL -->
例)
<META HTTP-EQUIV=Status content="200 OK">
<META HTTP-EQUIV=Content-Type content="text/html">
<META HTTP-EQUIV=Pragma content="no-cache">
<META HTTP-EQUIV=Date content="${DATE_GMT}">
<META HTTP-EQUIV=Last-Modified content="${flastmod:URL}">
ICP プロキシ/サーバ
ICPCONF parameter* == ICPCONF ={icpMaxima |icpConf }
icpMaxima == para:N |hitage:N |hitobjage:N |hitobjsize:N |timeout:N
icpConf == icpOptions :ProtoList :dstHostList :srcHostList
-- default: ICPCONF =para:2,hitage:1d,...
DeleGateをICPサーバ(SERVER=icp)として動作させる場合の、ICP設定
para:N
-- 並列ICP-DeleGateサーバ数 [2]
hitage:N
-- HITとして通知する、キャッシュデータの有効期限 [1d]
hitobjage:N
-- HIT_OBJ似よって送信される、キャッシュデータの有効期限 [1h]
hitobjsize:N
-- HIT_OBJによる、キャッシュデータの最大容量 [1024](bytes)
timeout:N
-- 応答待ちタイムアウトのデフォルト値 [2.0](seconds)
debug:N
-- デバッグ用ログレベル [0]
FTPCONF parameter* == FTPCONF =ftpControl [:{sv|cl}]
ftpControl == nopasv | noxdc | rawxdc
-- default: none
nopasv
データ接続の PASV コマンドを使用不可とする。
noxdc
制御接続で、データ伝送の XDC モードを使用不可にする。
rawxdc
XDC モードにおいて、伝送データをBASE64エンコードしない。
ftpControl に "nopasv:sv" のように ":sv" または ":cl" がつづく場合、
例えば、ftpControl は、それぞれ、サーバ側、または、クライアント側のみに
適用されます。
FTP プロキシ/サーバ
internal % ftp
ftp> open firewall 8021
220- firewall PROXY-FTP server (DeleGate/6.1.0) ready.
220- @ @
220- ( - ) { DeleGate/6.1.0 (February 3, 2000) }
...
220- --
220- You can connect to a SERVER by `user' command:
220- ftp> user username@SERVER
220- or by `cd' command (after logged in as an anonymous user):
220- ftp> cd //SERVER
220- Cache is enabled by default and can be disabled by `cd .' (toggle)
220- This (proxy) service is maintained by 'admin @your.domain '
220
Name (yourhost:yourname): ftp@ftp1
331-- USER for ftp@ftp1.
220- ftp1 FTP server ready .
331- Guest login ok, send your complete e-mail address as password.
331-- @ @
331 \( - )/ -- { connected to `ftp' }
Password: me@my.domain
230 Guest login ok, access restrictions apply.
ftp> cd //ftp2
250-- CWD for ftp@ftp2
220- ftp2 FTP server ready .
230- Guest login ok, access restrictions apply.
250-- @ @
250 \( - )/ -- { connected to `ftp2' }
ftp>
注記:大抵のftpクライアントは、以下のように、コマンドラインで、FTPのポート番号を指定可能です。
internal % ftp firewall 8021
例) カスケード FTP-プロキシ
例) フィルタ/マージ/エイリアスをともなう、FTP
MOUNT
firewall # delegated -P21 SERVER =ftp://serv1/ \
MOUNT ="/pub2/* ftp://serv2/pub/*"
このDeleGateは、serv1の全ての内容を中継し、"/pub2/*"は、ftp://serv2/pub/* のそれと置換えられた部分が除外されます。
例) FTP to LPR (Line Printer Daemon Protocol) ゲートウェイ
MOUNT ="/* lpr://printer0/qname0/*" MOUNT ="/pr1/*
lpr://printer1 /qname1/*" MOUNT ="/pr2/*
lpr://printer2 /qname2/*"
LPR/FTP-DeleGateは、FTPクライアントがリモートプリンタにアクセスできるようにします;
ファイルの印刷は、FTPのファイルアップロードによって行われ、
プリンタステータスは、FTPディレクトリリストで見ることができます。
MountOption "readonly"は、ステータス閲覧を禁止します。
例) 元FTP-DeleGate
host# delegated -P21 SERVER =ftp MOUNT ="/* /path/of/root/*"
元FTP-DeleGateこのケースでの、ファイルへの書込みは、
デフォルトで禁止されます。書き込みが必要な場合、
MOUNT ="/xxx/* /yyy/* rw"のように、MOUNTポイントに対し、
マウントオプションとして、"rw" (read/write)を指定する必要があります。
全コンテンツはの取込動作は、指定ディレクトリ 内に行われ、
"RETR directory .tar" コマンドによって、
tarフォーマットの単一ファイルとして返されます。
この機能を有効にするには、REMITTABLE="+,tar"のように、
REMITTABLE リストに、"tar" を追加します。
FTP 伝送ログ書式
FTPプロトコルのPROTOLOG書式は、xferlog (5)と呼ばれる、
"wu-ftp"コンパチブルなものです。xferlogにおける各行は、以下の要素(1行に)を含みます。
currentTime transferTime clientHost
fileSize fileName transferType
specialActionFlag direction accessMode
userName serviceName authenticationMethod
authenticatedUserID
DeleGateStatus
transferTime は、秒で表される、トータル伝送時間です。
transferType "a" (アスキー) または、"b" (バイナリ)のどちらかです。
specialActionFlag は、現実装では、常に "_" (none) です。
direction は、"o" (outgoing) または、"i" (incoming)のどちらかです。
accessMode は、"a" (anonymous)または、 "r" (real user)のどちらかです。
userName は、e-mail アドレス(accessMode "a")
または、存在するユーザ名(accessMode "r")のどちらかです。
serviceName 現実装では、常に"ftp"です。
authenticationMethod は、"0" (none) または、
"1" (RFC1413 Authentication)のどちらかです。
authenticatedUserID は、 authenticationMethod
によって得られたユーザID、または "*"(認証なし)のどちらかです。
DeleGateStatus は、"L" (local file), "H" (cache hit), "N" (cache miss)のどれかです。.
例)
Mon Feb 28 15:32:15 2000 13 proxy.xyz.co.jp
182558 /ftp/pub/DeleGate/Manual.htm a _ o a
webmaster@xyz.co.jp ftp 0 * L
Telnet プロキシ/サーバ
internal % telnet firewall 8023...
-- @ @ firewall PROXY-telnet server DeleGate/6.1.0
-- ( - ) { Hit '?' or enter `help' for help. }
...
-- -- -- This (proxy) service is maintained by 'admin @your.domain '
>> Host name: exthost
-- Connected to exthost.
SunOS UNIX (exthost)
login:
例) 元 Telnet-like server
C:\> delegated -P23 SERVER =exec XFIL =command.com
WORKDIR ="/" // Windows95/98
command.com を使った、簡単なテルネットサーバ。
POP プロキシ
例) プロキシ POP-DeleGate
firewall # delegated -P110 SERVER =pop
external % telnet firewall pop
+OK Proxy-POP server (DeleGate6.1.0) at firewall starting.
USER username @servername
...
USER username %servername is also available.
例) POP MOUNT
"pop://user @server "
は、内部的に、"pop://server /user " として表現され、以下のようにMOUNTで制御されます:
MOUNT ="//* =" ... サーバがユーザによって指定された場合、書換えしない MOUNT ="*
pop://defaultHost /*" ... デフォルト POP サーバを指定 MOUNT ="user1
pop://host1/*" ... "user1"のサーバを "host1"にする MOUNT ="//pop2/*
pop://host2/*" ... 実ホスト名 "host2"を隠す
例) NNTP サーバから POP
クライアントへのゲートウェイ
例) POP サーバから HTTP
クライアントへのゲートウェイ
firewall # delegated -P80 MOUNT ="/mail/*
pop://mailHost /*"
このDeleGateは、POPサーバ(デフォルトでmailHost
にある)のメールボックスを、HTTPクライアントに提供します。クライアントが、"http://firewall /mail/ "にアクセスするには、HTTPの認証情報として、mailHost
にあるPOPサーバのUsernameとPasswordを入力するように要求されます。Usernameが、"user @mailHost2 "の場合、mailHost
ではなく、mailHost2 が対象POPサーバとしてアクセスされます。Hostサーバユーザのそれぞれのメールボックスは、
"http://firewall /mail/+pop.User.Host"になり、URL中にUserとHostを直接指定できます。
IMAP プロキシ
SMTP プロキシ/サーバ
例) プロキシ SMTP-DeleGate
// エイリアスとフィルタ
firewall # delegated -P25 SERVER =smtp://mail-server/
\
MOUNT ="foo@bar smtp://foo2@bar2" \
MOUNT ="* smtp://-"
SMTPCONF parameter == SMTPCONF =what :conf
-- default: SMTPCONF =bgdatasize:64K
nohelo
"HELO" を言わない行儀の悪いクライアントを許可する。
bgdatasize:N
データが N バイトより大きい場合、バックグラウンドでリレーします。
これは、"DATA" コマンドを投げた後に、サーバからの "QUIT" コマンド応答を待たない
クライアントをリレーするための手段です。
注)DeleGate はスプールや、転送機能を持たないので、1つのメールデータのみをバックグラウンドで
リレーできますが、伝送終了前に DeleGate がクラッシュした場合、メールは失われます。
SMTPGATE parameter == SMTPGATE =dirPath
-- default: SMTPGATE ='${ETCDIR}/smtpgate'
NNTP プロキシ/サーバ
MOUNTは、NNTP-DeleGateに対して、ニュースグループのフィルタとエイリアス、複数NNTPサーバのマージ応用することもできます。
例)MOUNT="alias-group. nntp://server/group."は、"group.*"へ通過し、また、それらに"alias-group.*"の別名を与えます。簡単なフィルタ指定は、SERVER="nntp://server/group."で、
MOUNT ="= nntp://server/group."と同じです。複数のNNTPサーバに対して、複数MOUNTした場合、DeleGateは、複数サーバの複数ニュースグループをマージし、それらが、単一サーバ上に存在するかのようにクライアントにニュースグループを提供します。
例) フィルタ
# delegated -P119 SERVER =nntp://nntpServer /group .
ニュースグループ名が"group .*"のパターンを持つ場合のみ中継する。nntpServer に対するグループリストは
"nntp://nntpServer /group1 .,group2 .,..."のように指定できます。
例) 複数の NNTP サーバをマージ
# delegated -P119 SERVER =nntp \
MOUNT ="= nntp://server1 /"
MOUNT ="= nntp://server2 /"
例)複数のNNTPサーバを認証付(AUTHINFOを使用)でマージ
# delegated -P119 SERVER =nntp \
MOUNT ="= nntp://user1 :pass1 @server1 /"
MOUNT ="= nntp://user2 :pass2 @server2 /"
例) 選択したグループをマウント
// グループ group.* をオリジナル名のままでマウント
MOUNT ="= nntp://server1 /group."
// グループ group.* をエイリアス名 "alias-group.*" でマウント
MOUNT ="alias-group. nntp://server1 /group."
例) POP サーバから NNTPクライアントへ
// メールスプールをニュースグループ名 "+pop.user.host"としてマウント
# delegated -P119 SERVER =nntp
MOUNT ="= pop://user :pass @host /"
例) NNTP サーバから HTTP クライアントへ
# delegated -P80 MOUNT ="/news/* nntp://nntpServer /*"
例)元 NNTP-DeleGate
# delegated -P119 SERVER =nntp://-.-/
NNTP-DeleGateのSERVERパラメータ中の対象サーバに"-.-"を指定すると、DeleGateを元NNTPサーバとして使うことを意味し、それの持つスプールに検索/投稿できます。の新たなニュースグループ名
newsGroup を作るには、空ファイルを作ります。
'${ETCDIR}/news/groups/newsGroup '
既存の"/path/of/MH-folder"をnewsGroup
として中継するには、上記のようにファイルを作り、このような内容で埋めます。
0 0 0 0 /path/of/MH-folder (4つのゼロの後に、MH-folderのパスをつける)
投稿された記事の最初の行が、"From user date "のようなUnix-Fromを持つか、
"Unix-From: user date "ヘッダを持つ場合、記事の記事番号は、"X-Seqno"
(または、"X-Sequence")ヘッダが存在する場合、
固有のものにセットされ、スプールファイルの作成日付は、Unix-formのdate にセットされます。 NNTPのMountOptions
hide={GroupList }
クライアントから隠す、ニュースグループ名パターンリスト 例) "hide={alt.*,!alt.comp*}"
cache=no-article
ARTICLE キャッシュを停止
cache=no-list
LIST キャッシュを停止
upact:Invoke /Reload /Posted
LIST(active list)のキャッシュ更新を制御。同じ意味の、NNTPCONF=upact:Invoke /Reload /Posted
は、このMOUNTパラメータの対象サーバのみ、制御が除外されます。
NNTPCONF parameter* == what :conf
-- default: NNTPCONF =upact:600/300/120
pathhost:Server /PathHost
物理Server ホストの論理PathHost 名を定義します。 例)
NNTPCONF ="wall.etl.go.jp/delegate.org"
upact:Invoke /Reload /Posted
アクティブなリストのキャッシュ更新を制御します。nvoke と Reload
は、キャッシュの有効期限を秒で指定します。DeleGate経由で記事がポストされた後、Posted
に指定した期間内で、クライアントがチェックしたとき(LISTコマンドで)に、キャッシュが更新されます。
overview.fmt:{FieldList }
default --
overview.fmt:{Subject,From,Data,Message-ID,References,Bytes,Lines}
DeleGateによって生成される、XOVER応答書式
xover:Number
default -- xover:2000 "XOVER range "での最大記事数の制限
nice:Number
指定した場合、nice値をセット
auth:{srcHostList }
クライアントがsrcHostList に含まれる場合、NNTPセッションを開始するときに認証(AUTHINFOコマンドを使用)を強制ます。このパラメータは、NNTPサーバが、ユーザのサブセットに対する認証を行うときと、このDeleGateが、NNTPキャッシュを行う場合、セットする必要があります。
server:host [:port ][/grouplist ]
URL nntp://*/... または news:...によるHTTP要求に対する、NNTPサーバをセットする
nntpcc:Number
default -- nntpcc:1 "nntpcc:0"指定で、NNTP "connection
cache"を停止します
LDAP プロキシ
Whois プロキシ
例) プロキシ Whois-DeleGate
firewall # delegated -P43 SERVER =whois
internal % whois -h firewall
"whois://whois.nic.ad.jp/help"
X プロキシ
例)単一ホスト上のディスプレイに中継
x-server % xhost firewall
firewall % delegated -P6008 SERVER =X://x-server
internal % xterm -display firewall :8
例)単一サーバホスト上の2つのディスプレイに中継
firewall % delegated -P6002-6003 SERVER =X://x-server:-6002
例)2つのサーバホストに中継
firewall % delegated -P6011-6012 \
SERVER =X://x-server1:-:{*:6011} \
SERVER =X://x-server2:-:{*:6012}
Gopher プロキシ
SSL プロキシ
FCL , FSV , CMAP パラメータで、フィルタプログラム
"sslway "を使用し、クライアント側と/かサーバ側の通信をSSLプロトコルでラップできます。このフィルタを使うには、sslwayと、適切なPEMファイル(LIBPATH(通常
DGROOT/lib)内に配置)が必要です。詳細はhttp://www.delegate.org/delegate/ssl/
を参照して下さい。
例) SSLサーバ・非SSLクライアント間を中継
例) SSLクライアント・非SSLサーバ間を中継
DNS (Domain Name System) プロキシ/サーバ
DNS-DeleGate サーバは、ホスト名情報をDNS,NIS,ローカルファイルを含めて、
収集し、リレーします。
A, PTR , SOA 及び 単純化された MX のみに制限された、
リソースレコードタイプを提供します。
SOA レコードは、
DNSCONF 設定の情報と共に構成されます。
例) {NIS,FILE ,DNS}/DNS ゲートウェイ
hostname のための MX レコード は、与えられた場合、
-MX.hostname ( 以下の例のように)または、
hostname のための A レコードが使用されます。
複数の MX レコード間の優先順位は、現実装では表現できません。
例)HostB の MX として、HostA の hosts テーブルを使用する。
10.1.2.3 hostA
10.4.5.6 hostB, -MX.hostA
DNSCONF parameter* == what :value
DNS-DeleGateサーバの構成を指定します
para:N -- 並列サーバプロセス数 [2]
domain:FQDN -- [DeleGateホストのドメイン名]
origin:FQDH -- [DeleGateホストのホスト名]
admin:Email -- 管理者のメールアドレス [ADMIN]
mx:FQDH -- [存在する場合、-MX.host のプライマリホスト名、または、自身による host 問い合わせ]
serial:N -- シリアルナンバ [最終変更時の %Y%m%d%h ]
refresh:period -- リフレッシュ間隔 [6h]
retry:period -- リトライ間隔 [10m]
expire:period -- 有効期限 [14d]
minttl:period -- 最小 ttl [6h]
CU-SeeMe プロキシ
例) プロキシ CU-SeeMe-DeleGate
firewall % delegated -P7648 SERVER =cuseeme://Reflector/
INTERNAL # delegated -P7648 SERVER =cuseeme://firewall /
internal %
{firewall または INTERNAL を
リフレクタのproxy-reflectorとして使用}
予約名
特殊名"-"と"-.-"を、URLの"host :port "部に使用したとき、DeleGateのホストとポートを意味します。また、URL
"http://-.-/-/"は、DeleGateの制御ページの入り口として、予約されています。
カスタマイズ
アイコンとメッセージを含む、DeleGateのビルトインデータソースは、ソースコードディレクトリ"src/builtin/*"にあります。それらは、DeleGateの実行ファイルにまとめられ、リソースとして、URL
"http://delegate /-/builtin/*"でDeleGate実行時にアクセスできます。これらデータは、それらのMOUNTを定義することで、DeleGateをコンパイルせずに置換えられます。例)アクセス禁止で返るエラーメッセージは、"http://delegate /-/builtin/mssgs/403-forbidden.dhtml"にあり、それは、このように、MOUNTパラメータで、置換えられます:
MOUNT ="/-/builtin/mssgs/403-forbidden.dhtml
/tmp/forbidden.dhtml" この例で、MOUNTは、forbiddenメッセージと、代用データ("/tmp"内のローカルファイル)のみ置換えます。しかし、大抵の場合、ビルトインデータグループは、ワイルドカード(*)記号で、置換えられ、また、代用データは、HTTPやFTP経由でアクセス可能なリモートホスト上に配置できます。例)全ての、"src/builtin/"のコピーを"http://yourwww/delegate/builtin/"に入れ、このようにMOUNTする:
MOUNT ="/-/builtin/*
http://yourwww/delegate/builtin/*" リモートデータの読込みは、MOUNTされたビルトインデータが、キャッシュされ、一般のデータとして再利用されるキャッシュが有効な限り、オーバヘッドの影響を受けません。
アタッカー防御
SIGSEGV や
SIGBUSのような致命的信号が発生した後、DeleGateは、クライアントホストへのサービスを直ちに停止します。の発生は、致命的エラー発生の原因は、エラー前に、侵入の試みが失敗したサインととらえることもできます。同時に、事象を通知するため、DeleGateは、ADMINパラメータの名前の管理者にレポートメールを送信します。
アタッカーのもっとも典型的な手段は、スタック上のバッファオーバーフローで、存在するアドレス上にターゲットバッファが存在していることを期待しており、スタックアドレスをランダマイズすることは、アタック成功の糸口を減少するのに効果的です。そして、アタックの失敗は、致命的エラーを発生させ、DeleGateにより、捕獲されます。
疑わしいクライアントホストは、関連ファイル(ADMDIR/shutout/
内)を削除するか、TIMEOUT=shutout(デフォルト30分)でファイルの有効期限が切れるまで、シャットアウトされます。安全のため、TIMEOUT="shutout:0"(無限)が、望ましく、アタッカーに2度とチャンスを与えないようにしましょう。しかし、致命的エラーは、DeleGateのいつものバグで発生するほうが高く、デフォルト値を扱いにくくしています...
とにかく、以下のオプションを承知し、アクセス制御 設定はもちろんのこと、このような攻撃を防ぐよう意識を高く持ってください。
TIMEOUT =shutout:N [30m] ... アタック再試行間隔の最短
MAXIMA =randstack:N [32] ... スタックアドレスのランダム化
MAXIMA =randenv:N [1024] ... 環境変数のランダム化
MAXIMA =randfd:N [32] ... クライアントソケットディスクリプタのランダム化
CHROOT =dirPath ... アクセス可能なファイル空間を制限
OWNER =user [nobody] ... DeleGateプロセスの能力を制限
ADMIN =E-mail-address ... 正しく、SMTP配送できること
-Tx [off] ... execve() システムコールを停止
起動時、元環境変数と、スタック領域上のコマンドライン引数は、ヒープ領域に移動・消去され、アタッカーの侵入コードに利用されないようになっています。同時に、ランダムな長さの値(MAXIMA=randenvが最大)を持つRANDENV
ダミー環境変数が、環境変数のランダムなアドレスに挿入され、フィルタプログラムや、CGIプログラムのような子プロセスに継承されます。
プラットフォームに関する詳細
Unix
Inetdからの呼出し
"nowait" と
"wait"ステータスをinetd.confで指定可能です。"nowait"ステータスの場合、DeleGateは、1つの要求(セッション)を処理し、終了し、無効にします。"wait"ステータスの場合、DeleGateは、複数の要求を処理します;要求数の最大は、"MAXIMA =service:N "のNによって制限できます。
Windows
サービスとして開始
WindowsNT/2000上で、DeleGateは、デフォルトで、自動的にサービスとして開始(バックグラウンドプロセスとして)します(コマンドプロンプトで、-vや、-fオプションなしで呼出した場合)。-Pxxxx
オプションで、サービスとして動作しているDeleGateを停止かつ/または除去するには、コマンドプロンプトで、"delegated
-Pxxxx "を入力し、DeleGateからの簡単な質問に答えてください。Windows95/98上では、DeleGateは、フォアグラウンドプロセスとしてのみ動作します。
CYGWIN
呼出した管理者所有で見えます。
OS/2
インストールには、オプションのループバックデバイス(localhost)が必要です。
紳士的再起動
子プロセスの外向けセッションを中止せず、DeleGateのプロセスIDを変更せず、入力ポートなどのリソースを保持したまま、DeleGateプロセスにSIGHUPシグナルを送信し、優しくDeleGateを再起動します。プラットフォームに属さない方法は、このように、-Fkill 機能を使用することで行えます。
delegated -Fkill-hup -Pport また、SIGHUPでの再起動は、
AUTH=admin
パラメータを使い、"http://delegate /-/admin/"にて、リモートHTTPクライアントで、実行できます。
再起動は、DeleGateの設定変更した後に行います。再起動時にパラメータを再読込するためには、
+=parameters
表記(パラメータ置換)を与える必要があります。他のオプション(パラメータ)は、コマンドライン引数で与え、これは、リスタートしたDeleGateプロセスに継承されます。
他の再起動目的は、ごみや、リーク(ヒープメモリや、ファイルディスクリプタ)を、お掃除します。この目的の場合、DeleGateは
TIMEOUT=restart
または、CRONパラメータの
-restart 動作で、それぞれ予定した時間に、周期的に再起動できます。
機能オプション
-Ffunction
オプションが与えられる場合、DeleGateは、指定した機能を実行するために動作し、通常は、特定プロトコルのクライアント側の動作をします。長い
"delegated -F"入力をファイル名
"function "をDeleGate実行ファイルに与えることで省略でき、function としてコールできます。
function 名のマッチは、case-insensitive です。
例) レゾルバとしてDeleGate を使う
% delegated -Fresolvy www.delegate.org
% ln -s delegated Resolvy
% Resolvy www.delegate.org
以下は主要機能の一覧です。
-Fhelp
使用可能な機能を表示
-Fkill[-hup] -Pport
SIGTERM(SIGHUP)を送り、DeleGateを終了(再起動)
-Fcgi [DeleGateOptions ]
任意のHTTP サーバCGIプログラムとして動作
-Fconnect host port [/udp] [XCOM=clientCommand ]
テルネットクライアントのように、指定したhost :port に接続し、それから/へ標準入出力を中継する
-Fresolvy {[-MX.]hostname |
IPaddress [-num ]}
nslookup(8)のように、与えられたホスト名や、IPアドレスを解決する。(10.10.10.1-128のようにレンジ指定可)
-Ffindu [-atime N ] [-ls] [-du] [-rm] ... [dir ]*
find(1)のように、ファイルを探し、指定した動作を行う。使用法は "delegated -Ffindu"のようになります。 例)
"du(1)"といっしょに、"find . -ls"を実行
delegated -Ffindu -ls -du
-Fdget [-h] [-o] [PROXY=host :port ] URL
URL で指定したリソースをダウンロードし、"-o"オプションで、標準出力に出力
"-h" オプションをともなう場合、HTTP応答メッセージのヘッダ部も出力されます。
-Ficp [-h server ] URL
ICPクライアントとして動作。使用法は、"delegated -Ficp"のようになります。
-Fsched {"crontabSpec " |
crontabFile | schedSpec }*
cron(8)のように、指定した動作を指定したタイミングで起こす。 例) 15分ごとに動作
delegated -Fsched "0,15,30,45 * * * *
/bin/date" schedSpec は、スケジュール設定の正規化表記です。
schedSpec ==
Wday :year :month :mday :Hour :Min :Sec :action 例)15秒ごとに動作
delegated -Fsched "*:*:*:*:*:*:0,15,30,45:/bin/date"
-Fmd5 [infile ]
入力データの MD5 ダイジェストを出力
ファイル
参考文献
du(1),
ps(1),
tee(1),
cat(1),
find(1),
chroot(2),
execve(2),
getpeername(2),
getsockname(2),
pstat(2),
ptrace(2),
setgid(2),
setuid(2),
umask(2),
scanf(3),
strftime(3),
system(3),
YP(4),
crontab(5),
hosts(5),
inetd.conf(5),
cron(8),
inetd(8),
nslookup(8),
DNS(RFC1034 ),
FTP(RFC959 ),
Gopher(RFC1436 ),
HTML(RFC1866 ),
HTTP(RFC2068 ),
ICP(RFC2186 ),
Ident( RFC1413 ),
IMAP(RFC2060 ),
LDAP(RFC1777 ),
LPR(RFC1179 ),
MIME(RFC2045 ),
NNTP(RFC977 ),
POP(RFC1460 ),
Socks(RFC1928 ),
SMTP(RFC821 ),
Telnet(RFC854 ),
URI(RFC2396 ),
URL(RFC1738 ),
Wais(RFC1625 ),
X(RFC1013 )
著者
@ @
( - )
_< >_
Yutaka Sato <ysato@etl.go.jp>
Electrotechnical Laboratory (AIST ,MITI ), Tsukuba, Ibaraki 305-8568, Japan
配布
リリース 7.1.2 最終更新: 2001年3月10日
--------- --------- --------- --------- --------- --------- --------- ---------