SSHのポートフォワーディングを利用すると、直接経路がないホストのポートまでも、手軽に TCP 経路を確保できます。他ネットワークのゲートウェイまで SSH を接続し、ポートフォワーディングを利用してプライベートなサービスへのアクセスを確保する方法は、皆さんもよく利用されているのではないでしょうか。
例:手元のホストから辿りつけないホストのIPアドレス
192.168.30.1 : destination1
192.168.30.2 : destination2
192.168.30.3 : destination3
192.168.30.4 : destination4
例:destinaion1~4に辿りつける remotehost を経由した SSH ポートフォワーディング
Host remotehost
LocalForward 11000 destination1:1000
LocalForward 12000 destination1:2000
LocalForward 21000 destination2:1000
LocalForward 22000 destination2:2000
LocalForward 31000 destination3:1000
LocalForward 32000 destination3:2000
LocalForward 41000 destination4:1000
LocalForward 42000 destination4:2000
しかしこの方法では実際に connect() する際の宛先IPアドレス・ポート番号の両方、もしくは片方がかわってしまい、透過的とはいえません。
SSHで何段もポートフォワーディングしなければたどり着けないホストや、例えば IRC の DCC コネクションなどのように、プロトコル中に IP アドレスが含まれていたり、 Web ページの中にホストの IP アドレスが入るケースでは透過的な通信を確保したいケースもあります。
ここで、手元のホスドのループバックアダプタなどに接続先のホストのアドレスを割り当て、バインド先としてIPアドレスとポートを明示的に指定しポートフォワーディングを行うと、TCPのあらかじめ指定したポートだけでも、まるで透過的なようにアクセスできます。
例:ループバックアダプタと組み合わせて利用する SSH ポートフォワーディングの例(~/.ssh/config ファイルの例)
Host remotehost
LocalForward 192.168.30.1:1000 destination1:1000
LocalForward 192.168.30.1:2000 destination1:2000
LocalForward 192.168.30.2:1000 destination2:1000
LocalForward 192.168.30.2:2000 destination2:2000
LocalForward 192.168.30.3:1000 destination3:1000
LocalForward 192.168.30.3:2000 destination3:2000
LocalForward 192.168.30.4:1000 destination4:1000
LocalForward 192.168.30.4:2000 destination4:2000
なお、ループバックアダプタに 192.168.30.0/24 をアサインしている場合、本来 destination1~4 のセグメントにルーティングができるネットワーク上に移動したとすると、このループバックアダプタが邪魔をして通信に支障をきたします。このような場合には、 Windows の場合はアダプタ単位で無効化することで回避でき、具合がいいでしょう。