2013-04-27 22:14:51 +0000 2013-04-27 22:14:51 +0000
189
189

sshトンネルを公開するには?

さて、 この の質問に戻りますが、私はMacで

ssh -R 8080:localhost:80 -N root@example.com

というコマンドを実行しています。しかし、トンネリングされているポートは公開されていません。私はリモートコンピュータ上でローカルポートを開けるようにするためにそのようなコマンドを実行しています。そして、リモートコンピュータのlocalhost上でポートを開くときには動作しますが、ローカルコンピュータからリモートコンピュータのパブリックIPアドレスにアクセスしようとすると、ポートが開いていないようです。誰でもアクセスできるようにIP上でトンネルを公開するにはどうすればいいのでしょうか?

EDIT: リモート側がすべてのインターフェイスにバインドするのではなく、ローカルホストにのみバインドしているようです。

EDIT 2: クライアントはMac OS X 10.6、サーバはLinux Mintですが、どちらもOpenSSHです。

回答 (7)

368
368
368
2013-05-06 06:11:42 +0000

ssh の man ページを確認すると、-R の構文は以下のようになっています。

-R [_bind\_address_:]_port_:_host_:_hostport_

`bindaddress`_ が省略された場合 (あなたの例のように)、ポートはループバックインターフェースのみにバインドされます。すべてのインタフェースにバインドするには、

ssh -R \*:8080:localhost:80 -N root@example.com

または

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

または

ssh -R "[::]:8080:localhost:80" -N root@example.com

を使用します。2 番目のバージョンでは、一般的な IPv4 専用バインドを作成し、ポートは IPv4 を介してすべてのインターフェイスでアクセス可能です。3番目のバージョンは、技術的にはおそらく最初のバージョンと同等ですが、ここでも::への単一のバインドのみを作成しています。これは、ポートがIPv6ネイティブでIPv4経由でアクセス可能であることと、 IPv4マップされたIPv6アドレス 経由でIPv4経由でアクセス可能であることを意味します (Windows, OpenBSDでは動作しません)。   ([::] はそうしないとグローバルと解釈される可能性があるので、引用符が必要です。)

OpenSSH sshd サーバを使っている場合、これを動作させるためにはサーバの GatewayPorts オプションが有効になっている必要があります (yes または clientspecified に設定) (サーバ上のファイル /etc/ssh/sshd_config をチェックしてください)。そうでない場合 (このオプションのデフォルト値は no)、サーバは常にループバックインターフェースのみでポートを強制的にバインドします。

40
40
40
2013-04-28 03:34:48 +0000

編集:

-g はローカルのフォワードポートでは動作しますが、必要なのはリバース/リモートのフォワードポートで、これは別のものです。

example.com はローカルフォワードポートで動作しますが、必要なのはリバース/リモートフォワードポートであり、これは別物です。

本質的には、GatewayPorts=clientspecified/etc/ssh/sshd_configを設定します。

—前回の(不正解)答え —

-gオプションを使用します。sshのmanページより。

-g Allows remote hosts to connect to local forwarded ports.
15
15
15
2013-10-29 12:09:40 +0000

これが完成のための私の答えです。

結局トンネリングにssh -R ...を使い、その上でネットワークトラフィックをsocatにリダイレクトするために127.0.0.1を使いました。

tunnel binded to 127.0.0.1: ssh -R mitm:9999:<my.ip>:8084 me@mitm

socat: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

その他のオプションとしては、その上にローカル専用のトンネルを作るという方法もありますが、こちらの方が much遅いと感じました

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost

10
10
10
2016-08-01 22:37:07 +0000

また、/etc/ssh/sshd_config を変更できる場合は、ダブルフォワードを使用することもできます。

最初にリモートマシン上のループバックデバイス上の一時的なポート(例: 10080)に転送し、次にそこでローカル転送を使って全てのインターフェイス上のポート10080を80にリダイレクトする:

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"
8
8
8
2013-04-28 13:58:50 +0000

ゲートウェイポート」というオプションを使います。

ssh -g -R REMOTE_PORT:HOST:PORT ...

これを使うには、おそらくサーバーのGatewayPorts yesに「/etc/ssh/sshd_config」を追加する必要があります。

2
2
2
2019-06-03 20:09:02 +0000

ホストをジャンプ は OpenSSH にかなり最近追加されたものです。これには中間部への SSH アクセスが必要ですが、追加の設定をしなくても動作するはずです。

ssh -J root@example.com remoteuser@localhost -p 8080

このコマンドは SSH に最初に root@example.com に接続し、そのマシンから localhost の 8080 番ポート (つまり、ジャンプホストからリモートホストに トンネリングされるポート) に remoteuser のユーザ名で接続を開始するように指示します。

0
0
0
2018-08-26 15:50:49 +0000

コマンドラインパラメータを使わずに ~/.ssh/config に設定を入れたい場合は、

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

のようにしてみてください。 リモートホストのファイアウォールで 808080 への接続を許可し、GatewayPorts 設定の /etc/ssh/sshd オプションが no に設定されていないことを確認してください。