Sync the section order with the original version. Add missing .Sh LIBRARYs. Submitted by: kano@na.rim.or.jp, Nobuyuki Koganemaru <n-kogane@syd.odn.ne.jp>
1051 lines
31 KiB
Groff
1051 lines
31 KiB
Groff
.\"-
|
|
.\" Copyright (c) 2001 Charles Mott <cm@linktel.net>
|
|
.\" All rights reserved.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\"
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
.\" SUCH DAMAGE.
|
|
.\"
|
|
.\" %FreeBSD: src/lib/libalias/libalias.3,v 1.23.2.11 2001/12/17 10:08:22 ru Exp %
|
|
.\"
|
|
.\" $FreeBSD$
|
|
.Dd April 13, 2000
|
|
.Dt LIBALIAS 3
|
|
.Os
|
|
.Sh 名称
|
|
.Nm libalias
|
|
.Nd マスカレードおよびネットワークアドレス変換用パケットエイリアシングライブラリ
|
|
.Sh 書式
|
|
.In sys/types.h
|
|
.In netinet/in.h
|
|
.In alias.h
|
|
.Pp
|
|
関数のプロトタイプは、このテキストの本文で紹介します。
|
|
.Sh 解説
|
|
.Nm
|
|
ライブラリは、IP パケットのエイリアスおよびエイリアス解除用の関数群であり、
|
|
マスカレードおよびネットワークアドレス変換 (NAT) を目的としています。
|
|
.Sh 導入
|
|
このライブラリは、IP のローカルネットワークアドレスの変換
|
|
および変換処理サポート用にデザインされた関数です。
|
|
ローカルネットワークの未登録の IP アドレスから発信するパケットは、
|
|
アクセス可能な IP アドレスから来たかのように見せかけることができます。
|
|
外から入ってくるパケットに対しては、
|
|
ローカルネットワーク上の正しいマシンに送られるよう
|
|
エイリアス解除されます。
|
|
.Pp
|
|
パケットエイリアシングエンジンには、
|
|
ある程度の柔軟性が組み込まれています。
|
|
もっとも簡単な操作では、
|
|
ローカルネットワークアドレスとパケットエイリアスホストとの間で
|
|
多対 1 対応付けが行なわれます。
|
|
これは仮装 IP として知られていることです。
|
|
更に、ローカルアドレスとパブリックアドレスの間での
|
|
1 対 1 対応付けも実装することが可能で、
|
|
静的 NAT として知られています。
|
|
これらの間には、異なるプライベートアドレスのグループを
|
|
それぞれ異なるパブリックアドレスにリンクさせることができ、
|
|
その中にははっきりした多対 1 対応もいくつか見られます。
|
|
更に、パブリックアドレスおよびポートは
|
|
固定的にプライベートアドレスおよびポートに
|
|
リダイレクトさせることができます。
|
|
.Pp
|
|
パケットエイリアシングエンジンは、
|
|
カーネル外部のユーザ空間で作用するように設計されており、
|
|
そのためプライベートなカーネルデータ構造へのアクセスは不要です。
|
|
ただし、ソースコードはカーネル環境に組み込むことができます。
|
|
.Sh 初期化と制御
|
|
2 つの特殊な関数、
|
|
.Fn PacketAliasInit
|
|
および
|
|
.Fn PacketAliasSetAddress
|
|
は、
|
|
パケット操作が完了する前に呼ぶ必要があります。
|
|
また、パケットエイリアシングエンジンの操作モードに対し
|
|
.Fn PacketAliasSetMode
|
|
呼び出しによりカスタマイズできます。
|
|
.Pp
|
|
.Ft void
|
|
.Fn PacketAliasInit "void"
|
|
.Bd -ragged -offset indent
|
|
この関数には引数がなく、また戻り値もありません。
|
|
内部データ構造の初期化に使用されます。
|
|
以下に示すモードビットは
|
|
.Fn PacketAliasInit
|
|
の呼び出し後、必ずセットされます。
|
|
これらのモードビットの意味については、後述の
|
|
.Fn PacketAliasSetMode
|
|
を参照してください。
|
|
.Bl -item -offset indent -compact
|
|
.It
|
|
.Dv PKT_ALIAS_SAME_PORTS
|
|
.It
|
|
.Dv PKT_ALIAS_USE_SOCKETS
|
|
.It
|
|
.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE
|
|
.El
|
|
.Pp
|
|
この関数はパケットエイリアスエンジンに対し、
|
|
常時同一の初期状態を返します。
|
|
.Fn PacketAliasSetAddress
|
|
呼び出しは、これに続いて行ないます。
|
|
また、前述したデフォルトモードビットを変更する場合は
|
|
.Fn PacketAliasSetMode
|
|
を呼び出します。
|
|
.Pp
|
|
この関数呼び出しは、
|
|
パケット操作の前にプログラム開始段階で実行する必要があります。
|
|
.Ed
|
|
.Pp
|
|
.Ft void
|
|
.Fn PacketAliasUninit void
|
|
.Bd -ragged -offset indent
|
|
この関数には引数も戻り値もなく、
|
|
内部データ構造に設定された値をクリアする場合に使用されます。
|
|
.Pp
|
|
この関数はプログラムでエイリアスエンジンの使用を
|
|
停止させる場合に呼び出す必要があります。
|
|
それにより、ファイアウォールに空いた隙間を塞ぐことになります。
|
|
以前との互換性や特別なセキュリティを備えるために、本関数を
|
|
.Fn PacketAliasInit
|
|
が
|
|
.Xr atexit 3
|
|
チェーンに付加しています。
|
|
何度呼び出しても問題はありません。
|
|
.Ed
|
|
.Pp
|
|
.Ft void
|
|
.Fn PacketAliasSetAddress "struct in_addr addr"
|
|
.Bd -ragged -offset indent
|
|
この関数は、ローカル領域のネットワーク外へ
|
|
パケットが発信する先のソースアドレスをセットします。
|
|
.Fn PacketAliasRedirectAddr
|
|
により生成された
|
|
静的アドレス対応により上書きされない限り、
|
|
発信パケットはすべてこのアドレスに再対応付けされます。
|
|
.Pp
|
|
.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE
|
|
モードビット
|
|
(デフォルト操作モード) が設定されている場合、
|
|
内部的なエイリアスリンクテーブルは、
|
|
エイリアスアドレスが変更されるたび、
|
|
リセットされます。
|
|
これは一連のダイアルアップ操作の中で
|
|
IP アドレス状態に関わらず、
|
|
.Xr ppp 8
|
|
のようなインタフェースに便利です。
|
|
.Pp
|
|
.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE
|
|
モードビットが
|
|
0 にセットされていた場合、この関数は、
|
|
パケット間のエイリアスの動的変更に使用できます
|
|
(オーバヘッドの少ない呼び出しです)。
|
|
.Pp
|
|
パケット操作の前にこの関数を呼び出す必要があります。
|
|
.Ed
|
|
.Pp
|
|
.Ft unsigned int
|
|
.Fn PacketAliasSetMode "unsigned int flags" "unsigned int mask"
|
|
.Bd -ragged -offset indent
|
|
この関数は、
|
|
.Fa flags
|
|
値に従ってモードビットの設定やクリアを行ないます。
|
|
.Fa mask
|
|
により示されたビットだけが対象となります。
|
|
以下に示すモードビットは
|
|
.Aq Pa alias.h
|
|
で定義されています。
|
|
.Bl -tag -width indent
|
|
.It Dv PKT_ALIAS_LOG
|
|
.Pa /var/log/alias.log
|
|
ファイルへのロギングを可能にします。
|
|
ログファイルには、エイリアス・リンクの作成、削除のたびに
|
|
icmp、tcp、udp へのリンク回数が記録されます。
|
|
ログファイルが
|
|
.Xr tail 1
|
|
により継続的に見ることができれば、
|
|
主としてデバッグ用として有効です。
|
|
.It Dv PKT_ALIAS_DENY_INCOMING
|
|
このモードビットが設定されていると、
|
|
TCP 接続や UDP トランザクションに関連する
|
|
外部から着信するあらゆるパケットは、
|
|
呼び出しプログラムで無視 (
|
|
.Fn PacketAliasIn
|
|
であれば
|
|
.Dv PKT_ALIAS_IGNORED
|
|
を返す)
|
|
するための印が付けられます。
|
|
パケットのエイリアスホストや
|
|
ローカルネットワークから発生した接続や
|
|
トランザクションに対するレスポンスに対する影響はありません。
|
|
このモードビットは片方向のファイアウォールを実装する時に有効です。
|
|
.It Dv PKT_ALIAS_SAME_PORTS
|
|
このモードビットが設定されていると、
|
|
パケットエイリアスエンジンは実際のローカルポート番号を
|
|
そのままエイリアスポート番号にしようとします。
|
|
このことは
|
|
(proto, alias addr, alias port, remote addr, remote port) の
|
|
5 つのパラメータのペアが一意であれば可能です。
|
|
競合が起きる場合は、このビットが設定されていても
|
|
エイリアスポート番号には別の番号が選択されます。
|
|
.It Dv PKT_ALIAS_USE_SOCKETS
|
|
このビットは、エイリアスホストがパケット移送時のように
|
|
ネットワーク上にトラフィックを発生させる場合必ず設定します。
|
|
パケットエイリアスホストが不明なホストアドレスや
|
|
不明のポート番号 (例えば、FTP データ接続時)
|
|
からの接続を待っている時は、このモードビットは、
|
|
ポートの競合が起きないように
|
|
プレースホルダとしてソケットの割り当てを定義します。
|
|
接続が確立されると、
|
|
通常は 1 分ほどでソケットは閉じられます。
|
|
.It Dv PKT_ALIAS_UNREGISTERED_ONLY
|
|
このビットが設定されていると、未登録のアドレス空間から生じた以外の
|
|
ローカルネットワーク上のトラフィックが無視されます。
|
|
標準クラス A, B および C の未登録アドレスは次の通りです。
|
|
.Bd -literal -offset indent
|
|
10.0.0.0 -> 10.255.255.255 (Class A subnet)
|
|
172.16.0.0 -> 172.31.255.255 (Class B subnets)
|
|
192.168.0.0 -> 192.168.255.255 (Class C subnets)
|
|
.Ed
|
|
このオプションは、パケットエイリアスホストが
|
|
別々のインタフェースに登録済みおよび
|
|
未登録サブネットがある場合に有効です。
|
|
登録済みサブネットは完全に外部と接続しているので、
|
|
パケットエイリアスエンジンにより
|
|
パケットを送り出す必要はありません。
|
|
.It Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE
|
|
このモードビットが設定されており、
|
|
.Fn PacketAliasSetAddress
|
|
が
|
|
エイリアスアドレス変更のために呼ばれるケースでは、
|
|
パケットエイリアスエンジンの内部リンクテーブル内容がクリアされます。
|
|
この操作モードは、
|
|
ダイアルアップ間でのインタフェースアドレスを変更したり、
|
|
変更せずにおく
|
|
.Xr ppp 8
|
|
リンクの場合に有効です。
|
|
このモードビットが設定されていない場合、
|
|
リンクテーブルはアドレスが変更されてもリセットされません。
|
|
.It Dv PKT_ALIAS_PUNCH_FW
|
|
このオプションにより、
|
|
.Nm
|
|
は、
|
|
FTP/IRC DCC 接続に対する
|
|
.Xr ipfirewall 4
|
|
ベースのファイアウォールの
|
|
`隙間' を作ることになります。
|
|
開けられた隙間は IP アドレスやポートと結び付いており、
|
|
別の接続に使用することはできません。
|
|
隙間はそれを使用している接続が消滅すれば除去されます。
|
|
.Nm
|
|
を使用しているプログラムを強制的に終了させる
|
|
(例えば kill -9) 仕組みは、フラグの状態により、
|
|
隙間に割り当てられた全ファイアウォール領域をクリアすることで実現されています。
|
|
このことはまた
|
|
.Fn PacketAliasSetFWBase
|
|
に対する
|
|
初期呼び出しでも起こります。
|
|
この呼び出しはフラグの設定の前に行なう必要があります。
|
|
.It Dv PKT_ALIAS_REVERSE
|
|
本オプションは、ライブラリが内向きパケットと外向きパケットを扱う方法を
|
|
反転させます。
|
|
これにより、外部インタフェースの代りに内部インタフェースを通過する
|
|
パケットを食わせることができます。
|
|
.It Dv PKT_ALIAS_PROXY_ONLY
|
|
本オプションは、ライブラリが透過プロキシルールのみに従うよう指示します。
|
|
通常のパケットエイリアスは実行されません。
|
|
詳細は後述の
|
|
.Fn PacketAliasProxyRule
|
|
を参照してください。
|
|
.El
|
|
.Ed
|
|
.Pp
|
|
.Ft void
|
|
.Fn PacketAliasSetFWBase "unsigned int base" "unsigned int num"
|
|
.Bd -ragged -offset indent
|
|
ファイアウォールに (
|
|
.Dv PKT_ALIAS_PUNCH_FW
|
|
フラグにより)
|
|
ファイアウォールの隙間に対する領域を割り当てます。
|
|
領域は全初期化ルールに従いクリアされます。
|
|
.Ed
|
|
.Sh パケット操作
|
|
パケット処理関数は、着信 (リモート -> ローカル)
|
|
および発信 (ローカル -> リモート) パケットの修正に使用されます。
|
|
ネットワークインタフェース経由でのパケットの送受信は、
|
|
呼び出し側プログラムが行ないます。
|
|
.Pp
|
|
.Fn PacketAliasInit
|
|
および
|
|
.Fn PacketAliasSetAddress
|
|
とともに、
|
|
.Fn PacketAliasIn
|
|
と
|
|
.Fn PacketAliasOut
|
|
の
|
|
2 つのパケット処理ルーチンが基本的な、
|
|
見かけの IP 実装に必要な最小機能として用意されています。
|
|
.Pp
|
|
.Ft int
|
|
.Fn PacketAliasIn "char *buffer" "int maxpacketsize"
|
|
.Bd -ragged -offset indent
|
|
リモートのマシンからローカルネットワークへの着信パケットは
|
|
この関数によりエイリアス解除されます。
|
|
IP パケットは引数
|
|
.Fa buffer
|
|
で指定されます。
|
|
.Fa maxpacketsize
|
|
はパケットを含むデータ構造の長さを示しており、
|
|
実際のパケット長より大きくとる必要があります。
|
|
.Pp
|
|
戻りコード :
|
|
.Bl -tag -width indent
|
|
.It Dv PKT_ALIAS_OK
|
|
パケットエイリアシング処理は成功しました。
|
|
.It Dv PKT_ALIAS_IGNORED
|
|
パケットは無視され、エイリアスは解除されませんでした。
|
|
これは、プロトコルが認識されないとき、
|
|
ICMP のメッセージタイプは処理されていないか、
|
|
あるいは新たな接続についての入力パケットが
|
|
無視されたときに発生します (
|
|
.Fn PacketAliasSetMode
|
|
が
|
|
.Dv PKT_ALIAS_DENY_INCOMING
|
|
を設定した場合)。
|
|
.It Dv PKT_ALIAS_UNRESOLVED_FRAGMENT
|
|
ヘッダフラグメントが未送信のため
|
|
フラグメントが解消されないときにこのコードが返されてきます。
|
|
この場合、フラグメントはヘッダフラグメントが見つかるまで
|
|
.Fn PacketAliasSaveFragment
|
|
により保存しておく必要があります。
|
|
.It Dv PKT_ALIAS_FOUND_HEADER_FRAGMENT
|
|
パケットエイリアシング処理は成功し、
|
|
ヘッダフラグメントも見つかりました。
|
|
これは解消されていないフラグメントを、
|
|
.Fn PacketAliasGetFragment
|
|
により探し、
|
|
.Fn PacketAliasFragmentIn
|
|
を使って
|
|
エイリアス解除する時のシグナルとなります。
|
|
.It Dv PKT_ALIAS_ERROR
|
|
パケットエイリアシングエンジン内で発生した内部エラー。
|
|
.El
|
|
.Ed
|
|
.Pp
|
|
.Ft int
|
|
.Fn PacketAliasOut "char *buffer" "int maxpacketsize"
|
|
.Bd -ragged -offset indent
|
|
ローカルネットワークからリモートのマシンへ発信するパケットは、
|
|
この関数によりエイリアスされます。
|
|
IP パケットは引数
|
|
.Fa buffer
|
|
で指定され、
|
|
.Fa maxpacketsize
|
|
はパケットが取りうる最大長を示します。
|
|
IP 表現形式プロトコルは、アドレスと、修正され、
|
|
またパケット長の変更にからむ一連のデータ内のポート情報を設定します。
|
|
プロトコルのよく知られた事例としては、
|
|
FTP と IRC DDC があります。
|
|
.Pp
|
|
戻りコード :
|
|
.Bl -tag -width indent
|
|
.It Dv PKT_ALIAS_OK
|
|
パケットエイリアシング処理は成功しました。
|
|
.It Dv PKT_ALIAS_IGNORED
|
|
パケットは無視され、エイリアス解除はされませんでした。
|
|
これはプロトコルが認識されないときか、あるいは ICMP
|
|
メッセージタイプが処理されないときに発生します。
|
|
.It Dv PKT_ALIAS_ERROR
|
|
パケットエイリアシング内で発生した内部エラー。
|
|
.El
|
|
.Ed
|
|
.Sh ポートとアドレスのリダイレクション
|
|
このセクションで解説している関数は、
|
|
ローカルネットワーク上のマシンにおいて、
|
|
外部ネットワークから新たな着信に対するアクセスをある程度可能にします。
|
|
個々のポートは、再対応付けや
|
|
固定的なネットワークアドレスの変換を定義することができます。
|
|
.Pp
|
|
.Ft struct alias_link *
|
|
.Fo PacketAliasRedirectPort
|
|
.Fa "struct in_addr local_addr"
|
|
.Fa "u_short local_port"
|
|
.Fa "struct in_addr remote_addr"
|
|
.Fa "u_short remote_port"
|
|
.Fa "struct in_addr alias_addr"
|
|
.Fa "u_short alias_port"
|
|
.Fa "u_char proto"
|
|
.Fc
|
|
.Bd -ragged -offset indent
|
|
この関数は、所定のリモートアドレスやポートから
|
|
エイリアスアドレスやポートへのトラフィックを、
|
|
指定されたローカルアドレスやポートへのリダイレクトを定義します。
|
|
パラメータ
|
|
.Fa proto
|
|
は
|
|
.Dv IPPROTO_TCP
|
|
か
|
|
.Dv IPPROTO_UDP
|
|
のどちらかに該当し、
|
|
.Aq Pa netinet/in.h
|
|
で定義されます。
|
|
.Pp
|
|
.Fa local_addr
|
|
あるいは
|
|
.Fa alias_addr
|
|
が 0 ならば、パケットエイリアシングアドレスは
|
|
.Fn PacketAliasSetAddress
|
|
で設定されたものを使用します。
|
|
.Fn PacketAliasRedirectPort
|
|
が
|
|
.Fn PacketAliasSetAddress
|
|
呼び出し語に
|
|
アドレス変更のために呼び出されても、
|
|
0 リファレンスがこの変更を記録します。
|
|
.Pp
|
|
負荷共有用にリンクが更に設定されると、
|
|
.Fa local_addr
|
|
と
|
|
.Fa local_port
|
|
は無視され、サーバプールから動的に選択されます。
|
|
これは
|
|
.Fn PacketAliasAddServer
|
|
で後述されています。
|
|
.Pp
|
|
.Fa remote_addr
|
|
が 0 の場合、
|
|
パケットをリモートアドレスからリダイレクトします。
|
|
同様に、
|
|
.Fa remote_port
|
|
が 0 の場合、リモートのポート番号から発生した
|
|
パケットをリダイレクトします。
|
|
通常、リモートポート定義は 0 ですが、
|
|
ファイアウォールに対しては 0 でない
|
|
リモートアドレスが有効な場合があります。
|
|
.Fn PacketAliasRedirectPort
|
|
呼び出しにより、
|
|
アドレスとポート定義が重複した場合、
|
|
最新の呼び出しが優先されます。
|
|
.Pp
|
|
この関数は次いで
|
|
.Fn PacketAliasRedirectDelete
|
|
で使用するポインタを返します。
|
|
.Dv NULL
|
|
が返された場合、関数呼び出しは正常に終了していません。
|
|
.Pp
|
|
あらゆるポートアドレスは、
|
|
ネットワークアドレスのバイトオーダ表記に従っています。
|
|
これらのパラメータは
|
|
.Xr htons 3
|
|
を使用して、
|
|
内部的な数値形式からネットワークバイトオーダ表記に
|
|
変換する必要があります。
|
|
アドレスもまた同様にネットワークバイトオーダ形式であり、
|
|
.Fa struct in_addr
|
|
データ型で暗黙に定義されます。
|
|
.Ed
|
|
.Pp
|
|
.Ft struct alias_link *
|
|
.Fo PacketAliasRedirectAddr
|
|
.Fa "struct in_addr local_addr"
|
|
.Fa "struct in_addr alias_addr"
|
|
.Fc
|
|
.Bd -ragged -offset indent
|
|
この関数は、
|
|
.Fa alias_addr
|
|
への全着信トラフィックを
|
|
.Fa local_addr
|
|
にリダイレクトします。同様に、
|
|
.Fa local_addr
|
|
からの全発信トラフィックは
|
|
.Fa alias_addr
|
|
にエイリアスされます。
|
|
.Pp
|
|
.Pa local_addr
|
|
または
|
|
.Pa alias_addr
|
|
が 0 の場合、
|
|
.Fn PacketAliasSetAddress
|
|
により設定された
|
|
パケットエイリアシングアドレスが使用されます。
|
|
.Fn PacketAliasSetAddress
|
|
が
|
|
.Fn PacketAliasRedirectAddr
|
|
の呼び出し後に
|
|
アドレス変更のために呼び出されても、
|
|
0 リファレンスがこの変更を記録します。
|
|
.Pp
|
|
負荷共有用にリンクが更に設定されると、
|
|
.Fa local_addr
|
|
は無視され、サーバプールから動的に選択されます。
|
|
これは
|
|
.Fn PacketAliasAddServer
|
|
で後述されています。
|
|
.Pp
|
|
.Fn PacketAliasRedirectAddr
|
|
に対する一連の呼び出しが
|
|
同一のエイリアシングアドレスを使用している場合、
|
|
このエイリアシングアドレスへの新たな全着信トラフィックは、
|
|
最後の関数呼び出しで作られたローカルアドレスへリダイレクトされます。
|
|
いくつかの関数呼び出しで指定されたローカルマシンからの
|
|
新たな全トラフィックは、
|
|
同一のアドレスにリダイレクトされます。
|
|
.Bd -literal -offset indent
|
|
PacketAliasRedirectAddr(inet_aton("192.168.0.2"),
|
|
inet_aton("141.221.254.101"));
|
|
PacketAliasRedirectAddr(inet_aton("192.168.0.3"),
|
|
inet_aton("141.221.254.101"));
|
|
PacketAliasRedirectAddr(inet_aton("192.168.0.4"),
|
|
inet_aton("141.221.254.101"));
|
|
.Ed
|
|
.Pp
|
|
192.168.0.2, 192.168.0.3 および 192.168.0.4 から、
|
|
.Xr telnet 1
|
|
や
|
|
.Xr ftp 1
|
|
などでの発信接続は
|
|
141.221.254.101 からでてきたかのようにみえます。
|
|
141.221.254.101 への着信接続は
|
|
192.168.0.4 にリダイレクトされます。
|
|
.Pp
|
|
.Fn PacketAliasRedirectPort
|
|
に対する呼び出しより
|
|
.Fn PacketAliasRedirectAddr
|
|
で指定されたアドレス対応が必ず優先されます。
|
|
.Pp
|
|
この関数は、
|
|
.Fn PacketAliasRedirectDelete
|
|
が使用するポインタを返します。
|
|
.Dv NULL
|
|
が返される場合、関数呼び出しは正常に終了していません。
|
|
.Ed
|
|
.Pp
|
|
.Ft int
|
|
.Fo PacketAliasAddServer
|
|
.Fa "struct alias_link *link"
|
|
.Fa "struct in_addr addr"
|
|
.Fa "u_short port"
|
|
.Fc
|
|
.Bd -ragged -offset indent
|
|
本関数は、
|
|
.Fa link
|
|
を、IP Network Address Translation (RFC 2391, LSNAT) を使用した
|
|
負荷共有用に設定します。
|
|
LSNAT は次のように動作します。
|
|
クライアントが、サーバ仮想アドレスを使用してサーバへアクセスを試みます。
|
|
LSNAT ルータが、サーバプール中の 1 個のホストに対し、
|
|
要求を透過的にリダイレクトします。
|
|
ホスト選択には、実時間負荷共有アルゴリズムを使用します。
|
|
複数のセッションが同一のクライアントから開始されるかもしれません。
|
|
各セッションは、その時々のサーバプールホスト間の負荷バランスによって、
|
|
異なるホストに向けられる可能性があります。
|
|
数個の固有のサービスに対して負荷共有が望まれる場合、
|
|
LSNAT の設定により、望まれるサービスにのみ負荷共有を限定可能です。
|
|
.Pp
|
|
現在のところ、最も単純な選択アルゴリズムのみが実装されています。
|
|
この方法は、ラウンドロビンによる選択のみであり、
|
|
ホストの負荷を考慮しないものです。
|
|
.Pp
|
|
まず、
|
|
.Fa link
|
|
が
|
|
.Fn PacketAliasRedirectPort
|
|
または
|
|
.Fn PacketAliasRedirectAddr
|
|
により作成されます。
|
|
次に
|
|
.Fn PacketAliasAddServer
|
|
が複数回呼ばれ、
|
|
.Fa link
|
|
のサーバプールにエントリが追加されます。
|
|
.Pp
|
|
.Fn PacketAliasRedirectAddr
|
|
で作成されたリンクに対し、
|
|
.Fa port
|
|
引数は無視されいかなる値、例えば htons(~0) を持ちえます。
|
|
.Pp
|
|
本関数は、成功時には 0 を返し、失敗時には -1 を返します。
|
|
.Ed
|
|
.Pp
|
|
.Ft void
|
|
.Fn PacketAliasRedirectDelete "struct alias_link *ptr"
|
|
.Bd -ragged -offset indent
|
|
この関数は、
|
|
.Fn PacketAliasRedirectPort
|
|
あるいは
|
|
.Fn PacketAliasRedirectAddr
|
|
が設定した
|
|
特定の静的リダイレクトルールを削除します。
|
|
パラメータ
|
|
.Fa ptr
|
|
は、いずれかのリダイレクション関数から返されてくるポインタです。
|
|
正しくないポインタが
|
|
.Fn PacketAliasRedirectDelete
|
|
に渡されると、
|
|
プログラムはクラッシュするか、予期せぬ動作結果となります。
|
|
そのためにこの関数の使用に際しては注意が必要です。
|
|
.Ed
|
|
.Pp
|
|
.Ft int
|
|
.Fn PacketAliasProxyRule "const char *cmd"
|
|
.Bd -ragged -offset indent
|
|
渡された
|
|
.Fa cmd
|
|
文字列は、1 個以上の、語の組からなります。
|
|
各組の最初の語はトークンであり、次の語はそのトークンに適用される値です。
|
|
トークンと引数の型は次の通りです:
|
|
.Bl -tag -width indent
|
|
.It Cm type encode_ip_hdr | encode_tcp_stream | no_encode
|
|
透過プロキシのサポートのために、
|
|
新規終点サーバに元のアドレスとポートの情報を
|
|
なんらかの方法で渡す必要があります。
|
|
.Cm encode_ip_hdr
|
|
が指定された場合、追加の IP オプションとして元のアドレスとポートが渡されます。
|
|
.Cm encode_tcp_stream
|
|
が指定された場合、TCP ストリーム中の最初のデータ片の中に
|
|
.Dq DEST Ar IP port
|
|
という書式で、元のアドレスとポートが渡されます。
|
|
.It Cm port Ar portnum
|
|
終点ポートが
|
|
.Ar portnum
|
|
のパケットのみがプロキシの対象となります。
|
|
.It Cm server Ar host Ns Xo
|
|
.Op : Ns Ar portnum
|
|
.Xc
|
|
データの転送先の
|
|
.Ar host
|
|
と
|
|
.Ar portnum
|
|
を指定します。
|
|
.Ar host
|
|
は、DNS ホスト名ではなく IP アドレスであることが必要です。
|
|
.Ar portnum
|
|
が指定されないと、終点ポート番号は変更されません。
|
|
.Pp
|
|
.Ar server
|
|
の指定は、
|
|
.Cm delete
|
|
コマンドが使用されない限り、必須です。
|
|
.It Cm rule Ar index
|
|
通常、各
|
|
.Fn PacketAliasProxyRule
|
|
呼び出しは、ルールの線型リストの先頭に次のルールを挿入します。
|
|
.Ar index
|
|
が指定された場合、低いインデックスの全ルールがチェックされた後に、
|
|
新規ルールがチェックされます。
|
|
ルールを指定しない
|
|
.Fn PacketAliasProxyRule
|
|
呼び出しは、ルールにルール 0 を割り当てます。
|
|
.It Cm delete Ar index
|
|
本トークンと引数は、他のトークンと組み合わせて使用してはなりません。
|
|
本トークンを使用すると、指定した
|
|
.Ar index
|
|
の既存のルールが削除されます。
|
|
.It Cm proto tcp | udp
|
|
指定すると、指定したプロトコルタイプのパケットのみがマッチします。
|
|
.It Cm src Ar IP Ns Xo
|
|
.Op / Ns Ar bits
|
|
.Xc
|
|
指定すると、指定した
|
|
.Ar IP
|
|
に始点アドレスがマッチするパケットのみがマッチします。
|
|
.Ar bits
|
|
も指定すると、
|
|
.Ar IP
|
|
アドレスの最初の
|
|
.Ar bits
|
|
ビットのみがネットワーク指定として使用され、
|
|
そのネットワークからの全 IP アドレスがマッチします。
|
|
.It Cm dst Ar IP Ns Xo
|
|
.Op / Ns Ar bits
|
|
.Xc
|
|
指定すると、指定した
|
|
.Ar IP
|
|
に終点アドレスがマッチするパケットのみがマッチします。
|
|
.Ar bits
|
|
も指定すると、
|
|
.Ar IP
|
|
アドレスの最初の
|
|
.Ar bits
|
|
ビットのみがネットワーク指定として使用され、
|
|
そのネットワークからの全 IP アドレスがマッチします。
|
|
.El
|
|
.Pp
|
|
本関数は、通常、ある主のインターネットアクセスを禁止されている
|
|
内部マシンに対し、外向き接続をリダイレクトするか、
|
|
またはある種の外部マシンへのアクセスを制限します。
|
|
.Ed
|
|
.Pp
|
|
.Ft struct alias_link *
|
|
.Fo PacketAliasRedirectProto
|
|
.Fa "struct in_addr local_addr"
|
|
.Fa "struct in_addr remote_addr"
|
|
.Fa "struct in_addr alias_addr"
|
|
.Fa "u_char proto"
|
|
.Fc
|
|
.Bd -ragged -offset indent
|
|
本関数は、指定したリモートアドレスからエイリアスアドレスへのプロトコル番号
|
|
.Fa proto
|
|
の全パケットが、指定したローカルアドレスへリダイレクトすることを指定します。
|
|
.Pp
|
|
.Fa local_addr
|
|
または
|
|
.Fa alias_addr
|
|
が 0 の場合、
|
|
で確立したパケットエイリアスアドレスが使用されることを指定します。
|
|
.Fn PacketAliasSetAddress
|
|
が
|
|
.Fn PacketAliasRedirectProto
|
|
の呼び出し後に
|
|
アドレス変更のために呼び出されても、
|
|
0 リファレンスがこの変更を記録します。
|
|
.Pp
|
|
.Fa remote_addr
|
|
が 0 の場合、
|
|
全リモートホストからのパケットをリダイレクトすることを指定します。
|
|
非 0 のリモートアドレスは、ファイアウォール用途に有用な場合があります。
|
|
.Pp
|
|
2 個の
|
|
.Fn PacketAliasRedirectProto
|
|
呼び出しが、アドレス指定において重なる場合、
|
|
最新の呼び出しが優先します。
|
|
.Pp
|
|
本関数は、後に
|
|
.Fn PacketAliasRedirectDelete
|
|
に使用可能なポインタを返します。
|
|
.Dv NULL
|
|
が返される場合、関数呼び出しは正常に終了していません。
|
|
.Ed
|
|
.Sh フラグメント操作
|
|
このセクションの関数は着信フラグメント操作で使用されます。
|
|
.Pp
|
|
発信フラグメントは、
|
|
.Fn PacketAliasRedirectAddr
|
|
で設定した
|
|
適用可能な対応付によるアドレス変更により、
|
|
または
|
|
.Fn PacketAliasSetAddress
|
|
で設定した
|
|
エイリアシングアドレスの省略時値により、
|
|
.Fn PacketAlaisOut
|
|
内で処理されます。
|
|
.Pp
|
|
着信フラグメントは 2 通りの方法で処理されます。
|
|
フラグメント化された
|
|
IP パケットのヘッダが既に分かっている場合は、
|
|
一連のフラグメントはヘッダフラッグメントと
|
|
同じ方式で再対応付けされます。
|
|
フラグメントはヘッダが到着する前に保存され、
|
|
ヘッダフラグメントが消滅した段階で取り出されます。
|
|
.Pp
|
|
.Ft int
|
|
.Fn PacketAliasSaveFragment "char *ptr"
|
|
.Bd -ragged -offset indent
|
|
.Fn PacketAliasIn
|
|
から
|
|
.Dv PKT_ALIAS_UNRESOLVED_FRAGMENT
|
|
返されてくると、この関数が、
|
|
残っているフラグメントのポインタを保存するために使用できます。
|
|
.Pp
|
|
引数
|
|
.Fa ptr
|
|
は
|
|
.Xr malloc 3
|
|
で割り当てられたメモリブロックを
|
|
指すことが暗黙のうちに仮定されています。
|
|
フラグメントが解決されない場合、
|
|
パケットエイリアシングエンジンは
|
|
タイムアウト時間経過後、自動的にメモリを解放します
|
|
[実質的には、この関数は、
|
|
メモリ解放のコールバック関数が
|
|
引数として渡されるように修正しておく必要があります]。
|
|
.Pp
|
|
この関数は、正常実行の場合
|
|
.Dv PKT_ALIAS_OK
|
|
を返し、エラーの場合
|
|
.Dv PKT_ALIAS_ERROR
|
|
を返します。
|
|
.Ed
|
|
.Pp
|
|
.Ft char *
|
|
.Fn PacketAliasGetFragment "char *buffer"
|
|
.Bd -ragged -offset indent
|
|
この関数は、
|
|
.Fn PacketAliasSaveFragment
|
|
で保管された
|
|
フラグメントポインタの再取り出しができます。
|
|
.Fa buffer
|
|
で示す IP ヘッダフラグメントは、
|
|
.Fn PacketAliasIn
|
|
が
|
|
.Fv PKT_ALIAS_FOUND_HEADER_FRAGMENT
|
|
を返したときに指定される
|
|
ヘッダフラグメントです。
|
|
フラグメントのポインタが再取り出しされると、
|
|
呼び出しプログラムによりフラグメントに
|
|
動的に割り当てられていたメモリが解放されます。
|
|
.Pp
|
|
フラグメントがなくなるで
|
|
.Fn PacketAliasGetFragment
|
|
を続けて呼ぶことができます。
|
|
処理するフラグメントがなくなると
|
|
.Dv NULL
|
|
が返されてきます。
|
|
.Ed
|
|
.Pp
|
|
.Ft void
|
|
.Fn PacketAliasFragmentIn "char *header" "char *fragment"
|
|
.Bd -ragged -offset indent
|
|
.Fn PacketAliasGetFragment
|
|
によりフラグメントの再取得を行なうとき、
|
|
.Fn PacketAliasFragmentIn
|
|
呼び出しを実行して
|
|
フラグメントのエイリアスを解除できます。
|
|
引数
|
|
.Fa header
|
|
は、テンプレートとして使われているヘッダフラグメントのポインタです。
|
|
引数
|
|
.Fa fragment
|
|
はエイリアス解除するパケットのポインタです。
|
|
.Ed
|
|
.Sh その他の関数
|
|
.Ft void
|
|
.Fn PacketAliasSetTarget "struct in_addr addr"
|
|
.Bd -ragged -offset indent
|
|
既存のエイリアスリンクと関連のない
|
|
外からの着信パケットがホストマシンに到着すると、
|
|
それは
|
|
.Fn PacketAliasSetTarget
|
|
呼び出しにより
|
|
指定されるアドレスへ送られます。
|
|
.Pp
|
|
この関数が
|
|
.Dv INADDR_NONE
|
|
アドレスを引数として呼ばれた場合、
|
|
外からのあらゆる新規着信パケットは
|
|
.Fn PacketAliasSetAddress
|
|
で設定されるアドレスへ行きます。
|
|
.Pp
|
|
この関数が
|
|
.Dv INADDR_ANY
|
|
アドレスを引数として呼ばれた場合、
|
|
外からのあらゆる新規着信パケットは
|
|
パケット中で指定されるアドレスへ行きます。
|
|
外部のマシンが内部のマシンへ直接ルーティング可能な場合、
|
|
外部のマシンが直接内部のマシンと話すことを可能とします。
|
|
.Ed
|
|
.Pp
|
|
.Ft int
|
|
.Fn PacketAliasCheckNewLink void
|
|
.Bd -ragged -offset indent
|
|
新規のエイリアシングリンクが生成されると、
|
|
この関数は 0 以外の値を返します。
|
|
外からの着信トラフィックが順次異なるサーバへ送られるという状況下で、
|
|
この関数を
|
|
.Fn PacketAliasSetTarget
|
|
呼び出しを
|
|
デフォルトの目的アドレスを変更のため実行するときのトリガにできます。
|
|
.Ed
|
|
.Pp
|
|
.Ft u_short
|
|
.Fn PacketAliasInternetChecksum "u_short *buffer" "int nbytes"
|
|
.Bd -ragged -offset indent
|
|
これはよそでは使うことがありませんが、
|
|
便利なユーティリティ関数です。
|
|
インターネットチェックサムを計算します。
|
|
チェックサムは、IP およびプロトコル
|
|
(TCP, UDP, ICMP) 固有のヘッダのどちらでも使われています。
|
|
.Pp
|
|
引数
|
|
.Fa buffer
|
|
はチェックサムを取るデータブロックを指しています。また
|
|
.Fa nbytes
|
|
はバイト数を与えます。
|
|
16 ビットのチェックサムフィールドは
|
|
チェックサム計算の前に 0 クリアされます。
|
|
.Pp
|
|
チェックサムはチェックサム自身を含めた
|
|
データブロックの操作により検証することができます。
|
|
チェックサムが正しければ、
|
|
PacketAliasInternetChecksum() は 0 を返します。
|
|
.Ed
|
|
.Pp
|
|
.Ft int
|
|
.Fn PacketUnaliasOut "char *buffer" "int maxpacketsize"
|
|
.Bd -ragged -offset indent
|
|
エイリアス処理済の外向きパケットは、
|
|
プライベートアドレス/ポートの情報を本関数によって復活されています。
|
|
.Fa buffer
|
|
で指される IP パケットと
|
|
.Fa maxpacketsize
|
|
が、エラーチェックのために提供されています。
|
|
本関数は、エイリアス処理済パケットの元の IP ヘッダが
|
|
必要となる更なる処理 (例えばロギング) に使用可能です。
|
|
.Ed
|
|
.Sh バグ
|
|
PPTP エイリアスは、複数の内部クライアントが同一の外部サーバに
|
|
同時に接続すると動作しません。
|
|
なぜなら、PPTP は 2 つの IP アドレス間に
|
|
単一の TCP 制御接続を必要とするからです。
|
|
.Sh 作者
|
|
.An Charles Mott Aq cm@linktel.net ,
|
|
versions 1.0 - 1.8, 2.0 - 2.4。
|
|
.An Eivind Eklund Aq eivind@FreeBSD.org ,
|
|
versions 1.8b, 1.9 および 2.5。
|
|
アーキテクチャにおける数々の改善による貢献のほかに、
|
|
IRC DCC に関するサポートを行ないました。
|
|
ならびに FTP/IRC DCC のファイアウォールのバイパスです。
|
|
.An Erik Salander Aq erik@whistle.com
|
|
が PPTP と RTSP のサポートを追加しました。
|
|
.An Junichi Satoh Aq junichi@junichi.org
|
|
が RTSP/PNA のサポートを追加しました。
|
|
.Sh 謝辞
|
|
以下、概略時代順に示すのは、
|
|
有益なコメントやデバッグの手助けを提供してくれた人々の名前です。
|
|
.Pp
|
|
.Bd -ragged -offset indent
|
|
.An -split
|
|
.An Gary Roberts
|
|
.An Tom Torrance
|
|
.An Reto Burkhalter
|
|
.An Martin Renters
|
|
.An Brian Somers
|
|
.An Paul Traina
|
|
.An Ari Suutari
|
|
.An Dave Remien
|
|
.An J. Fortes
|
|
.An Andrzej Bialecki
|
|
.An Gordon Burditt
|
|
.Ed
|
|
.Sh 概念的な背景
|
|
この付録は、ソースコードの修正を検討している人や、
|
|
パケットエイリアシング関数を使用して
|
|
やや難解なアプリケーションを作成する人を対象としています。
|
|
.Pp
|
|
ここにはパケットエイリアシングエンジンの
|
|
概念的なフレームワークが記述されています。
|
|
議論の中心は、ローカルマシンとエイリアスされた識別子
|
|
およびリモートマシン間の指定された
|
|
パケットトランザクションの関係を定義している
|
|
"エイリアシング リンク" に考え方についてです。
|
|
こうしたリンクがどのように発生して
|
|
また消滅するかについて検討されています。
|
|
.Ss エイリアシングリンク
|
|
.Em エイリアシング リンク
|
|
は、
|
|
7 つの要素で記述できるという考え方があります:
|
|
.Bd -literal -offset indent
|
|
(ローカルアドレス、 ローカルポート番号、
|
|
エイリアスアドレス、エイリアスポート番号、
|
|
リモートアドレス、リモートポート、プロトコル)
|
|
.Ed
|
|
.Pp
|
|
外へ発信するパケットは、
|
|
ローカルアドレスとローカルポート番号が、
|
|
エイリアスアドレスとエイリアスポート番号で置き換えられます。
|
|
外から着信するパケットは、逆のプロセスで処理されます。
|
|
パケットエイリアシングエンジンは、
|
|
エイリアシングリンクの内部テーブルに対してパケットを対応させ、
|
|
指定 IP パケットの修飾方法を決定しようとします。
|
|
IP ヘッダおよびプロトコルに依存するヘッダのどちらも
|
|
必要に応じて修正されます。
|
|
エイリアシングリンクは、ネットワークのトラフィックにより、
|
|
必要に応じて生成、消滅が行なわれます。
|
|
.Pp
|
|
プロトコルは、ある状況では TCP か UDP であり、
|
|
または ICMP であってかまいません
|
|
(ICMP のある種のパケットタイプには、
|
|
個々のパケットの処理方式を決めるポート番号と同様な働きをする、
|
|
一連の id 番号にエイリアスすることができるものがあります)。
|
|
.Pp
|
|
それぞれのエイリアスリンクは
|
|
次の 5 つの数値の組合せを持っていなければなりません。
|
|
すなわち、エイリアスアドレス / ポート、
|
|
リモートアドレス / ポート、およびプロトコルです。
|
|
このことによりローカルネットワーク上のいくつかのマシンは
|
|
同じエイリアス IP アドレスを共有することが可能となります。
|
|
競合が起こるケースでは、エイリアシングポートが、
|
|
一意性が保てるよう選択されます。
|
|
.Ss 静的および動的リンク
|
|
エイリアシングリンクには静的および動的なものがあります。
|
|
静的リンクは無期限に存続し、IP パケットの変換に関しては
|
|
固定された規則を保持しています。
|
|
動的リンクは個別の TCP 接続や UDP トランザクションの
|
|
エコーシーケンスに対して生成されます。
|
|
TCP の場合は、関連するエイリアシングリンクを
|
|
何時削除するべきかを知るために、接続を監視できます。
|
|
UDP トランザクション (および ICMP エコーとタイムスタンプ要求) は
|
|
単純なタイムアウト規則で動いています。
|
|
一定の時間、動的リンクを張るアクティビティが無いときは、
|
|
自動的に削除されます。
|
|
タイムアウト規則は適切なオープン / クローズを行なわない
|
|
TCP 接続にも適用されます。
|
|
.Ss エイリアシングリンクの部分定義
|
|
エイリアシングリンクは部分的な定義が可能です。
|
|
これはリモートアドレスおよび (または)
|
|
リモートポートが不明である場合に行ないます。
|
|
この場合、不完全な定義のパケットが見つかると、
|
|
完全仕様の動的リンクが生成されます。
|
|
元々の部分定義のリンクが動的なものである場合、
|
|
完全仕様のリンクが生成された後それは削除され、
|
|
そうでない場合無期限に残ることになります。
|
|
.Pp
|
|
たとえば、部分定義リンクは次の通りです。
|
|
.Bd -literal -offset indent
|
|
(192.168.0.4, 23, 204.228.203.215, 8066, 0, 0, tcp)
|
|
.Ed
|
|
.Pp
|
|
0 の値はリモートアドレスおよびポートの未定義部分を表しています。
|
|
リンクが静的なものであれば、
|
|
外から着信してくる全トラフィックを
|
|
アドレス 204.228.203.215 のポート 8066 から、
|
|
ローカルネットワーク上の 192.168.0.4 のアドレスを持つマシンの
|
|
ポート 23 (telnet) へリダイレクトすることになります。
|
|
.Ss A.4 動的リンクの生成
|
|
エイリアシングリンクに加え、
|
|
パケットエイリアシング機構を持つ
|
|
内部データテーブルに格納できるアドレス対応表があります。
|
|
.Bd -literal -offset indent
|
|
(ローカルアドレス、エイリアスアドレス)
|
|
.Ed
|
|
.Pp
|
|
アドレス対応表は動的リンク生成時に必要とされます。
|
|
.Pp
|
|
ローカルネットワークから外へ発信するあらゆるパケットは、
|
|
既存の完全定義されたリンクと一致していなければ、
|
|
動的リンクを自動的に生成します。
|
|
これは発信するパケットに関し、
|
|
アドレス対応があれば使用されるエイリアスアドレスを決定します。
|
|
対応が無ければ、
|
|
デフォルトアドレスが通常エイリアシングホストのアドレスですが、
|
|
使用されます。
|
|
必要であれば、デフォルトアドレスは
|
|
個々のパケットが到着するたびに変更できます。
|
|
.Pp
|
|
エイリアシングポート番号は、
|
|
新たな動的リンクが既存のリンクと競合しないよう決められます。
|
|
デフォルト操作モードでは、パケットエイリアシングエンジンは
|
|
ローカルポート番号と同じ番号を
|
|
エイリアシングポートとして設定しようとします。
|
|
その結果競合すれば、ポート番号は一意なエイリアシングリンクとなるまで
|
|
無作為に選択が行なわれます。
|
|
予備の操作モードでは、
|
|
エイリアシングポートの最初の選択は無作為に、
|
|
またローカルポート番号と無関係に行なわれます。
|