Tutoriel Linux

SSHトンネル:サーバーを公開せずにポートを転送する

Débutant2 min de lecture
À retenirLinux n'est pas réservé aux experts. Le bon point de départ : une distribution accessible, une sauvegarde propre et quelques commandes comprises.

ウェブインターフェース、PostgreSQLデータベース、または特定の条件のみを満たす管理サービスへのアクセスが必要です。 127.0.0.1サーバーのファイアウォールでポートを開放すれば手っ取り早いが、そうするとこのサービスは本来アクセスされるべきではないネットワークからもアクセス可能になってしまう。

SSHトンネル これにより、接続がSSHセッションに引き継がれます。一時的なアクセスには、この方法をお勧めします。サービスは公開されたまま閉じられ、トンネルを開いたマシンのみが使用できます。ただし、特に適切なリダイレクトを選択し、リスニングアドレスを確認する必要があります。 -R

ローカルマシンとLinuxサーバー間のセキュアなSSHトンネルの中心にいるTuxのイラスト
SSHトンネルは、サービスをネットワーク上で直接公開することなく、暗号化された接続でポートを伝送します。

-L オプションを使用して、お使いのマシンにポートを転送します。

ローカルリダイレクト -L マシン上でポートを開き、SSHサーバーからアクセス可能な宛先に接続を転送します。一般的な形式は次のとおりです。

ssh -L local_address:local_port:target_host:target_port user@ssh_server

リモートサーバーのポート80のみでリッスンするHTTPインターフェースにアクセスするには:

ssh -N -T -o ExitOnForwardFailure=yes 
  -L 127.0.0.1:8080:127.0.0.1:80 
  [email protected]
  • -L ローカルリダイレクトを作成します。
  • 127.0.0.1:8080 これは、お使いのコンピュータの開いているポートです。
  • 127.0.0.1:80 SSHサーバーから見た宛先です。
  • -N リモートコマンドの起動を回避する。
  • -T 端末の割り当てを回避する。
  • ExitOnForwardFailure=yes SSHが要求されたリダイレクトを作成できない場合、セッションは閉じられます。

この最後のオプションは、リスニングポートの作成を確認するものです。最終的なサービスが応答していることを証明するものではありません。トンネルを開いた後は、必ず宛先をテストしてください。

注文が有効な限り、パソコンからサービスをテストできます。

curl http://127.0.0.1:8080/

右側に位置する住所 -L あなたの注目に値する。前の例では、 127.0.0.1 これはSSHサーバーを指しており、あなたのコンピューターを指しているわけではありません。ターゲットがプライベートネットワーク上の別のマシンにある場合は、そのプライベートアドレスを指定してください。

ssh -N -T -o ExitOnForwardFailure=yes 
  -L 127.0.0.1:15432:10.20.0.15:5432 
  [email protected]

PostgreSQLクライアントは、 127.0.0.1:15432要塞は実際の接続を開く 10.20.0.15:5432基地はインターネットで傍受する必要はない。

トンネルが実際にリスニングしていることを確認してください

お使いのコンピューターで、ローカルポートを制御するには、 ss :

ss -ltnp | grep ':8080'
ss -ltnp | grep ':15432'

リスニングセッションを見る必要があります 127.0.0.1プロセスに関連する ssh見たら 0.0.0.0 または ポートはマシン上の他のインターフェースからアクセスできる可能性があります。トンネルを閉じて、明示的に指定して再作成してください。 127.0.0.1

へのガイド Linuxでssを使ってポートを開放する リスニングアドレスの読み取りの詳細を説明します。また、SSHサーバーが最終宛先に到達できることを確認してください。

curl -I http://127.0.0.1:80/
nc -vz 10.20.0.15 5432

トンネルが作成されますが、 カール またはSQLクライアントが受信します 接続拒否SSH自体はおそらく正常に動作しています。問題は、最終的な接続先が指定されたアドレスまたはポートで待機していないことです。

サービスを公開せずに誤って -R オプションを使用してしまった

リモートリダイレクト -R これは逆の動作をします。SSHサーバー上でポートを開き、それをあなたのマシンからアクセス可能なサービスに転送します。例:ポート3000上のローカルアプリケーションをリモートサーバーからのみアクセス可能にする。

ssh -N -T -o ExitOnForwardFailure=yes 
  -R 127.0.0.1:9000:127.0.0.1:3000 
  [email protected]

