特定のポート経由で受信した SSH リクエストを別のマシンに転送することはできますか?

StackOverflow https://stackoverflow.com/questions/45230

  •  09-06-2019
  •  | 
  •  

質問

小規模なローカル ネットワークを持っています。外部から利用できるマシンは 1 台だけです (これは簡単に変更できません)。標準ポートで受信しない ssh リクエストが別のマシンに送信されるように設定できるようにしたいと考えています。これは可能でしょうか?もしそうなら、どのようにして?

ああ、これらのマシンはすべて Ubuntu または OS X を実行しています。

役に立ちましたか?

解決

もう 1 つの方法は、ssh トンネリング (クライアント側で行われます) を使用することです。

次のような ssh コマンドを実行します。

ssh -L 8022:myinsideserver:22 paul@myoutsideserver

これにより、外部からアクセスできるマシン (myoutsideserver) に接続され、その ssh 接続を介して、内部からのみアクセスできるサーバー上のポート 22 (標準 ssh ポート) へのトンネルが作成されます。

次に、次のように別の ssh コマンドを実行します (最初のコマンドは接続したままにしておきます)。

ssh -p 8022 paul@localhost

ローカルホストのポート 8022 への接続は、最初の ssh 接続を通じてトンネルされ、myinsideserver を経由します。

SSH ポートの転送を許可するには、myoutsideserver で何かを行う必要がある場合があります。今それを再確認しています。

編集

うーん。ssh のマンページには次のように書かれています。**スーパーユーザーのみが特権ポートを転送できます。**

これは、最初の ssh 接続は root として行う必要があることを意味します。たぶん他の誰かがそれを明確にしてくれるでしょう。

転送されたポートである限り、スーパーユーザー権限は必要ないようです (この場合は8022) は特権ポート (22 など) ではありません。説明してくれてありがとう マイク・ストーン.

他のヒント

(この例では、ポート 2222 が内部ホストに接続されることを想定しています。$externalip と $internalip は、それぞれ、表示されているマシンと内部マシンの IP アドレスまたはホスト名です。)

プロキシをどの程度永続的に行うかに応じて、いくつかのオプションがあります。

  • ある種の TCP プロキシ。Linux では、基本的な考え方は次のとおりです。 前に 受信パケットが処理されると、 目的地を変更する—つまりプレルーティング宛先 NAT:

    iptables -t nat -A PREROUTING -p tcp -i eth0 -d $externalip --dport 2222 --sport 1024:65535 -j DNAT --to $internalip:22

  • SSH を使用して一時的なポート転送を確立します。ここからは、再び 2 つのオプションがあります。

    • 透過プロキシ。クライアントは、目に見えるホスト (ポート 2222 上) を単なる通常の SSH サーバーであると認識し、それが通過していることを認識しません。一部のきめ細かい制御は失われますが、利便性は得られます (特に SSH を使用して VNC または X11 を内部ホストまで転送する場合)。

      • 内部マシンから: ssh -g -R 2222:localhost:22 $externalip
      • 次に、外の世界から: ssh -p 2222 $externalip

      「内部」マシンと「外部」マシンは同じ LAN 上にある必要はないことに注意してください。この方法で世界中どこでもポートフォワードできます。

    • 最初に外部マシンへのログインを強制します。これは本当の「転送」であり、「プロキシ」ではありません。しかし、基本的な考え方は次のとおりです。ユーザーに外部マシンへのログインを強制すると (つまり、誰がいつログインできるかを制御し、アクティビティのログを取得できます)、そこから内部に SSH 接続できるようになります。面倒なことのように聞こえますが、もしそうなら、 パスワードなしの SSH キーペアと組み合わせて、内部ホストの名前を使用して外部マシン上に単純なシェル スクリプトをセットアップします。 ユーザーは非常に簡単にログインできます。それで:

      • 外部マシン上で簡単なスクリプトを作成します。 /usr/local/bin/internalhost 単に実行するだけです ssh $internalip
      • 外部の世界から、ユーザーは次のことを行います。 ssh $externalip internalhost 最初のマシンにログインすると、すぐに内部のマシンに転送されます。

      このアプローチのもう 1 つの利点は、1 つの IP アドレスで 2 つの SSH サービスを実行すると SSH クライアントが怒る可能性があるため、キー管理の問題が発生しないことです。

