web-dev-qa-db-ja.com

ローカルポート間でトンネルを作成する簡単な方法は?

私は127.0.0.1:8000からのみアクセス可能で、192.168.1.x:8000からはアクセスできない開発サーバーを持っています。簡単なハックとして、ローカルネットワークから192.168.1.x:8001に接続して、クライアントと127.0の間のトラフィックをトンネルできるように、別のポート(たとえば8001)でリッスンする何かを設定する方法はありますか.0.1:8000?

83
waitinforatrain

Sshを使用するのが最も簡単なソリューションです。

ssh -g -L 8001:localhost:8000 -f -N [email protected]

これにより、ワークステーションのローカルポート8001が、remote-server.comポート8000​​のlocalhostアドレスに転送されます。
-gは、ネットワーク上の他のクライアントがワークステーションのポート8001に接続できるようにすることを意味します。そうでない場合、ワークステーション上のローカルクライアントのみが転送ポートに接続できます。
-Nは、ポートの転送のみを行うことを意味し、シェルを起動しないでください。
-fは、SSH接続とログインが成功した後でバックグラウンドに分岐することを意味します。
ポート8001は、sshが終了するか強制終了されるまで、多くの接続で開いたままになります。 Windowsを使用している場合でも、優れたSSHクライアントPuTTYでこれを行うことができます。ローカルポートとしてlocalhost:8000と宛先として8001を使用し、設定にローカルポート転送を追加します。 PuTTYとの接続が成功した後で追加できます。

48
penguin359

サーバーでsocatを使用する場合:

socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000

デフォルトでは、socatは、マシン上の任意のIPv4またはIPv6アドレス(サポートされている場合)でTCPポート8001をリッスンします。tcp-listentcp4-listenまたはtcp6-listen、または,bind=that-addressを追加して特定のローカルアドレスに。

プロキシしている接続ソケットについても同様で、localhostの代わりに任意のアドレスを使用できます。アドレス解決をIPv4またはIPv6に制限する場合は、tcptcp4またはtcp6に置き換えます。アドレス。

ポート8000​​でリッスンしているサーバーの場合、接続は元のクライアントではなく、プロキシ(localhostの場合はlocalhost)からのものとして表示されます。サーバーが誰であるかをクライアントが認識できるようにするには、 DNATアプローチ (ただし、スーパーユーザー権限が必要です)を使用する必要があります。

105

従来のncを使用するのが最も簡単なソリューションです。

nc -l -p 8001 -c "nc 127.0.0.1 8000"

このバージョンのncは、Ubuntuのnetcat-traditionalパッケージに含まれています。 (update-alternativesまたはnc.traditionalと呼ぶ必要があります。)

Sshとは対照的に、これは暗号化されないことに注意してください。 1つのホストの外部で使用する場合は、そのことを覚えておいてください。

50
not-a-user

OpenBSD netcatは、LinuxおよびOS Xでデフォルトで利用できます。

OSX:

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &

Linux:

mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe

OS X bashで機能する別の方法は、 双方向パイプ を使用することです。他のUnixでも動作する可能性があります。

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0
27
Mark A.

ServerFaultで David Spillettanswer を引用する

rinetdはその仕事をするべきであり、そのためのWindowsバイナリは http://www.boutell.com/rinetd/ から取得できます(Linuxで同じものを探している人のために、rinetdはほぼすべてのディストリビューションの標準リポジトリなので、「apt-get install rinetd」または「yum install rinetd」などでインストールできます)

これは、構成ファイルを次の形式で取得する単純なバイナリです。

bindaddress bindport connectaddress connectport

例えば:

192.168.1.1 8001 127.0.0.1 8000

または

0.0.0.0 8001 127.0.0.1 8000

着信ポートをすべてのインターフェースにバインドする場合。

4
psychowood
iptables -t nat -A PREROUTING -p tcp --dport <Origin-port> -j REDIRECT --to-port <destination-port>

service iptables save
service iptables restart
3
Santanu Dey

これは、サーバー上の2つのudpポートをトンネルする新しい方法です。 https://github.com/9crk/udpeer

udpeer 8001 8002

テストする:

nc -u xxxx.com 8001
nc -u xxxx.com 8002
0
9crk

Mark A。 の回答に基づいて、Macで機能するように小さなTweakを作成する必要がありました(少なくともmacOS Mojaveバージョン10.14.4では)

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &
printf "" > a

そのprintfステートメントは重要なようです。そうしないと、ポート8000​​に接続するnetcatコマンドが実際に接続を試みたり、ポート8001をリッスンするnetcatコマンドが実際にポート8001をリッスンしたりしません。printfがないと、ポート8001に接続しようとするたびに、接続拒否。

私の仮定は、netcatは実際にソケット操作を行う前に、何らかの理由でstdinをブロックする必要がある(多分それは何らかの理由で読み取ろうとしている)ことです。そのため、printfステートメントがfifo aに書き込まないと、netcatコマンドはポート8001でリスニングを開始しません。

注:私はマークの投稿に答えを残していたでしょうが、まだ評判はありません。

0
Daniel K