あるローカルポートから別のローカルポートへのトンネルを作成する簡単な方法は?


76

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


4
netcatはこれを行うことができます。
アンディ

回答:


44

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

ssh -g -L 8001:localhost:8000 -f -N user@remote-server.com

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


4
何をしuser@remote-server.comますか?ポート転送には絶対に不要ですが、sshはこの引数を持つことを義務付けており、さらに、そこに接続しようとします。この厄介なオプションをホスト名に設定すると、出力されます…port 22: Connection refused (いいえ、22ポートは使用しませんでした)。何かが足りない限り、コマンドは明らかに機能しません。
Hi-Angel

@ Hi-Angel user@remote-server.comは単なる例であり、文字どおりに受け取らないでください。これを、接続するコンピューターの名前と、このコンピューターのユーザー名に置き換える必要があります。この情報は、ssh接続を確立するために必要です。SSH接続が確立された後にのみ、この接続を介してポートを転送できます。
ピョートルドブロゴスト

あなたはポートがブートから利用できるようにしたい場合は、上記の方法を使用してにsystemdサービスで「autossh」を参照してください- everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh
リチャード・ホリス

「接続拒否」も表示されます。また、SSH接続が含まれていない場合(-Nによる)、user @ remote-server.com引数が必要な理由はまだわかりません。パケットを転送するだけです。
アレクサンダーテイラー

2
@AlexanderTaylor -Nは、SSH接続がないことを意味しません。単に意味しますdo not execute a remote commandmanページを参照)。<user>@<host>このため、引数は、必要でないとSSH接続をオープン<host>(OPの場合のためのものであろうlocalhost)、及び所望のポートを転送を通じてそのSSHトンネル。これはOPの問題の解決策の1つですが、最も単純なものではありません。SSHを使用しないでlocalhostに転送するには、使用することができますsocatnetcatStephaneChazelasではなく、ユーザーの答えとして

94

socatサーバー上:

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

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

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

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


1
おかげで、ローカルsshサーバーを実行する必要がないため、これは素晴らしいことです。
jontro

同じポートで異なるアドレスを使用できますか?
アモス

@amos、編集を参照してください。
ステファンシャゼラス

特定のIPからのトラフィックのみを転送することも可能でしょうか?
18

1
@Phate、単一のIPアドレス(およびmanページのrangeand tcpwrapオプションsocatからの接続をリッスンするようsocatに指示するを参照してください。
ステファンシャゼラス

46

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

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

このバージョンはUbuntu ncnetcat-traditionalパッケージに含まれています。(あなたはupdate-alternativesそれを呼び出さなければなりませんnc.traditional。)

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


2
誰もが同等のものを知っていnetcat-openbsdますか?
スリダールサルノバト

2
以下にnetcat含まれるバージョンのアナログbusyboxnc -v -lk -p 8001 -e /usr/bin/nc 127.0.0.1 8000。(
パラメーターの

2
動作していますが、ncコマンドは最初のリモート接続後に終了します。-k実行し続ける必要がある場合は追加します。
ソパラホデアリエレス

nc: cannot use -p and -lCentOS 6.4でこのエラーが発生します。回避策はありますか?
ニックプレデイ

特権ポートをローカルに転送する必要があるときに、rootとして使用する方が簡単になるため、sshよりもこのソリューションの方が好きです。
クリスチャン

24

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

あなたがopenbsd netcatを使用していることに最初は気がつきませんでした。これは、Ubuntuパッケージから別のnetcatをインストールするよりも優れています。
ロバートR

Ubuntu 15.04でOpenBSDの例が失敗しました。シェルリダイレクトを使用すると、netcatは、ss -tanまたはで表示されるリスニング用のポートを開くことができませんnetstat -tan
ジャスティンC

⁺¹。FTR:別の方法は、Ubuntuの上で動作します
のHi-エンジェル

解決策がわかりません。説明できますか?
トリメジストス

@trismegistosこれらの例では、netcatリスナーとクライアントは入力をいくつかの共有ファイル(mkfifo pipes..first in first out)にリダイレクトし、それらの共有ファイルを入力/出力のソース/宛先として使用して、トンネルを効果的に作成します。通常、クライアント/リスナーが使用されているが、いくつかの技術は、クライアント+クライアント/リスナー+ listener-使用wiki.securityweekly.com/...を して slideshare.net/amiable_indian/secrets-of-top-pentestersは、読み込みする必要があります。
-Info5ek

4

ServerFaultでのDavid Spillett回答を引用する

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

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


3
iptables -t nat -A PREROUTING -p tcp --dport <origin-port> -j REDIRECT --to-port <destination-port>

service iptables save
service iptables restart

dportようにnc -v localhost 2345、接続しようとすると、私は得ていConnection refusedます。私はiptablesがあまり得意ではありませんが、dportにはリスニングアプリが必要だと思います。
ハイエンジェル

origin-portが宛先ポートとは異なるインターフェイスにある場合はどうなりますか?
トリメジストス

0

基づいて、マーク・A.さんの答え、私はそれが(少なくともMacOSのモハーベバージョン10.14.4に)私のMacのために働くことを得るために小さな微調整をしなければなりませんでした

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でリッスンしません。接続拒否。

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

注:Markの投稿に回答を残していましたが、まだ評判がありません。


0

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

udpeer 8001 8002

テストする:

nc -u xxxx.com 8001
nc -u xxxx.com 8002
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.