ソースルーティング試験ツールとしてのStreamRelay.NET.exe

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](https://qiita.com/tomoki0sanaki/items/4bdfd7f47923b05aab80)

- -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](https://qiita.com/tomoki0sanaki/items/cf06b49fe293b5f65517)で紹介したように、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拡張にデータを含めるタイプのトンネルプロトコルの場合も無理。


---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)