あるシステムから別のシステムにポートを転送する方法は?

あるシステムから別のシステムにポートを転送する方法は?

次の状況を考えてみましょう。

私の家には、ルーター(インターネットに接続されている)、サーバー(S)、ホスト(M)があります。 Sはインターネット(固定IP付き)を介してアクセスでき、年中無休のオンラインですが、Mはそうではありません。

場合によっては、外部インターネットからアクセスできるいくつかのアプリケーション(8888 Mの特定のポートでリッスンするなど)を作成したい場合があります。

このために、S(2222)の一部のポートをMのポート8888に転送するように設定して、S:2222にアクセスする人は誰でもM:8888にアクセスするように感じることができるようにしたいと思います。

SSHポート転送を試しましたが、最善の試みは次のとおりです。

ssh -L 2222:M:8888 -N M

ただし、これにより、他のコンピュータではなくサーバー自体からのみポート2222にアクセスできます。

これを正しく実行する方法はありますか?これ以上転送が不要になったときに ^C を使って開始して終了できる簡単なコマンドであればいいです。

答え1

はい、これが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”.

あなたの質問を正しく理解したら、localhost転送するコンピュータはSSHを使用するのと同じコンピュータであるため、転送に代わりに使用できます。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

これで、TCPポート2222を介してこのコンピュータにアクセスしている人は、コンピュータMに示すように実際にlocalhost:8888と通信します。これは、Mに転送される通常のポート8888とは異なります。

答え2

別の方法があります。 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(ネットワークアドレス変換)と呼ばれます。

答え3

追加の代替案:(netcat伝統的)またはsocat

サーバーから:

socat tcp-listen:2222,reuseaddr,fork tcp:M:8888

または

nc -l -p 2222 -c 'nc M 8888'

詳細については、次を参照してください。 あるローカルポートから別のポートにトンネルを作成する簡単な方法は何ですか?

答え4

簡潔な答え

元のコマンドはほとんど問題ありませんが、リッスンするアドレスを指定しないため、プロセスはデフォルト127.0.0.1でリッスンします。

コマンドをssh -L 2222:M:8888 -N Mからに変更するssh -L S:2222:M:8888 -N Mと正常に動作します。

詳細な回答

-Lあなたが経験している問題は、「localPort:remoteHost:remotePort」に短い記号を使用したために発生します。

ご利用の際はsshぜひ聴いてみてください127.0.0.1

たとえば、

ssh -L 2222:M:8888 -N M

結果は次のとおりです(聞いている住所を参照してください)。

sudo netstat -nlp | grep 2222
tcp        0      0 127.0.0.1:2222          0.0.0.0:*               LISTEN      16208/ssh

完全な表記法(「localAddress:localPort:remoteHost:remotePort」)を使用する場合:

ssh -L external-address-of-S:2222:M:8888 -N M

同様の結果が出るでしょう。

sudo netstat -nlp | grep 2222
tcp        0      0 external-address-of-S:2222          0.0.0.0:*               LISTEN      16208/ssh

PSGatewayPortsはより一般的なソリューションですが、サーバーに複数のIPアドレスがある場合は動作が異なります。このソリューションを使用すると、GatewayPortsすべてのIPを受信し、同じ宛先に転送しながら受信するIPを選択できます(異なるIPの同じポートを別の宛先に転送できます)。どちらが適切かは要件によって異なりますが、どちらもOPに適しています。

PPS私はこれが非常に古い質問であることを知っていますが、今日でも依然として非常に関連性があり(おそらくクラウドの広範な使用のためにさらにそうです)、同様の問題を持つ誰にでも役立つ簡単な答えがないと思います。

関連情報