回答:
sshを使用するのが最も簡単なソリューションです。
ssh -g -L 8001:localhost:8000 -f -N user@remote-server.com
これにより、ワークステーションのローカルポート8001がremote-server.comのポート8000のローカルホストアドレスに転送されます。
-g
つまり、ネットワーク上の他のクライアントがワークステーションのポート8001に接続できるようにします。そうしないと、ワークステーション上のローカルクライアントのみが転送されたポートに接続できます。
-N
つまり、ポートを転送するだけで、シェルを起動しないでください。
-f
SSH接続とログインが成功した後、バックグラウンドに分岐することを意味します。
ポート8001は、sshが終了するか強制終了されるまで、多くの接続に対して開いたままになります。たまたまWindowsを使用している場合、優れたSSHクライアントPuTTYでもこれを実行できます。8001をローカルポート、localhost:8000、および宛先として使用し、設定でローカルポート転送を追加します。PuTTYとの接続が成功した後に追加できます。
user@remote-server.com
ますか?ポート転送には絶対に不要ですが、sshはこの引数を持つことを義務付けており、さらに、そこに接続しようとします。この厄介なオプションをホスト名に設定すると、出力されます…port 22: Connection refused
(いいえ、22ポートは使用しませんでした)。何かが足りない限り、コマンドは明らかに機能しません。
user@remote-server.com
は単なる例であり、文字どおりに受け取らないでください。これを、接続するコンピューターの名前と、このコンピューターのユーザー名に置き換える必要があります。この情報は、ssh接続を確立するために必要です。SSH接続が確立された後にのみ、この接続を介してポートを転送できます。
-N
は、SSH接続がないことを意味しません。単に意味しますdo not execute a remote command
(manページを参照)。<user>@<host>
このため、引数は、必要でないとSSH接続をオープン<host>
(OPの場合のためのものであろうlocalhost
)、及び所望のポートを転送を通じてそのSSHトンネル。これはOPの問題の解決策の1つですが、最も単純なものではありません。SSHを使用しないでlocalhostに転送するには、使用することができますsocat
かnetcat
StephaneChazelasではなく、ユーザーの答えとして
socat
サーバー上:
socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000
デフォルトでsocat
は、マシン上のIPv4またはIPv6アドレス(サポートされている場合)のTCPポート8001でリッスンします。またはに置き換えることでIPv4 / 6に制限tcp-listen
しtcp4-listen
たりtcp6-listen
、を追加して特定のローカルアドレスに制限したりでき,bind=that-address
ます。
プロキシしている接続ソケットについてもlocalhost
同様に、の代わりに任意のアドレスを使用でき、アドレス解決をIPv4またはIPv6アドレスに制限するかtcp
、tcp4
またはtcp6
制限する場合に使用できます。
ポート8000でリッスンしているサーバーの場合、接続は元のクライアントではなく、プロキシ(の場合はlocalhost
)からのものとして表示されることに注意してくださいlocalhost
。サーバーがクライアントを識別できるようにするには、DNATアプローチを使用する必要があります(ただし、スーパーユーザー特権が必要です)。
従来の方法を使用するのnc
が最も簡単なソリューションです。
nc -l -p 8001 -c "nc 127.0.0.1 8000"
このバージョンはUbuntu nc
のnetcat-traditional
パッケージに含まれています。(あなたはupdate-alternatives
それを呼び出さなければなりませんnc.traditional
。)
sshとは対照的に、これは暗号化されないことに注意してください。1つのホストの外部で使用する場合は、このことに留意してください。
netcat-openbsd
ますか?
nc
コマンドは最初のリモート接続後に終了します。-k
実行し続ける必要がある場合は追加します。
nc: cannot use -p and -l
CentOS 6.4でこのエラーが発生します。回避策はありますか?
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
ss -tan
またはで表示されるリスニング用のポートを開くことができませんnetstat -tan
。
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
着信ポートをすべてのインターフェイスにバインドする場合。
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にはリスニングアプリが必要だと思います。
基づいて、マーク・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の投稿に回答を残していましたが、まだ評判がありません。
これは、サーバー上の2つのudpポートをトンネリングする新しい方法です:https : //github.com/9crk/udpeer
udpeer 8001 8002
テストする:
nc -u xxxx.com 8001
nc -u xxxx.com 8002