stone で UDP と TCP の相互 変換を実装してみた (stone.c 2.3.1.10以降)。 つまり、UDP パケットが届いたら、 その頭にデータ長 (2バイト) を付けて 次図の形式のデータにして TCP セッションへ送信する。 あるいは逆に、 TCP セッションから次図の形式のデータを受信したら、 「データ長」の部分を取り除いて 「可変長データ」の部分を UDP パケットとして送信する。
┌──┬──┬──┬─≪─┬──┐ │データ長 │ 可変長データ │ └──┴──┴──┴─≫─┴──┘
もちろん「データ長」はネットワーク バイトオーダ (ビッグエンディアン)。 この形式は、 DNS の問合わせ/応答を TCP を使って行なう方法 (RFC1035 4.2.2. TCP usage) と 同じであるので、
# stone -n 192.168.1.1:domain/udp localhost:domain Jun 15 06:34:35.215996 16384 start (2.3c) [15707] Jun 15 06:34:35.248158 16384 stone 3: 192.168.1.1:53/udp <- 127.0.0.1:53
などと stone を実行 (TCP 53 を UDP 53 へ変換) しておいて、
% host -T www.gcd.org localhost Using domain server: Name: localhost Address: 127.0.0.1#53 Aliases: www.gcd.org has address 60.32.85.220 www.gcd.org has address 60.32.85.221 www.gcd.org has address 60.32.85.216
などと TCP で localhost への問合わせ (-T オプション) を行なうことができる。 すなわち、stone が TCP での問合わせを UDP に変換して ネームサーバ (192.168.1.1:53/udp) へ中継している。
あるいは逆に、
# stone -n 192.168.1.1:domain localhost:domain/udp Jun 15 06:38:36.660967 16384 start (2.3c) [18576] Jun 15 06:38:36.662647 16384 stone 3: 192.168.1.1:53 <- 127.0.0.1:53/udp
などと stone を実行 (UDP 53 を TCP 53 へ変換) しておいて、
% host www.klab.org localhost Using domain server: Name: localhost Address: 127.0.0.1#53 Aliases: www.klab.org has address 211.13.209.203
などと UDP で localhost へ問合わせることができる。 すなわち、stone が UDP の問合わせを TCP に変換して ネームサーバ (192.168.1.1:53) へ中継している。
この UDP TCP 相互変換機能を、 ssh や VPN-Warp などを使った (TCP) ポートフォワードと組合わせることにより、 UDP のポートフォワードが可能になる。