リモートサーバー上で、ローカルプロセスは以下を呼び出すことができるようになりました。

curl http://127.0.0.1:9000/

デフォルトでは、 sshd このリモートポートをループバックインターフェイスにバインドします。置き換えないでください。 127.0.0.1 による 0.0.0.0 または * サービスに参加できる人物を決定せずに。サーバーパラメータ ゲートウェイポート これにより、他のインターフェースでのリスニングが可能になります。シンプルなローカルデモを、ネットワークに公開されるサービスへと発展させることができます。

オプションも避けてください -g 他のマシンが転送されたポートに接続しないようにするには、ローカルリダイレクトを使用します。フットプリントを最小限に抑えるには、トンネルをバインドします。 127.0.0.1 両側にあります。

SSHサーバー制限の制御

SSHが応答する場合 行政的に禁止されている リダイレクトが拒否された場合は、実際のサーバー設定を確認してください。

sudo /usr/sbin/sshd -T | grep -E '^(allowtcpforwarding|gatewayports|permitopen|permitlisten)'

TCP転送を許可する ローカルリダイレクト、リモートリダイレクト、両方、またはどちらも許可しない、のいずれかを選択できます。 許可する開く そして 許可する聞く これらの制限は、許可される宛先とポートを制限するために使用されます。共有サーバーでは、すべてのアカウントにグローバルなアクセス権限を付与するよりも、これらの制限を設ける方が望ましいです。

何らかの変更を加える前に、 /etc/ssh/sshd_config または以下のファイル /etc/ssh/sshd_config.d/現在のセッションを開いたままにして、構文をテストしてください。

sudo /usr/sbin/sshd -t

エラーなく正常に復旧した後のみ、SSHを再起動してください。詳しい手順については、以下の記事をご覧ください。 UbuntuでSSHサービスを再起動するこのアカウントでまだパスワードを使用している場合は、まず SSHキーを設定する

繰り返し使用するトンネルを ~/.ssh/config に保存します。

定期的に使用するデータベースの場合は、長いコマンドをコピーしないでください。専用ホストを追加します。 ~/.ssh/config :

ホストトンネルデータベース
    ホスト名 bastion.example.net
    ユーザー管理者
    LocalForward 127.0.0.1:15432 10.20.0.15:5432
    ExitOnForwardFailure はい
    サーバー稼働間隔 30
    ServerAliveCountMax 3

ファイルを保護し、トンネルをフォアグラウンドに開きます。

chmod 600 ~/.ssh/config
ssh -N -T tunnel-db

最初の実行をフォアグラウンドにしておくことをお勧めします。キー、ローカルポート、またはリダイレクトのエラーがすぐに表示されます。 Ctrl + C トンネルを適切に閉じます。その後、バックグラウンドで起動すると、 -f停止する前に、正しいプロセスを特定してください。

pgrep -af 'ssh.*15432'
PIDを殺す

避ける キル -9 反射的に。通常、通常の信号でセッションが閉じられ、ポートが解放されます。

トンネルが通過しない原因の診断

  • アドレスはすでに使用されています 別の方法として、ローカルポートを使用する方法があります。 ss -ltnp または別の港を選択してください。
  • 接続拒否 : ターゲットサービスがリッスンしていないか、SSHサーバーの観点から見て宛先アドレスが間違っています。
  • 行政的に禁止されている SSHの設定により、リダイレクトがブロックされるか、要求された宛先が制限されます。
  • タイムアウト SSHサーバーは、ルーティングまたは中間ファイアウォールにより、ターゲットに到達できません。
  • 落下トンネル 接続の安定性を確認し、 サーバー稼働間隔 診断もせずにSSHを再起動するループではなく。

交渉とリダイレクトの詳細を取得するには、一時的に追加します -v :

ssh -v -N -T -L 127.0.0.1:8080:127.0.0.1:80 [email protected]

SSHトンネルは通信を保護しますが、対象サービスのアクセス権限を修正するものではありません。ローカルループバックでリッスンを続け、制限付きのSSHアカウントを使用し、認証済みキーを管理し、アクセスが不要になったらすぐにセッションを閉じてください。

の構文 -L-R-N そして -g に詳しく記載されています OpenSSHクライアントの公式ドキュメントコントロール TCP転送を許可するゲートウェイポート許可する開く そして 許可する聞く で説明されています sshd_config(5)

sudo apt update && sudo apt upgrade