web-dev-qa-db-ja.com

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

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

自宅にはルーター(インターネットに接続されています)、サーバー(S)、メインマシン(M)があります。 Sはインターネットから到達可能で(静的IPがあります)、24時間年中無休ですが、Mはそうではありません。

時々、外部のインターネットからアクセスできるいくつかのアプリ(Mのいくつかのポートでリッスンする8888など)を作成したい場合があります。

そのため、S(2222)にMのポート8888に転送するようにポートを設定し、S:2222にアクセスしているユーザーがM:8888にアクセスしているように感じられるようにしました。

私はsshポート転送を使用しようとしましたが、私の最善の試みは次のとおりでした:

ssh -L 2222:M:8888 -N M

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

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

21
Rogach

はい、これはSSHではGatewayPortsと呼ばれます。 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への単純な転送と同じではないことに注意してください。

16
gertvdijk

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

12
Gevial

その他の選択肢:netcat(従来)またはsocat

サーバー(S)で:

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

または

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

詳細は以下を参照してください あるローカルポートから別のローカルポートへのトンネルを作成する簡単な方法?

6
simohe