あるマシンから別のマシンにポートを転送する方法は?


19

次の状況を考慮してください。

自宅には、ルーター(インターネットに接続されています)、サーバー(S)、メインマシン(M)があります。Sはインターネットから到達可能で(静的IPを使用)、24時間365日稼働していますが、Mは稼働していません。

時々、外部のインターネットからアクセス可能なアプリ(たとえば、8888などのMのポートでリッスンする)を作成したいことがあります。

そのために、S(2222)のポートをセットアップしてMのポート8888に転送することで、S:2222にアクセスする人がM:8888にアクセスしているように感じられるようにしました。

sshポートフォワーディングを使用しようとしましたが、私の最善の試みは次のとおりでした。

ssh -L 2222:M:8888 -N M

しかし、それにより、他のマシンからではなく、サーバー自体からのみ2222ポートにアクセスできます。

適切に行う方法はありますか?できれば、それを転送する必要がなくなったときに^ Cで開始およびシャットダウンできる単純なコマンドにしたいのです。


あなたはATに得ることができるサイトですlocalhost.runてみlocalhost.run ..私はそこにあなたの製品を取得する方法があると思いますが
Angelena Neilsomt

回答:


16

はい、これはGatewayPortsSSH で呼び出されます。からの抜粋ssh_config(5)

GatewayPorts
        Specifies whether remote hosts are allowed to connect to local
        forwarded ports.  By default, ssh(1) binds local port forwardings
        to the loopback address.  This prevents other remote hosts from
        connecting to forwarded ports.  GatewayPorts can be used to spec‐
        ify that ssh should bind local port forwardings to the wildcard
        address, thus allowing remote hosts to connect to forwarded
        ports.  The argument must be “yes” or “no”.  The default is “no”.

そして、あなたがSSHで接続しているのと同じマシンに転送しているので、転送のlocalhost代わりに使用できますM-私があなたの質問を正しく理解していれば。

したがって、コマンドは次のようになります。

ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M

以下のようになりますnetstat -nltp

tcp        0      0    0.0.0.0:2222   0.0.0.0:*  LISTEN  5113/ssh

これで、ポート2222 TCPでこのマシンにアクセスする人は、マシンMで見られるように、実際にはlocalhost:8888と通信します。これは、Mのポート8888へのプレーン転送とは異なることに注意してください。


1
ありがとう!動作します!しかし、奇妙な点がいくつかあります。何らかの理由で、出力には「バインド:すでに使用されているアドレス」という行が含まれています。それはどういう意味ですか?
Rogach

1
そのポートですでにいくつかのプロセスが実行されています。同じnetstatコマンドを使用して、正確に何を確認します。おそらくバックグラウンドでまだ実行されている別の同様のSSHが、PID netstatを使用して強制終了します。
gertvdijk

おもしろいのは、私がすでにそれを行っていることです-SとMの両方で、それらのポートでプロセスがありません。
Rogach

10

別の方法があります。iptablesを使用して、S:2222からW:8888へのポート転送を設定できます。単一のコマンド:

iptables -t nat -A PREROUTING -p tcp --dport 2222 \
         -j DNAT --to-destination 1.2.3.4:8888

1.2.3.4はMのIPアドレスです。これはNAT(ネットワークアドレス変換)と呼ばれます。


1
ここでは宛先NATのみを実行しているため(ソースNATとは反対)、これは特定の状況でのみ確実に機能し、ルーティングテーブルの変更が必要になる場合があります。ただし、ホスト(S)で実行されている仮想マシン(M)に転送する場合は、これで十分です。
gertvdijk

このコマンドはゲートウェイで発行する必要があります。SとMは同じLAN上にあると想定しています。ソースNATは、最新のLinuxカーネルの接続トラッカーによって自動的に実行されます。私はオフィスのネットワークにそのような設定があり、完全に機能します。ただし、コマンドをより具体的にすることは可能です(たとえば、iptables -i eth0にeth0が外部インターフェイスであると伝える)。
Gevial

SとMが同じLAN上にある場合、それらの間のトラフィックはゲートウェイを通過しないため、そこでポートを転送する必要はありません。
gertvdijk

1
ええ、しかし、M:8888への接続はインターネットから行われていると思います。誰かがインターネットを形成する-> S:
2222-

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