IPv6 over UDP/IPv4 Tunnel

IPv6 over IPv4トンネルは、NAT側の支援なしには基本的にNATを越えることはできません。 しかし、IPv6 over IPv4トンネルの代わりにIPv6 over UDP/IPv4トンネルを使用することで、NATを越えることができるようになります。
現状では、IPv6 over IPv4トンネルの実装にNetgraphを使用していますので、FreeBSD上でのみ動作します。

DTCP では、UDPトンネルの使い方について、NATがある場合とない場合の2つのモードを持っています。

UDPトンネルを利用して、インターネット側から入ってくるIPv6パケットをサーバがクライアントに対して転送するためには、クライアント側のIPv4アドレスだけではなくポート番号もサーバ側が判っている必要があります。
このため、DTCPクライアントがDTCPサーバに対して待ち受けているポート番号も通知するように、DTCPプロトコルを拡張してあります。 これにより、NATがない場合には、トンネル開通直後から、双方向にやりとりができます。

しかし、NATが間にあると、状況が異なります。 NATはポート番号を動的に変化させるので、待ち受けているポート番号を事前にサーバ側に通知しておくことができません。
NATモードでは、クライアントは待ち受けているポート番号を通知しません。 代わりに、クライアント側からUDPトンネルに送られてくるパケットのsrcのポート番号に対してパケットを送出します。 したがって、NATモードでは、クライアント側からなんらかのIPv6パケットが送出されるまで、外部からのパケットは届くようにはなりません。
また、NATで動的に管理されているテーブル上にエントリがなくなると、外から接続ができなくなります。このため、定期的にIPv6パケットを外に投げてあげる必要があります。

□dtcpsの設定

UDPトンネルはng_ksocket(4)を用いて実現しています。 ただし、UDPトンネルのNATモードを正しく動かすためには、ng_ksocket(4)に対して、クライアント側からUDPトンネルに送られてくるパケットのsrcのポート番号に対してパケットを送出できるように、サーバ側については、ng_ksocket(4)に若干修正が必要です。 以下のパッチを当てて、ng_ksocket.koを作り直してください。 なお、UDPトンネルのNATモードを使用しないのであれば、ng_ksocket(4)を修正する必要はありません。 また、パッチはサーバ側にのみ必要で、クライアント側には必要ありません。

dtcpsを-Uオプションを指定して起動すると、IPv6 over UDP/IPv4トンネルでの接続要求を受け付けるようになります。

UDPトンネルではインタフェースは、gifNではなくngNを使用します。 デフォルトでは、ng0から始まりユニット番号の若いインタフェースから順に動的に割り当てます。 特定のユニット番号以降を使用したい場合は、-Iオプションで指定できます。

UDPトンネルに使用するポートはトンネル毎に割り当てます。ポート番号は、デフォルトでは、4028以降で空いているものを使用します。 ポート番号の下限は-bオプションで変更できます。

□dtcpcの使い方

dtcpcでIPv6 over UDP/IPv4トンネルを使用するには、-Uオプションを指定します。 NATがある場合は、併せて-nオプションを指定します。

UDPトンネルではインタフェースは、gifNではなくngNを使用します。 デフォルトでは、ng0を使用します。 変更したい場合は、-iオプションで指定します。

UDPトンネルに使用するポートは、デフォルトでは、4028を使用します。 ポート番号は-bオプションで変更できます。

□dtcpclientの使い方

dtcpclientでIPv6 over UDP/IPv4トンネルを使用するには、-Uオプションを指定します。 NATがある場合は、併せて-nオプションを指定します。

UDPトンネルではインタフェースは、gifNではなくngNを使用します。 デフォルトでは、ng0を使用します。 変更したい場合には、dtcpclient_script.confのtunifで使用したいインタフェースを指定します。

UDPトンネルに使用するポートは、デフォルトでは、4028を使用します。 ポート番号は-bオプションで変更できます。

NATモードの場合、定期的にIPv6パケットを送出する必要があります。 このための簡単なスクリプトをdtcpclient-pinger.shに置いてあります。 最近のdtcpclientでは、dtcpclient_script.confにup_command / down_commandを指定できるように拡張してあります。 /usr/local/etc/dtcpclient_script.confで、

up_command="/usr/local/etc/dtcpclient-pinger.sh IPv6ホスト &"
down_command="/usr/local/etc/dtcpclient-pinger.sh -k"
という感じに指定すると良いでしょう。 ここで、IPv6ホストには、DTCPサーバのIPv6アドレスなどを指定すると良いでしょう。

NAT箱の特定のポート宛に届いたパケットをdtcpclientが動作するホスト宛にフォワードするよう設定できる場合は、NAT箱に設定したポート番号を-Bオプションで指定できます。 この場合、定期的にIPv6パケットを送出する必要はありません。


All Rights Reserved, Copyright (C) 2006 Hajimu UMEMOTO
Last Modified May 26, 2006
ume@mahoroba.org