IPv4 オプションに、ソースルーティングと呼ばれる機能がある
これは、送信者が通信経路(ルーティング)を制御できるというものである
通常、通信経路(ルーティング)は、経路上のルータなどに委任しているのだけど、それをパケットの送信者が制御するというもの
ソースルーティングには、ストリクトソースルーティングとルーズソースルーティングの2種類がある
- ストリクトソースルーティングは、経路全てのアドレスを明記するというもので(明記していないルータは経由してはいけない)、インターネット上ではあまり現実的ではない
- ルーズソースルーティングは、経路上のポイントとなるルータのアドレスだけ明記するというもので、そのポイントとか送信先との間の経路はルータに委任するというもの
IPv4拡張自体が、40バイトしか空間がないので、設定できるIPv4アドレスは9個まで
netcat
いろいろなnetcatがソースルーティングに対応していると思うけど、私の記憶だと、オリジナルのnetcat は、FreeBSD上でコンパイルしたncはソースルーティングができたけど、Linux上でコンパイルするとできなくなったという記憶
(このソースルーティングしたくなった時のためだけに私は FreeBSD の仮想環境を一つ保存している)
また、Windows上のnc.exeは、クライアントとしてソースルーティング機能は使えないけど、ソースルーティングパケットを受信する側のサーバ側としては機能しているという記憶
なんか、ncat でもソースルーティングに対応しているようだけど、よく知らない。
StreamRelay.NET.exe
ver3.4.0.0 から、クライアント側でソースルーティングに対応した。
本体の対応
「-RemotePort」が0以上だと、TCP(またはUDP)クライアントとして動作するのですが、その際に以下のオプションで、その(TCPまたはUDPの)接続で、ソースルーティングに対応する
参考: ポートフォワーダとしての StreamRelay.NET.exe
-
-RemoteLSR ≪CSVなIPアドレスのリスト≫
-
-RemoteSSR ≪CSVなIPアドレスのリスト≫
-
-RemoteLSR2nd ≪CSVなIPアドレスのリスト≫
-
-RemoteSSR2nd ≪CSVなIPアドレスのリスト≫
-
LSR はルーズソースルーティングを意味
-
SSR はストリクトソースルーティングを意味
なので、
nc.exe -nvv -g 192.0.2.10,192.0.2.11 -G 4 192.0.2.1 80
⇔
StreamRelay.NET.exe -LocalPort 0 -RemotePort 80 -RemoteHost 192.0.2.1 -RemoteLSR 192.0.2.10,192.0.2.11
は同じ
UDP の場合も同様
nc.exe -nvv -u -g 192.0.2.10,192.0.2.11 -G 4 192.0.2.1 80
⇔
StreamRelay.NET.exe -LocalPort 0 -RemotePort 80 -RemoteHost 192.0.2.1 -RemoteLSR 192.0.2.10,192.0.2.11 -RemoteUdp
は同じ
本体の対応(分離接続)
bash仮想ネットワークファイルのお相手としての StreamRelay.NET.exeで紹介したように、2つの通信をそれぞれ入力と出力に分けて、一つの入出力とすることができる。
例えば、TCP接続の一本を入力用、もう一本のTCP接続を出力用という使い方もできる。(TCPだけじゃなくて、UDPと混在させることも可能)
それについても、ソースルーティングに対応している。
オプションの「RemoteLSR2nd」とか「RemoteSSR2nd」とか「2nd」と付いているのがそれ
StreamRelay.NET.exe -LocalPort 0 -RemotePort 80 -RemoteHost 192.0.2.1 -RemoteLSR 192.0.2.10,192.0.2.11 -RemotePort2nd 90 -RemoteHost2nd 192.0.2.2 -RemoteLSR2nd 192.0.2.20,192.0.2.21 -RemoteSeparateConnection
とすると、「Remote」と呼称される側の入力側は、192.0.2.10→192.0.2.11→192.0.2.1:80 という経路の通信であり、出力側は、192.0.2.20→192.0.2.21→192.0.2.2:90という経路の通信となる
プラグインの対応(stdioTCP.dll)
ポート番号の指定が「0」の時は、標準入出力になるという事で、そのリダイレクト先がTCPとなるプラグインなのですが、これについても以下のオプションでソースルーティングに対応した
- -RemoteInputTCPLSR ≪CSVなIPアドレスのリスト≫
- -RemoteInputTCPSSR ≪CSVなIPアドレスのリスト≫
- -RemoteOutputTCPLSR ≪CSVなIPアドレスのリスト≫
- -RemoteOutputTCPSSR ≪CSVなIPアドレスのリスト≫
- -RemoteTCPLSR ≪CSVなIPアドレスのリスト≫
- -RemoteTCPSSR ≪CSVなIPアドレスのリスト≫
元々、標準入出力のリダイレクト先なので、「入力」と「出力」を別々に設定できる。
なので、「Remote」と呼称される側の入力について、ルーズソースルーティングにするのが、
- -RemoteInputTCPLSR ≪CSVなIPアドレスのリスト≫
で、出力側だけルーズソースルーティングしたい場合は、
- -RemoteOutputTCPLSR ≪CSVなIPアドレスのリスト≫
入出力をルーズソースルーティングしたい場合は、
- -RemoteTCPLSR ≪CSVなIPアドレスのリスト≫
を指定する
当然だけど、このプラグインを呼び出すために、ポート番号は「0」。以下のオプションが必要
- -RemoteTCPHost
- -RemoteInputTCPHost
- -RemoteOutputTCPHost
上記で、標準入出力を TCP へリダイレクトするという設定なので、これがまず必要
プラグインの対応(stdioICMPTunnel.dll)
これもポート番号の指定が「0」の時は、標準入出力になるという事で、そのリダイレクト先がICMPTunnel などのトンネルプロトコルとなるプラグインなのですが、これについても以下のオプションでソースルーティングに対応した
- LSR=≪CSVなIPアドレスのリスト≫
- SSR=≪CSVなIPアドレスのリスト≫
これは、以下のオプションの一部として指定する
-LocalInputIcmpTunnel
-LocalOutputIcmpTunnel
-RemoteInputIcmpTunnel
-RemoteOutputIcmpTunnel
当然だが、IPv6 では無理だし、IPv4拡張にデータを含めるタイプのトンネルプロトコルの場合も無理。