#topicpath RIGHT:EBUG 第32回会合 RIGHT:2009年11月21日、万代市民会館 RIGHT:川俣吉広、kaw@on.rim.or.jp *DeleGateとは [#e8b1f8e9] -アプリケーションレベルゲートウェイ (プロキシサーバ) --HTTP, FTP, Telnet, NNTP, SMTP, POP, IMAP, LPR, LDAP, ICP, DNS, SSL, Socks ... etc --プロトコルを変換する機能ももっている --とにかくなんだか色んな機能がついてる ... かなり kitchen sink approachなソフト -日本製 --産総研の佐藤豊氏が開発 ... http://www.delegate.org/ ---since 1994, Current Ver. DeleGate 9.9.5 --日本語の情報サイト(マニュアルの日本語訳あり) ... http://i-red.info/ (鈴木 雄氏) *Getting Started [#x92d4b90] **取得 [#c76e2da5] http://www.delegate.org/delegate/download/から取得。~ 使用条件は以下のとおり; >Copyright (c) 1994-2000 Yutaka Sato <ysato AT etl.go.jp> <y DOT sato AT delegate.org> ~ Copyright (c) 1994-2000 Electrotechnical Laboratory (ETL), AIST, MITI ~ Copyright (c) 2001-2008 National Institute of Advanced Industrial Science and Technology (AIST) ~ AIST-Product-ID: 2000-ETL-198715-01, H14PRO-049, H15PRO-165, H18PRO-443 ~ ~ Permission to use this material for evaluation, copy this material for your own use, and distribute the copies via publicly accessible on-line media, without fee, is hereby granted provided that the above copyright notice and this permission notice appear in all copies. AIST makes no representations about the accuracy or suitability of this material for any purpose. it is provided "as is", without any express or implied warranties. (Manual.htmより引用) >本マテリアルの、評価のための使用 / 自らが使用するための複製 / 誰もがアクセス可能なオンラインメディアを経由した複製の無料配布は、上記の著作権通知、および、この認可通知を、全ての複製中で、閲覧可能なことを条件として許可します。 AISTは、本マテリアルのあらゆる目的に対する、正確さや、適合性に関する表示をしません。それは、いかなる、明示、または、暗示された保証がともなわないまま、提供されています。(http://i-red.infoより引用) **ビルド [#p6b53590] OSごとのバイナリパッケージを利用するか、または、 $ tar xvzf delegateX.Y.Z.tar.gz $ cd delegateX.Y.Z $ CFLAGS='-O6' ADMIN='kaw@on.rim.or.jp' make $ sudo install -o root -g wheel -m 0755 src/delegated /usr/local/sbin ↑注)stripしないこと! (理由は後述) **起動 [#rea22e90] delegatedは、設定ファイルを持たない。指定はすべてコマンドラインから((「パラメータ置換」機能を使用して別ファイルに書いておくこともできる))。 基本形 >delegated -P['''host''':]'''port''' SERVER='''proto''' '''parameters''' ['''parameters...'''] パラーメータとしては、OWNER と DGROOT は毎回必ず指定した方が望ましい。~ これらの理由から通常はシェルラッパーを作成し、そこにパラメータを書いておいてそれを起動する。たとえば、dodg.sh↓ #!/bin/sh exec /usr/local/sbin/delegated OWNER=delegate/delegate DGROOT=/var/spool/delegate "$@" とかやって # dodg.sh -P8080 SERVER=http など。この時、実行時のプロセスは /usr/local/sbin/delegated ONWER=delegate/delegate DGROOT=/var/spool/delegate -P8080 SERVER=http となる。シェルラッパー経由で起動することで、実行時に必ず指定したほうがよいパラメータを付け加えることができる。 **停止 [#w3226587] 停止は-Fkill、再起動には-Fkill-hupを指定する。 # dodg.sh -P8080 -Fkill この時、実際に停止 (or 再起動)するプロセスは、起動時に -P8080 を指定したプロセスとなる。 起動・停止をまとめて、こんな感じにしてもOK。 ... rc.delegate↓ #!/bin/sh function dg { /usr/local/sbin/delegated \ ONWER=delegate/delegate \ DGROOT=/var/spool/delegate \ "$@" ; } case X"$1" in Xstart) dg "$@" ;; Xstop) dg -Fkill "$@" ;; Xrestart) dg -Fkill-hup "$@" ;; esac **ロギング・デバッグ [#da1b0f59] ログは、DGROOT/log/*に作成される。 ログファイルは、strftime(3)互換の書式準拠で指定可能。自前でログローテートできる。例; dodg.sh -P... SERVER=... LOGDIR='log[date+/aged/%y/%m/%d]' デバックには、-v オプションを指定。フォアグラウンドでの実行となり、ログもstdoutに出力される。 *使用例 [#ube910a9] **基本 [#c27d9118] ># delegated -P'''port''' SERVER='''proto''' 以下は、普通のHTTPプロキシとして起動した例。CACHE=yes or CACHE=do でキャッシュ機能が有効になる((CACHE=yesではあらかじめキャッシュ用のディレクトリが作られていればキャッシュ機能が有効に、CACHE=doではキャッシュ用のディレクトリがない場合は自動的に作成されて有効になる))。 # dodg.sh -P10080 SERVER=http CACHE=do 同様に、FTP専用のプロキシとして使用するには、以下の例のようにする; # dodg.sh -P10021 SERVER=ftp この例では、DeleGateはHTTP経由のFTPアクセスではない純粋なFTPプロキシとして動作する。これをFTPクライアントから使用するには、 このDeleGate FTPプロキシに接続後、 login: 目的のサーバでのアカウント名@目的のサーバ名 password: 目的のサーバのパスワード とすることで、目的とするFTPサーバに接続できる。あるいは、 // $ ftp 192.168.1.6 10021 // Connected to 192.168.1.6. // 220- 192.168.1.6 PROXY-FTP server (DeleGate/9.9.5-pre3) ready. // 220- @ @ // 220- ( - ) { DeleGate/9.9.5-pre3 (August 27, 2009) } // 220- AIST-Product-ID: 2000-ETL-198715-01, H14PRO-049, H15PRO-165, H18PRO-4 // 220- Copyright (c) 1994-2000 Yutaka Sato and ETL,AIST,MITI // 220- Copyright (c) 2001-2009 National Institute of Advanced Industrial Scind Technology (AIST) // 220- WWW: http://www.delegate.org/delegate/ // 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 'kaw@on.rim.or.jp' // 220- // 220-extended FTP [MODE XDC][XDC/BASE64] // 220 // Name (192.168.1.6:kaw): anonymous@ftp.ring.gr.jp // 331 Password required for anonymous. // Password: // 230-- PASS for anonymous@ftp.ring.gr.jp. // 220---------- Welcome to Pure-FTPd ---------- // 220-You are user number 9 of 50 allowed. // 220-Local time is now 23:56. Server port: 21. // 220-IPv6 connections are also welcome on this server. // 220 You will be disconnected after 15 minutes of inactivity. // 331- // 331- ################################################## // 331- # Welcome to the RingServer FTP service. # // 331- ################################################## // 331- // 331- // 331 Any password will work // 230- Any password will work // 230-- @ @ // 230 \( - )/ -- { connected to `ftp.ring.gr.jp' } // Remote system type is UNIX. // Using binary mode to transfer files. // ftp> dir // 150 Accepted data connection // drwxr-xr-x 7 1001 0 4096 Nov 14 01:39 . // drwxr-xr-x 7 1001 0 4096 Nov 14 01:39 .. // -rw-r--r-- 1 1001 1000 183 Sep 24 2007 .banner // -r--r--r-- 1 1001 1000 62551793 Nov 14 00:11 00ls_archive // : // : login: 目的のサーバのアカウント名 password: 目的のサーバのパスワード で、DeleGate FTPプロキシにlogin後、 cd //desthost で目的のサーバdesthostに接続できる。 **応用 [#c27d9118] ***多段接続 [#wd10deec] DeleGateは、多段接続して使用可能。 それには、DeleGate間同士の通信に「DeleGateプロトコル」を使用する。 この方法を使うと、中継可能なプロトコルをDeleGateプロトコルでwrap(というかtunnel)して 中継できる。~ →複数のプロトコルを中継するのに、一本の伝送路だけを用意すればよい。 使用例; #ref(ssh-delegate.png,wrap) local-proxy # dodg.sh -P10021 SERVER=ftp MASTER=localfw-addr:20000 local-fw # dodg.sh -Plocalfw-addr:10080 SERVER=http MASTER=127.0.0.1:20000 local-fw # dodg.sh -Plocalfw-addr:20000,127.0.0.1:20000 \ SERVER=delegate MASTER=127.0.0.1:20001 local-fw # ssh -L 20001:127.0.0.1:20002 remote-fw remote-fw # dodg.sh -P127.0.0.1:20002 SERVER=delegate 個々のプロトコルをクライアントから受け付けるDeleGateプロセスをSpecialistと呼び、 Specialistからの通信をDeleGateプロトコルにより一括して受け付けるDeleGateプロセスをGeneralistと呼ぶ。 ***INETDパラメータ [#zab1a0c4] 複数のプロトコルを受け付けたい場合、個々にプロセスを起動してもいいが、INETDパラメータで 一個のプロセスで複数のポート(=プロトコル)を待ちうけできる。 # dodg.sh INETD="50080 - - - - - SERVER=http MASTER=127.0.0.1:50000 RES_AF=64" \ INETD="_:40080 - - - - - SERVER=http" \ INETD="2401 - - - - - SERVER=tcprelay://anoncvs.jp.openbsd.org:2401" この例では、一個のDeleGateプロセスで、IPv4のポート50080((このHTTPプロキシは、上流のDeleGateに接続を依頼し、かつIPv6の接続を優先するように設定されている))とポート2401, IPv6のポート40080で接続を待ちうけている。 ~ この方法で起動した delegated を停止するには、INETDパラメータで一番最初に記述したポートを指定する。 ***URL Mount [#s5706459] 中継するURLをDeleGate上で書き換えることにより、clientから見たURLを変換する機能がある。 # dodg.sh -P80 SERVER=http \ MOUNT="/c1/* http://www1.localnet/*" \ MOUNT="/c2/* http://www2.localnet/*" 上記の例では、プロキシ上でウェブサーバが動作しており、 そのサブディレクトリ/c1、/c2配下にそれぞれwww1, www2のコンテンツがあるように見える。 $ w3m http://proxyhost/c1/index.html $ w3m http://proxyhost/c2/bbs.cgi 単一のサーバをプロキシ上で見せたいのであれば、MOUNTを使用せず、 # dodg.sh -P80 SERVER=http://www1.localnet/ でもよい。 プロトコルを変換しつつ、MOUNTすることも可。 # dodg.sh -P80 SERVER=http \ MOUNT="/mail/* pop://mailhost/*" \ MOUNT="/news/* nntp://newshost/*" ウェブブラウザ経由で、メールやネットニュースにアクセスできる。 $ w3m http://proxyhost/mail/ $ w3m http://proxyhost/news/ ***Origin Server [#n39158d3] プロキシではなく、サーバプロセスそのものとしても使用可。 dodg.sh -P80 SERVER=http MOUNT="/* /path/of/htdocs/*" RELAY=no RELIABLE="*" 自分自身にマウントするような記法を使用する。 ***TCPrelay / UDPrelay [#xfbf0b80] 単一のTCP接続やUDP送信をそのまま中継する機能。 -使用可能な条件 --単一・単方向の接続 --中継ストリーム中に、アドレスやポートなどの接続情報が含まれないこと --接続先が動的に変化しないこと -例1: 192.168.1.6からのSSH接続をssh-hostに転送 # dodg.sh -P10022 SERVER=tcprelay://ssh-host:22 RELIABLE="192.168.1.6" -例2: NTPパケットの中継 # dodg.sh -P123 SERVER=udprelay://ntp-serv:123 RELIABLE="clt-host" 戻りパケットも中継対象となる。 /// // # dodg.sh -P192.168.0.255:47808 \ ビル管理プロトコル(BACnet-IP)のパケット(UDP broadcast)を // SERVER=udprelay://192.168.32.255:47808 \ 他ネットワークに転送 // MASTER=gw-host:10000 //ただし、この例はシステム依存。上記指定を行うことでsetsockoptでSO_BROADCASTがセットできるOSならOK。 ***経路制御 [#m42729ad] 特定の条件に合致した(or合致しない)場合のみの経路を指定できる。~ ROUTEパラメータによって、中継の転送先、接続元、最終的な接続先を指定。 # dodg.sh -P172.31.0.1:10080,2001_3e0_434_8__1:10080 \ ROUTE='http://another-proxy:3128/-_-!*.localnet:*' この例では、IPv4の172.31.0.1:10080とIPv6の[2001:3e0:434:8::1]:10080で待ち受け、*.localnet以外への接続要求は、 別のプロキシに転送 ***CFI (Common Filter Interface) [#qf8e611a] 中継するデータを外部プログラムによって加工する仕組み。 データストリームの何処に挿入するかで、9種類の指定方法がある。 +-+ +-------+ +-+ MD: Master DeleGate |C|---->FFROMCL-|F| D |F|-FTOMD------>|M| |L| |C| E |M| |D| +-+ |T|<------FTOCL-|L| L |D|-FFROMMD<----| |<--->|S| +-+ | | E +-| +-+ |V| | | G |F|-FTOSV-------------->| | | | A |S| | | | | T |V|-FFROMSV<------------| | | | E | | +-+ +-------+ -応用 --ウィルスフィルタ for SERVER=smtp, SERVER=pop --低速回線でのデータ圧縮 --標準語→方言 変換フィルタ --表示不可文字セット→インラインイメージ 変換フィルタ((Webの黎明期に日本語の表示できないブラウザのためにこの機能が使用された)) ***sslway [#bc242eb7] DeleGate組込みのSSL wrapper。 -伝送路をSSLで暗号化する。 -SSLなので、クライアント/サーバの認証も可。 --証明書はOpenSSLなどを用いてあらかじめ作成しておく。 --実装例 ... [[DeleGateプロキシサーバ上のsslwayフィルタを用いたSSL-VPN実装>SslVpn]] ~ http://kaw.ath.cx/openbsd/index.php?SslVpn *その他諸々の話題 [#iccc7a25] **セキュリティ [#v27b266b] -起動時に自バイナリをチェック ... ビルド時に生成したバイナリのdigest値を埋め込みます。stripすると動作しません。 -環境変数・コマンドラインのアドレスランダム化 -SIGSEGV, SIGBUSなどで運用停止 ... 管理者にメールで報告。 -アクセス制御機能 ... 使用可プロトコル:EMITTABLE、接続元:RELIABLE、接続先:REACHABLE -- or 全部まとめて PERMIT) --RELIABLEを指定しない場合は、subnetmaskから決定される同一ネットワーク内からの接続のみ受け付ける。 -認証 ... AUTH, AUTHORIZER ... etc **IPv6対応は? [#s3687cef] DeleGate 9.0.0以降で対応済み ... 詳細は配布パッケージ内の IPv6NOTE.txt に記述 -アドレス表記 - 「:」は「_」に置き換える ... fe80::20c:76ff:fe59:8487%fxp0 → fe80__20c_76ff_fe59_8487%fxp0 - -Pパラメータでのport指定 -P9999 ... IPv4を受け付け (-P0.0.0.0:9999と同じ) -P__:9999 ... IPv6を受け付け -P0:9999,__:9999 ... 両方受け付け -名前解決 - RES_AFパラメータで指定 -- RES_AF=46|64|4|6 (default: RES_AF=46) *まとめ [#s75de829] -まだ紹介してない機能が沢山あります。 -- MYAUTHパラメータを使用した SMTPAUTH対応など... -wrapperを書くときは、継続行「\」に気をつけましょう。~ ... 私は付け忘れてよくハマります。 -ちょっとしたことをやりたい場合は便利です。 ~ 特定のプロトコルを大量に捌きたい場合は、専用のプロキシソフトウェアを使いましょう (varnishとか :-) -機能が豊富な分、見つかっていない穴があるかも... --publicな運用には特に注意 --他のソフトと組み合わせて、定期的な運用チェックやアクセス制限を実施したほうが吉かも。 -つっこんで使用したい場合はMLへの参加 (or アーカイブの検索)をお勧めします。 ---- #topicpath