!!!Windows でのポートフォワードのツール http://www.fuji-climb.org/pf/JP/ {{ref PortForwarder-2.9.zip}} !!!コマンドによるポートフォワード http://www.sb.soft.iwate-pu.ac.jp/~yushi/memo/ssh_port_forward.html 内容そのまま。 !!ローカルポートの転送(-L オプション) ローカルからリモート方向へのトンネリングを実現する。 例1 (単純なフォワーディング) % ssh -L 1234:hostA:22 user@hostA % ssh -L 1234:localhost:22 user@hostA ローカルホストの1234ポートにアクセスするとhostAのポート22にアクセスできる。 例2 (ファイアーウォールの外から内部へアクセス可能) % ssh -L 1234:hostB:22 user@hostA ローカルホストの1234ポートにアクセスすると、hostA経由でhostBのポート22にアクセスできる。 直接は到達不可能なホストにもアクセス可能 例3 (ローカルポートのサービスを別ポートに転送) % ssh -L 1234:localhost:22 user@localhost ローカルのポート22で行われているサービスを1234からもアクセス可能にする !!リモートポートの転送(-R オプション) リモートホストからローカル方向へのトンネリングを実現する。 例1〜3までの逆方向を行えるだけで、基本的な機能は同じ。 例4 % ssh -R 1234:localhost:22 user@hostA hostAのポート1234にアクセスするとローカルホストのポート22にアクセスできる。 ローカルホストがファイアーウォール内、hostAがグローバルの場合便利。 例5 % ssh -R 1234:hostB:22 user@hostA hostAのポート1234にアクセスすると、ローカルホスト経由でhostBのポート22にアクセスできる。 例6 % ssh -R 1234:localhost:22 user@localhost 結果は例3と全く同じ。 !!ダイナミック転送 [[ダイナミック転送(SOCKS Proxy)]] !!ポートフォーワードのセキュリティ ssh サーバを 192.168.0.1 sshの接続元を 192.168.0.2 sshの転送先を 192.168.0.3 とする。 !ローカル転送 192.168.0.2 上で ssh -L 9999:192.168.0.3:9999 192.168.0.1 とポートフォワードした場合、 ssh_configでGatewayPorts no または、 -g オプションなし の場合は、 192.168.0.2上で localhost:9999 のみポートフォワードを受け付ける。 192.168.0.2:9999 の記述は内部、外部問わずポートフォワードを受け付けない。 ssh_configでGatewayPorts yes または、 -g オプションをつけると localhost 以外からの接続もポートフォワード可能になる。 !リモート転送 192.168.0.2上で 192.168.0.2# ssh -R 9999:192.168.0.3:9999 192.168.0.1 とポートフォワードした場合、 192.168.0.1上で localhost:9999 のみのポートフォワードを受け付ける。 192.168.0.1:9999 の記述は内部、外部問わずポートフォワードを受け付けない。 sshd_configでGatewayPorts yesとすると、外部からの接続もポートフォワード可能になる。 !!ポートフォワーディングを行う際に知っておきたいこと 暗号化される経路 暗号化が行われるのはローカルホスト〜リモートログイン先のホストまでである。 例2の場合、ローカルホスト〜hostA間は暗号化されるが、hostA〜hostB間は暗号化されない。 ユーザーの権限と利用できるポート ローカルホストの特権ポートでlistenする際にはsshコマンドの実行権限がrootと同等でなければならない。 リモートホストの特権ポートでlistenする際にはリモートログイン時のユーザー権限がrootと同等でなければならない。 ポートフォワーディングと組み合わせると便利なオプション !よく使うオプションの組合せ例 % ssh -C -N -f -L 1234:hostA:22 user@hostA % ssh -4 -N -f -L 1234:hostA:22 user@hostA このようなオプションで起動すると、ローカルホストの1234がhostAのポート22につながるようにポートフォワーディングが行われる。 加えて、-Cオプションによる圧縮、-fオプションによるバックグラウンドでの動作、-Nオプションによるリモートでのコマンド実行無し(通常はシェルが起動してしまう)という指定が可能。 簡単にまとめると、ポートフォワーディングのみを実現するプロセスが作れます。(しかもデータ圧縮をした転送) !よく使うオプションの簡単な説明 セッションの圧縮 (-C オプション) SSHを用いた通信経路において、データを圧縮した通信を行う。 設定ファイルに「圧縮レベル」や、「オプションなしでも常時圧縮」などの設定が可能。 リモートでコマンドを実行しない(-N オプション) リモートでのコマンド実行が行われないため、ポートフォワードのみを行いたい時に有効。 特に指定しない場合、SSHでのコネクションはリモートでシェルが起動する。 バックグラウンドで実行(-f オプション) 実行するとそれ移行バックグラウンドのプロセスとなる。 停止させるときはプロセスを探して普通にkillすればいい。 プロトコルの指定 (-1 , -2 オプション) プロトコルのバージョンを指定することができる。 数字がそのままバージョンを表している。 IPバージョンの指定 (-4 , -6 オプション) IPバージョンを指定することができる。 数字がそのままバージョンを表している。 !多段ポートフォワード ポートフォワード先からさらにポートフォワードする場合、 ssh コマンド を使って ssh -t -L 1000:localhost:1000 hostA ssh -L 1000:hostC:1000 hostB のように指定できる。 ssh コマンド はターミナルの割当を行わないため、-t オプションで強制的にターミナルを割り当てる必要がある。 !多段ポートフォワード(ProxyCommand) https://www.xmisao.com/2013/10/08/ssh-proxy-command.html ssh -oProxyCommand='ssh -W %h:%p X' A または、.ssh/configに Host server HostName 1.2.3.4 Host server-anotherserver HostName 5.6.7.8 Port 22 ProxyCommand ssh -W %h:%p server と書いて、 ssh server-anotherserver で多段ポートフォワードできる !!!configファイルによるポートフォワード !!ローカルフォワード LocalForward PortA Address2:PortB 指定方法はコマンドの場合と同じ {{category2 ネットワーク}}