2008年6月20日金曜日

ループバップアダプタとSSHポート転送で透過のような通信を確保する

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 の場合はアダプタ単位で無効化することで回避でき、具合がいいでしょう。


0 件のコメント:

コメントを投稿