次の状況を考慮してください。
自宅にはルーター(インターネットに接続されています)、サーバー(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で起動およびシャットダウンできるようにしたいとします。
はい、これは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への単純な転送と同じではないことに注意してください。
別の方法があります。 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(ネットワークアドレス変換)と呼ばれます。
その他の選択肢:netcat
(従来)またはsocat
サーバー(S)で:
socat tcp-listen:2222,reuseaddr,fork tcp:M:8888
または
nc -l -p 2222 -c 'nc M 8888'
詳細は以下を参照してください あるローカルポートから別のローカルポートへのトンネルを作成する簡単な方法?