参考までに、サーバーに SSH で接続し、キーについて心配したくない場合は、これを実行してください

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

私のシェルには「nossh」というエイリアスがあるので、次のようにすることができます。 nossh somehost そして、すべての重要なエラーは無視されます。これを行うときはセキュリティ情報を無視することになるため、理論的にはリスクがあることを理解してください。

この情報の多くは、派手な SSH トリックについて私が Barcamp バンコクで行った講演から得たものです。ご覧いただけます 私のスライド, しかし、私がお勧めするのは、 テキスト版 S5 のスライドはちょっとバグっぽいので。「Forward Anything:」というセクションを確認してください。詳細については、「シンプルなポート転送」を参照してください。OpenSSH を使用した SOCKS5 プロキシの作成に関する情報もあります。はい、できます。OpenSSHはそれくらい素晴らしいです。

(最後に、内部ネットワークへのアクセスを頻繁に行う場合は、VPN のセットアップを検討してください。怖く聞こえますが、OpenVPN は非常にシンプルで、すべての OS で実行できます。SSH のためだけにこれはやりすぎだと思います。ただし、ポート転送を介してポート転送を開始すると、VNC、HTTP、またはその他の処理が実行されます。あるいは、考慮すべき内部ホストが多数ある場合は、よりシンプルで保守しやすい可能性があります)。

@マーク・ビーク

そう言おうと思ってたけど、負けたね!とにかく、-R オプションもあることを付け加えておきたいと思います。

ssh -R 8022:myinsideserver:22 paul@myoutsideserver

違いは、どのマシンに接続するか、またはどのマシンから接続するかです。少し前に上司がこのトリックを教えてくれました。知っておくと本当に便利です...私たちはファイアウォールの内側にいたので、マシンへの外部アクセスを許可する必要がありました...彼は、アクセス可能な別のマシンに ssh -R でそれを回避しました...その後、そのマシンへの接続はファイアウォールの内側のマシンに転送されるため、どのマシン上でどのマシンに SSH 接続しているかに基づいて -R または -L を使用する必要があります。

また、転送しているポート (この場合は 8022 ポート) が制限範囲 (1024 だと思いますが、間違っている可能性があります) を下回っていない限り、通常のユーザーを使用しても問題ないと確信しています。 、これらは「予約済み」ポートであるためです。「制限された」ポートに転送することは問題ではありません。そのポートは開かれていないためです (マシンはトンネル経由でトラフィックを送信しているだけで、トンネルについて何も知りません)。8022 ポートは IS です。オープンであるため、それ自体が制限されています。

編集:トンネルは最初の SSH が開いている間だけ開くので、タイムアウトになるか、トンネルを終了すると、トンネルは閉じられることに注意してください。

これを行うには、ポートフォワーディングを使用できます。ここを見てください:

http://portforward.com/help/portforwarding.htm

このページには、ルーターをポート転送要求に設定する方法が記載されています。

http://www.portforward.com/english/routers/port_forwarding/routerindex.htm

Ubuntuではインストールできます 発火具 それを使用してください 転送サービス ネットワーク内のマシンのポート 22 への外部アクセスを使用して、マシンの非標準ポートから SSH トラフィックを転送する機能。

OS X では、 /etc/nat/natd.plist ファイルを使用してポート転送を有効にします。

ファイアウォール ルールをいじらずに、~/.ssh/config ファイルをセットアップできます。

10.1.1.1 が「ゲートウェイ」システム、10.1.1.2 が「クライアント」システムであると仮定します。

Host gateway
  Hostname 10.1.1.1 
  LocalForward 8022 10.1.1.2:22 

Host client
  Hostname localhost
  Port 8022

次の方法で「ゲートウェイ」への SSH 接続を開くことができます。

ssh gateway

別の端末で、クライアントへの接続を開きます。

ssh client
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top