This section is based on catpages contributed by Mainichi Communications, Inc. Translated by: MYCOM team Converted by: Japanese Online Manual Project <man-jp@jp.FreeBSD.ORG> Submitted by: Kazuo Horikawa <k-horik@yk.rim.or.jp>
720 lines
24 KiB
Groff
720 lines
24 KiB
Groff
.\" jpman %Id%
|
|
.\"
|
|
.Dd July, 1997
|
|
.Dt "libalias" 3
|
|
.Os
|
|
.Sh 名称
|
|
.Nm "libalias"
|
|
パケットエイリアシングライブラリ。
|
|
ネットワークアドレス変換 (NAT) と別名化のための
|
|
IP パケットエイリアシングおよびエイリアス解除関数群
|
|
.Sh 書式
|
|
.Fd #include <sys/types.h>
|
|
.Fd #include <netinet/in.h>
|
|
.Fd #include <alias.h>
|
|
|
|
関数のプロトタイプは、このテキストの本文で紹介します。
|
|
.Sh 目次
|
|
.Bd -literal -offset left
|
|
1. 序文
|
|
2. 初期化と制御
|
|
2.1 PacketAliasInit()
|
|
2.2 PacketAliasUninit()
|
|
2.3 PacketAliasSetAddress()
|
|
2.4 PacketAliasSetMode()
|
|
2.5 PacketAliasSetFWBase()
|
|
3. パケット操作
|
|
3.1 PacketAliasIn()
|
|
3.2 PacketAliasOut()
|
|
4. ポートとアドレスのリダイレクション
|
|
4.1 PacketAliasRedirectPort()
|
|
4.2 PacketAliasRedirectAddr()
|
|
4.3 PacketAliasRedirectDelete()
|
|
5. フラグメント操作
|
|
5.1 PacketAliasSaveFragment()
|
|
5.2 PacketAliasGetFragment()
|
|
5.3 PacketAliasFragmentIn()
|
|
6. その他の関数
|
|
6.1 PacketAliasSetTarget()
|
|
6.2 PacketAliasCheckNewLink()
|
|
6.3 PacketAliasInternetChecksum()
|
|
7. 作者
|
|
8. 謝辞
|
|
|
|
付録 A: 概念的背景
|
|
A.1 エイリアシング・リンク
|
|
A.2 静的および動的リンク
|
|
A.3 部分的定義によるリンク
|
|
A.4 動的リンクの生成
|
|
.Ed
|
|
|
|
.Sh 1. 序文
|
|
このライブラリは、IP のローカルネットワークアドレスの変換
|
|
および変換処理サポート用にデザインされた関数です。
|
|
ローカルネットワークの未登録の IP アドレスから発信するパケットは、
|
|
アクセス可能な IP アドレスから来たかのように見せかけることができます。
|
|
外から入ってくるパケットに対しては、
|
|
ローカルネットワーク上の正しいマシンに送られるよう
|
|
エイリアス解除されます。
|
|
|
|
パケットエイリアシングエンジンには、
|
|
ある程度の柔軟性が組み込まれています。
|
|
もっとも簡単な操作では、
|
|
ローカルネットワークアドレスとパケットエイリアスホストとの間で
|
|
多対 1 対応付けが行なわれます。
|
|
これは仮装 IP として知られていることです。
|
|
更に、ローカルアドレスとパブリックアドレスの間での
|
|
1 対 1 対応付けも実装することが可能で、
|
|
静的 NAT として知られています。
|
|
これらの間には、異なるプライベートアドレスのグループを
|
|
それぞれ異なるパブリックアドレスにリンクさせることができ、
|
|
その中にははっきりした多対 1 対応もいくつか見られます。
|
|
更に、パブリックアドレスおよびポートは
|
|
固定的にプライベートアドレスおよびポートに
|
|
リダイレクトさせることができます。
|
|
|
|
パケットエイリアシングエンジンは、
|
|
カーネル外部のユーザ空間で作用するように設計されており、
|
|
そのためプライベートなカーネルデータ構造へのアクセスは不要です。
|
|
ただし、ソースコードはカーネル環境に組み込むことができます。
|
|
|
|
.Sh 2. 初期化と制御
|
|
2 つの特殊な関数、
|
|
PacketAliasInit() および PacketAliasSetAddress() は、
|
|
パケット操作が完了する前に呼ぶ必要があります。
|
|
また、パケットエイリアシングエンジンの操作モードに対し
|
|
PacketAliasSetMode() 呼び出しによりカスタマイズできます。
|
|
.Ss 2.1 PacketAliasInit()
|
|
|
|
.Ft void
|
|
.Fn PacketAliasInit "void"
|
|
|
|
この関数には引数がなく、また戻り値もありません。
|
|
内部データ構造の初期化に使用されます。
|
|
以下に示すモードビットは
|
|
PacketAliasInit() の呼び出し後、必ずセットされます。
|
|
これらのモードビットの意味については、
|
|
セクション 2.3 を参照してください。
|
|
.Bd -literal -offset indent
|
|
PKT_ALIAS_USE_SAME_PORTS
|
|
PKT_ALIAS_USE_SOCKETS
|
|
PKT_ALIAS_RESET_ON_ADDR_CHANGE
|
|
|
|
.Ed
|
|
この関数はパケットエイリアスエンジンに対し、
|
|
常時同一の初期状態を返します。
|
|
PacketAliasSetAddress() 呼び出しは、これに続いて行ないます。
|
|
また、前述したデフォルトモードビットを変更する場合は
|
|
PacketAliasSetMode() を呼び出します。
|
|
|
|
この関数呼び出しは、
|
|
パケット操作の前にプログラム開始段階で実行する必要があります。
|
|
.Ss 2.2 PacketAliasUninit()
|
|
|
|
.Ft void
|
|
.Fn PacketAliasUninit "void"
|
|
|
|
この関数には引数も戻り値もなく、
|
|
内部データ構造に設定された値をクリアする場合に使用されます。
|
|
|
|
この関数はプログラムでエイリアスエンジンの使用を
|
|
停止させる場合に呼び出す必要があります。
|
|
それにより、ファイアウォールに空いた隙間を塞ぐことになります。
|
|
以前との互換性や特別なセキュリティを備えるために、
|
|
PacketAliasInit() が atexit() チェーンに付加されています。
|
|
何度呼び出しても問題はありません。
|
|
.Ss 2.3 PacketAliasSetAddress()
|
|
|
|
.Ft void
|
|
.Fn PacketAliasSetAddress "struct in_addr addr"
|
|
|
|
この関数は、ローカル領域のネットワーク外へ
|
|
パケットが発信する先のソースアドレスをセットします。
|
|
PacketAliasRedirectAddr() により生成された
|
|
静的アドレス対応により上書きされない限り、
|
|
発信パケットはすべてこのアドレスに再対応付けされます。
|
|
|
|
PKT_ALIAS_RESET_ON_ADDR_CHANGE モードビット
|
|
(デフォルト操作モード) が設定されている場合、
|
|
内部的なエイリアスリンクテーブルは、
|
|
エイリアスアドレスが変更されるたび、
|
|
PacketAliasReset() 呼び出しが行なわれたかのようにリセットされます。
|
|
これは一連のダイアルアップ操作の中で
|
|
IP アドレス状態に関わらず、
|
|
ppp のようなインタフェースに便利です。
|
|
|
|
PKT_ALIAS_RESET_ON_ADDR_CHANGE モードビットが
|
|
0 にセットされていた場合、この関数は、
|
|
パケット間のエイリアスの動的変更に使用できます
|
|
(オーバヘッドの少ない呼び出しです)。
|
|
|
|
パケット操作の前にこの関数を呼び出す必要があります。
|
|
.Ss 2.4 PacketAliasSetMode()
|
|
|
|
.Ft unsigned int
|
|
.Fn PacketAliasSetMode "unsigned int mode" "unsigned int mask"
|
|
|
|
この関数は、
|
|
.Em mode
|
|
値に従ってモードビットの設定をクリアを行ないます。
|
|
.Em mask
|
|
により示されたビットだけが対象となります。
|
|
以下に示すモードビットは alias.h で定義されています。
|
|
.Bl -hang -offset left
|
|
.It PKT_ALIAS_LOG.
|
|
/var/log/alias.log ファイルへのロギングを可能にします。
|
|
ログファイルには、エイリアス・リンクの作成、削除のたびに
|
|
icmp、tcp、udp へのリンク回数が記録されます。
|
|
ログファイルが "tail -f" により継続的に見ることができれば、
|
|
主としてデバッグ用として有効です。
|
|
.It PKT_ALIAS_DENY_INCOMING.
|
|
このモードビットが設定されていると、
|
|
TCP 接続や UDP トランザクションに関連する
|
|
外部から着信するあらゆるパケットは、
|
|
呼び出しプログラムで無視 (PacketAliasIn() であれば
|
|
PKT_ALIAS_IGNORED を返す) するための印が付けられます。
|
|
パケットのエイリアスホストや
|
|
ローカルネットワークから発生した接続や
|
|
トランザクションに対するレスポンスに対する影響はありません。
|
|
このモードビットは片方向のファイアウォールを実装する時に有効です。
|
|
.It PKT_ALIAS_SAME_PORTS.
|
|
このモードビットが設定されていると、
|
|
パケットエイリアスエンジンは実際のローカルポート番号を
|
|
そのままエイリアスポート番号にしようとします。
|
|
このことは
|
|
(proto, alias addr, alias port, remote addr, remote port) の
|
|
5 つのパラメータのペアが一意であれば可能です。
|
|
競合が起きる場合は、このビットが設定されていても
|
|
エイリアスポート番号には別の番号が選択されます。
|
|
.It PKT_ALIAS_USE_SOCKETS.
|
|
このビットは、エイリアスホストがパケット移送時のように
|
|
ネットワーク上にトラフィックを発生させる場合必ず設定します。
|
|
パケットエイリアスホストが不明なホストアドレスや
|
|
不明のポート番号 (例えば、FTP データ接続時)
|
|
からの接続を待っている時は、このモードビットは、
|
|
ポートの競合が起きないように
|
|
プレースホルダとしてソケットの割り当てを定義します。
|
|
接続が確立されると、
|
|
通常は 1 分ほどでソケットは閉じられます。
|
|
.It 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 PKT_ALIAS_RESET_ON_ADDR_CHANGE.
|
|
このモードビットが設定されており、PacketAliasSetAddress() が
|
|
エイリアスアドレス変更のために呼ばれるケースでは、
|
|
パケットエイリアスエンジンの内部リンクテーブル内容がクリアされます。
|
|
この操作モードは、
|
|
ダイアルアップ間でのインタフェースアドレスを変更したり、
|
|
変更せずにおく ppp リンクの場合に有効です。
|
|
このモードビットが設定されていない場合、
|
|
リンクテーブルはアドレスが変更されてもリセットされません。
|
|
.It PKT_ALIAS_PUNCH_FW.
|
|
このオプションにより、libalias は、
|
|
FTP/IRC DCC 接続に対する ipfw ベースのファイアウォールの
|
|
`隙間' を作ることになります。
|
|
開けられた隙間は IP アドレスやポートと結び付いており、
|
|
別の接続に使用することはできません。
|
|
隙間はそれを使用している接続が消滅すれば除去されます。
|
|
libalias を使用しているプログラムを強制的に終了させる
|
|
(例えば kill -9) 仕組みは、フラグの状態により、
|
|
隙間に割り当てられた全 ipfw 領域をクリアすることで実現されています。
|
|
このことはまた PacketAliasSetFWBase() に対する
|
|
初期呼び出しでも起こります。
|
|
この呼び出しはフラグの設定の前に行なう必要があります。
|
|
|
|
.El
|
|
|
|
.Ss 2.5 PacketAliasSetFWBase()
|
|
|
|
.Ft void
|
|
.Fn PacketAliasSetFWBase "unsigned int base" "unsigned int num"
|
|
|
|
IPFW に (PKT_ALIAS_PUNCH_FW フラグにより)
|
|
ファイアウォールの隙間に対する領域を割り当てます。
|
|
領域は全初期化ルールに従いクリアされます。
|
|
|
|
.Sh 3. パケット操作
|
|
パケット処理関数は、着信 (リモート -> ローカル)
|
|
および発信 (ローカル -> リモート) パケットの修正に使用されます。
|
|
ネットワークインタフェース経由でのパケットの送受信は、
|
|
呼び出し側プログラムが行ないます。
|
|
|
|
PacketAliasInit() および PacketAliasSetAddress() とともに、
|
|
PacketAliasIn() と PacketAliasOut() の
|
|
2 つのパケット処理ルーチンが基本的な、
|
|
見かけの IP 実装に必要な最小機能として用意されています。
|
|
.Ss 3.1 PacketAliasIn()
|
|
|
|
.Ft int
|
|
.Fn PacketAliasIn "char *buffer" "int maxpacketsize"
|
|
|
|
リモートのマシンからローカルネットワークへの着信パケットは
|
|
この関数によりエイリアス解除されます。
|
|
IP パケットは引数
|
|
.Em buffer
|
|
で指定されます。
|
|
.Em maxpacketsize
|
|
はパケットを含むデータ構造の長さを示しており、
|
|
実際のパケット長より大きくとる必要があります。
|
|
|
|
戻りコード :
|
|
.Bl -hang -offset left
|
|
.It PKT_ALIAS_ERROR.
|
|
パケットエイリアシングエンジン内で発生した内部エラー。
|
|
.It PKT_ALIAS_OK.
|
|
パケットエイリアシング処理は成功しました。
|
|
.It PKT_ALIAS_IGNORED.
|
|
パケットは無視され、エイリアスは解除されませんでした。
|
|
これは、プロトコルが認識されないとき、
|
|
ICMP のメッセージタイプは処理されていないか、
|
|
あるいは新たな接続についての入力パケットが
|
|
無視されたときに発生します
|
|
(セクション 2.2 の PKT_ALIAS_DENY_INCOMING を参照してください)。
|
|
.It PKT_ALIAS_UNRESOLVED_FRAGMENT.
|
|
ヘッダフラグメントが未送信のため
|
|
フラグメントが解消されないときにこのコードが返されてきます。
|
|
この場合、フラグメントはヘッダフラグメントが見つかるまで
|
|
PacketAliasSaveFragment() により保存しておく必要があります。
|
|
.It PKT_ALIAS_FOUND_HEADER_FRAGMENT.
|
|
パケットエイリアシング処理は成功し、
|
|
ヘッダフラグメントも見つかりました。
|
|
これは解消されていないフラグメントを、
|
|
PacketAliasGetFragment() により探し、
|
|
PacketAliasFragmentIn() を使って
|
|
エイリアス解除する時のシグナルとなります。
|
|
.El
|
|
.Ss 3.2 PacketAliasOut()
|
|
|
|
.Ft int
|
|
.Fn PacketAliasOut "char *buffer" "int maxpacketsize"
|
|
|
|
ローカルネットワークからリモートのマシンへ発信するパケットは、
|
|
この関数によりエイリアスされます。
|
|
IP パケットは引数
|
|
.Em buffer
|
|
で指定され、
|
|
.Em maxpacketsize
|
|
はパケットが取りうる最大長を示します。
|
|
IP 表現形式プロトコルは、アドレスと、修正され、
|
|
またパケット長の変更にからむ一連のデータ内のポート情報を設定します。
|
|
プロトコルのよく知られた事例としては、
|
|
FTP と IRC DDC があります。
|
|
|
|
戻りコード :
|
|
.Bl -hang -offset left
|
|
.It PKT_ALIAS_ERROR.
|
|
パケットエイリアシング内で発生した内部エラー。
|
|
.It PKT_ALIAS_OK.
|
|
パケットエイリアシング処理は成功しました。
|
|
.It PKT_ALIAS_IGNORED.
|
|
パケットは無視され、エイリアス解除はされませんでした。
|
|
これはプロトコルが認識されないときか、あるいは ICMP
|
|
メッセージタイプが処理されないときに発生します。
|
|
.El
|
|
|
|
.Sh 4. ポートとアドレスのリダイレクション
|
|
このセクションで解説している関数は、
|
|
ローカルネットワーク上のマシンにおいて、
|
|
外部ネットワークから新たな着信に対するアクセスをある程度可能にします。
|
|
個々のポートは、再対応付けや
|
|
固定的なネットワークアドレスの変換を定義することができます。
|
|
.Ss 4.1 PacketAliasRedirectPort()
|
|
|
|
.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
|
|
|
|
この関数は、所定のリモートアドレスやポートから
|
|
エイリアスアドレスやポートへのトラフィックを、
|
|
指定されたローカルアドレスやポートへのリダイレクトを定義します。
|
|
パラメータ
|
|
.Em proto
|
|
は IPPROTO_TCP か IPPROTO_UDP のどちらかに該当し、
|
|
<netinet/in.h> で定義されます。
|
|
|
|
.Em local_addr
|
|
あるいは
|
|
.Em alias_addr
|
|
が 0 ならば、パケットエイリアシングアドレスは
|
|
PacketAliasSetAddress() で設定されたものを使用します。
|
|
PacketAliasRedirectPort() 呼び出しの後で
|
|
PacketAliasAddress() 呼び出しが実行され、
|
|
アドレスが変更されても、
|
|
引数が 0 の場合これは無効になります。
|
|
|
|
.Em remote_addr
|
|
が 0 の場合、
|
|
パケットをリモートアドレスからリダイレクトします。
|
|
同様に、
|
|
.Em remote_port
|
|
が 0 の場合、リモートのポート番号から発生した
|
|
パケットをリダイレクトします。
|
|
通常、リモートポート定義は 0 ですが、
|
|
ファイアウォールに対しては 0 でない
|
|
リモートアドレスが有効な場合があります。
|
|
PacketAliasRedirectPort() 呼び出しにより、
|
|
アドレスとポート定義が重複した場合、
|
|
最新の呼び出しが優先されます。
|
|
|
|
この関数は次いで
|
|
PacketAliasRedirectDelete() で使用するポインタを返します。
|
|
ヌルが返された場合、関数呼び出しは正常に終了していません。
|
|
|
|
あらゆるポートアドレスは、
|
|
ネットワークアドレスのバイトオーダ表記に従っています。
|
|
これらのパラメータは htons() を使用して、
|
|
内部的な数値形式からネットワークバイトオーダ表記に
|
|
変換する必要があります。
|
|
アドレスもまた同様にネットワークバイトオーダ形式であり、
|
|
.Em struct in_addr
|
|
データ型で暗黙に定義されます。
|
|
.Ss 4.2 PacketAliasRedirectAddr()
|
|
|
|
.Ft struct alias_link *
|
|
.Fo PacketAliasRedirectAddr
|
|
.Fa "struct in_addr local_addr"
|
|
.Fa "struct in_addr alias_addr"
|
|
.Fc
|
|
|
|
この関数は、
|
|
.Em alias_addr
|
|
への全着信トラフィックを
|
|
.Em local_addr
|
|
にリダイレクトします。同様に、
|
|
.Em local_addr
|
|
からの全発信トラフィックは
|
|
.Em alias_addr
|
|
にエイリアスされます。
|
|
|
|
.Em local_addr
|
|
または
|
|
.Em alias_addr
|
|
が 0 の場合、PacketAliasSetAddress() により設定された
|
|
パケットエイリアシングアドレスが使用されます。
|
|
PacketAliasAddress() は
|
|
PacketAliasRedirectAddr() の呼び出し後に
|
|
アドレス変更のために呼び出されても無効です。
|
|
|
|
PacketAliasRedirectAddr() に対する一連の呼び出しが
|
|
同一のエイリアシングアドレスを使用している場合、
|
|
このエイリアシングアドレスへの新たな全着信トラフィックは、
|
|
最後の関数呼び出しで作られたローカルアドレスへリダイレクトされますが、
|
|
いくつかの関数呼び出しで指定されたローカルマシンからの
|
|
新たな全トラフィックは、
|
|
同一のアドレスにリダイレクトされます。
|
|
.Bd -literal -offset left
|
|
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
|
|
|
|
192.168.0.2, 192.168.0.3 および 192.168.0.4 から、
|
|
telnet や ftp などでの発信接続は
|
|
141.221.254.101 からでてきたかのようにみえます。
|
|
141.221.254.101 への着信接続は
|
|
192.168.0.4 にリダイレクトされます。
|
|
|
|
PacketAliasRedirectPort() に対する呼び出しより
|
|
PacketAliasRedirectAddr() で指定されたアドレス対応が必ず優先されます。
|
|
|
|
この関数は、PacketAliasRedirectDelete() が使用するポインタを返します。
|
|
ヌルが返される場合、関数呼び出しは正常に終了していません。
|
|
.Ss 4.3 PacketAliasRedirectDelete()
|
|
|
|
.Ft void
|
|
.Fn PacketAliasRedirectDelete "struct alias_link *ptr"
|
|
|
|
この関数は、PacketAliasRedirectPort() あるいは
|
|
PacketAliasRedirectAddr() が設定した
|
|
特定の静的リダイレクトルールを削除します。
|
|
パラメータ
|
|
.Em ptr
|
|
は、いずれかのリダイレクション関数から返されてくるポインタです。
|
|
正しくないポインタが PacketAliasRedirectDelete() に渡されると、
|
|
プログラムはクラッシュするか、予期せぬ動作結果となります。
|
|
そのためにこの関数の使用に際しては注意が必要です。
|
|
|
|
.Sh 5. フラグメント操作
|
|
このセクションの関数は着信フラグメント操作で使用されます。
|
|
|
|
発信フラグメントは、PacketAliasRedirectAddress() で設定した
|
|
適用可能な対応付によるアドレス変更により、
|
|
または PacketAliasSetAddress() で設定した
|
|
エイリアシングアドレスの省略時値により、
|
|
PacketAlaisOut() 内で処理されます。
|
|
|
|
着信フラグメントは 2 通りの方法で処理されます。
|
|
フラグメント化された
|
|
IP パケットのヘッダが既に分かっている場合は、
|
|
一連のフラグメントはヘッダフラッグメントと
|
|
同じ方式で再対応付けされます。
|
|
フラグメントはヘッダが到着する前に保存され、
|
|
ヘッダフラグメントが消滅した段階で取り出されます。
|
|
.Ss 5.1 PacketAliasSaveFragment()
|
|
|
|
.Ft int
|
|
.Fn PacketAliasSaveFragment "char *ptr"
|
|
|
|
PacketAliasIn() から
|
|
PKT_ALIAS_UNRESOLVED_FRAGMENT が返されてくると、この関数が、
|
|
残っているフラグメントのポインタを保存するために使用できます。
|
|
|
|
引数
|
|
.Em ptr
|
|
は malloc() で割り当てられたメモリブロックを
|
|
指すことが暗黙のうちに仮定されています。
|
|
フラグメントが解決されない場合、
|
|
パケットエイリアシングエンジンは
|
|
タイムアウト時間経過後、自動的にメモリを解放します
|
|
[実質的には、この関数は、
|
|
メモリ解放のコールバック関数が
|
|
引数として渡されるように修正しておく必要があります]。
|
|
|
|
この関数は、正常実行の場合 PKT_ALIAS_OK を返し、
|
|
エラーの場合 PKT_ALIAS_ERROR を返します。
|
|
.Ss 5.2 PacketAliasGetNextFragment()
|
|
|
|
.Ft char *
|
|
.Fn PacketAliasGetFragment "char *buffer"
|
|
|
|
この関数は、PacketAliasSaveFragment() で保管された
|
|
フラグメントポインタの再取り出しができます。
|
|
.Em buffer
|
|
で示す IP ヘッダフラグメントは、PacketAliasIn() が
|
|
PKT_ALIAS_FOUND_HEADER_FRAGMENT を返したときに指定される
|
|
ヘッダフラグメントです。
|
|
フラグメントのポインタが再取り出しされると、
|
|
呼び出しプログラムによりフラグメントに
|
|
動的に割り当てられていたメモリが解放されます。
|
|
|
|
フラグメントがなくなるで
|
|
PacketAliasGetFragment() を続けて呼ぶことができます。
|
|
処理するフラグメントがなくなるとヌルが返されてきます。
|
|
.Ss 5.3 PacketAliasFragmentIn()
|
|
|
|
.Ft void
|
|
.Fn PacketAliasFragmentIn "char *header" "char *fragment"
|
|
|
|
PacketAliasGetFragment() によりフラグメントの再取得を行なうとき、
|
|
PacketAliasFragmentIn() 呼び出しを実行して
|
|
フラグメントのエイリアスを解除できます。
|
|
引数
|
|
.Em header
|
|
は、テンプレートとして使われているヘッダフラグメントのポインタです。
|
|
引数
|
|
.Em fragment
|
|
はエイリアス解除するパケットのポインタです。
|
|
|
|
.Sh 6. その他の関数
|
|
|
|
.Ss 6.1 PacketAliasSetTarget()
|
|
|
|
.Ft void
|
|
.Fn PacketAliasSetTarget "struct in_addr addr"
|
|
|
|
既存のエイリアスリンクと関連のない
|
|
外からの着信パケットがホストマシンに到着すると、
|
|
それは PacketAliasSetTarget() 呼び出しにより
|
|
指定されるアドレスへ送られます。
|
|
|
|
この関数が呼ばれないか、あるいは指定アドレスが 0 の場合、
|
|
外からのあらゆる新規着信パケットは
|
|
PacketAliasSetAddress で設定されるアドレスへ行きます。
|
|
.Ss 6.2 PacketAliasCheckNewLink()
|
|
|
|
.Ft int
|
|
.Fn PacketAliasCheckNewLink "void"
|
|
|
|
新規のエイリアシングリンクが生成されると、
|
|
この関数は 0 以外の値を返します。
|
|
外からの着信トラフィックが順次異なるサーバへ送られるという状況下で、
|
|
この関数を PacketAliasSetTarget() 呼び出しを
|
|
デフォルトの目的アドレスを変更のため実行するときのトリガにできます。
|
|
.Ss 6.3 PacketAliasInternetChecksum()
|
|
|
|
.Ft u_short
|
|
.Fn PacketAliasInternetChecksum "u_short *buffer" "int nbytes"
|
|
|
|
これはよそでは使うことがありませんが、
|
|
便利なユーティリティ関数です。
|
|
インターネットチェックサムを計算します。
|
|
チェックサムは、IP およびプロトコル
|
|
(TCP, UDP, ICMP) 固有のヘッダのどちらでも使われています。
|
|
|
|
引数
|
|
.Em buffer
|
|
はチェックサムを取るデータブロックを指しています。また
|
|
.Em nbytes
|
|
はバイト数を与えます。
|
|
16 ビットのチェックサムフィールドは
|
|
チェックサム計算の前に 0 クリアされます。
|
|
|
|
チェックサムはチェックサム自身を含めた
|
|
データブロックの操作により検証することができます。
|
|
チェックサムが正しければ、
|
|
PacketAliasInternetChecksum() は 0 を返します。
|
|
|
|
.Sh 7. 作者
|
|
Charles Mott (cmott@srv.net), versions 1.0 - 1.8, 2.0 - 2.4.
|
|
|
|
Eivind Eklund (eivind@freebsd.org), versions 1.8b, 1.9 および 2.5.
|
|
アーキテクチャにおける数々の改善による貢献のほかに、
|
|
IRC DCC に関するサポートを行ないました。
|
|
ならびに FTP/IRC DCC のファイアウォールのバイパスです。
|
|
|
|
.Sh 8. 謝辞
|
|
|
|
以下、概略時代順に示すのは、
|
|
有益なコメントやデバッグの手助けを提供してくれた人々の名前です。
|
|
|
|
.Bl -inset -compact -offset left
|
|
.It Gary Roberts
|
|
.It Tom Torrance
|
|
.It Reto Burkhalter
|
|
.It Martin Renters
|
|
.It Brian Somers
|
|
.It Paul Traina
|
|
.It Ari Suutari
|
|
.It Dave Remien
|
|
.It J. Fortes
|
|
.It Andrzej Bialeki
|
|
.It Gordon Burditt
|
|
.El
|
|
|
|
.Sh 付録: 概念的な背景
|
|
この付録は、ソースコードの修正を検討している人や、
|
|
パケットエイリアシング関数を使用して
|
|
やや難解なアプリケーションを作成する人を対象としています。
|
|
|
|
ここにはパケットエイリアシングエンジンの
|
|
概念的なフレームワークが記述されています。
|
|
議論の中心は、ローカルマシンとエイリアスされた識別子
|
|
およびリモートマシン間の指定された
|
|
パケットトランザクションの関係を定義している
|
|
"エイリアシング リンク" に考え方についてです。
|
|
こうしたリンクがどのように発生して
|
|
また消滅するかについて検討されています。
|
|
.Ss A.1 エイリアシングリンク
|
|
"エイリアシング リンク" は、
|
|
7 つの要素で記述できるという考え方があります:
|
|
.Bd -literal -offset indent
|
|
(ローカルアドレス、 ローカルポート番号、
|
|
エイリアスアドレス、エイリアスポート番号、
|
|
リモートアドレス、リモートポート、プロトコル)
|
|
.Ed
|
|
|
|
外へ発信するパケットは、
|
|
ローカルアドレスとローカルポート番号が、
|
|
エイリアスアドレスとエイリアスポート番号で置き換えられます。
|
|
外から着信するパケットは、逆のプロセスで処理されます。
|
|
パケットエイリアシングエンジンは、
|
|
エイリアシングリンクの内部テーブルに対してパケットを対応させ、
|
|
指定 IP パケットの修飾方法を決定しようとします。
|
|
IP ヘッダおよびプロトコルに依存するヘッダのどちらも
|
|
必要に応じて修正されます。
|
|
エイリアシングリンクは、ネットワークのトラフィックにより、
|
|
必要に応じて生成、消滅が行なわれます。
|
|
|
|
プロトコルは、ある状況では TCP か UDP であり、
|
|
または ICMP であってかまいません
|
|
(ICMP のある種のパケットタイプには、
|
|
個々のパケットの処理方式を決めるポート番号と同様な働きをする、
|
|
一連の id 番号にエイリアスすることができるものがあります)。
|
|
|
|
それぞれのエイリアスリンクは
|
|
次の 5 つの数値の組合せを持っていなければなりません。
|
|
すなわち、エイリアスアドレス / ポート、
|
|
リモートアドレス / ポート、およびプロトコルです。
|
|
このことによりローカルネットワーク上のいくつかのマシンは
|
|
同じエイリアス IP アドレスを共有することが可能となります。
|
|
競合が起こるケースでは、エイリアシングポートが、
|
|
一意性が保てるよう選択されます。
|
|
.Ss A.2 静的および動的リンク
|
|
エイリアシングリンクには静的および動的なものがあります。
|
|
静的リンクは無期限に存続し、IP パケットの変換に関しては
|
|
固定された規則を保持しています。
|
|
動的リンクは個別の TCP 接続や UDP トランザクションの
|
|
エコーシーケンスに対して生成されます。
|
|
TCP の場合は、関連するエイリアシングリンクを
|
|
何時削除するべきかを知るために、接続を監視できます。
|
|
UDP トランザクション (および ICMP エコーとタイムスタンプ要求) は
|
|
単純なタイムアウト規則で動いています。
|
|
一定の時間、動的リンクを張るアクティビティが無いときは、
|
|
自動的に削除されます。
|
|
タイムアウト規則は適切なオープン / クローズを行なわない
|
|
TCP 接続にも適用されます。
|
|
.Ss A.3 エイリアシングリンクの部分定義
|
|
エイリアシングリンクは部分的な定義が可能です。
|
|
これはリモートアドレスおよび (または)
|
|
リモートポートが不明である場合に行ないます。
|
|
この場合、不完全な定義のパケットが見つかると、
|
|
完全仕様の動的リンクが生成されます。
|
|
元々の部分定義のリンクが動的なものである場合、
|
|
完全仕様のリンクが生成された後それは削除され、
|
|
そうでない場合無期限に残ることになります。
|
|
|
|
たとえば、部分定義リンクは次の通りです。
|
|
.Bd -literal -offset indent
|
|
(192.168.0.4, 23, 204.228.203.215, 8066, 0, 0, tcp)
|
|
.Ed
|
|
|
|
0 の値はリモートアドレスおよびポートの未定義部分を表しています。
|
|
リンクが静的なものであれば、
|
|
外から着信してくる全トラフィックを
|
|
アドレス 204.228.203.215 のポート 8066 から、
|
|
ローカルネットワーク上の 192.168.0.4 のアドレスを持つマシンの
|
|
ポート 23 (telnet) へリダイレクトすることになります。
|
|
.Ss A.4 動的リンクの生成
|
|
エイリアシングリンクに加え、
|
|
パケットエイリアシング機構を持つ
|
|
内部データテーブルに格納できるアドレス対応表があります。
|
|
.Bd -literal -offset indent
|
|
(ローカルアドレス、エイリアスアドレス)
|
|
.Ed
|
|
|
|
アドレス対応表は動的リンク生成時に必要とされます。
|
|
|
|
ローカルネットワークから外へ発信するあらゆるパケットは、
|
|
既存の完全定義されたリンクと一致していなければ、
|
|
動的リンクを自動的に生成します。
|
|
これは発信するパケットに関し、
|
|
アドレス対応があれば使用されるエイリアスアドレスを決定します。
|
|
対応が無ければ、
|
|
デフォルトアドレスが通常エイリアシングホストのアドレスですが、
|
|
使用されます。
|
|
必要であれば、デフォルトアドレスは
|
|
個々のパケットが到着するたびに変更できます。
|
|
|
|
エイリアシングポート番号は、
|
|
新たな動的リンクが既存のリンクと競合しないよう決められます。
|
|
デフォルト操作モードでは、パケットエイリアシングエンジンは
|
|
ローカルポート番号と同じ番号を
|
|
エイリアシングポートとして設定しようとします。
|
|
その結果競合すれば、ポート番号は一意なエイリアシングリンクとなるまで
|
|
無作為に選択が行なわれます。
|
|
予備の操作モードでは、
|
|
エイリアシングポートの最初の選択は無作為に、
|
|
またローカルポート番号と無関係に行なわれます。
|