質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

3回答

4309閲覧

ポートフォワーディング

marumaruko

総合スコア0

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2020/04/25 15:08

前提・実現したいこと

自宅PC→踏み台PC(グローバルIPあり)
リモートPC(ローカルIPのみ)→踏み台PC はssh接続可能で
(踏み台→リモートPC)の逆ポートフォワーディングにより
自宅PCからリモートのPCをssh接続したい

発生している問題・エラーメッセージ

踏み台PCからリモートPCへ接続できない 自宅PCから ssh -p 転送用のポート 踏み台のIPアドレスを実行すると connection refused になる

該当のソースコード

リモートPCにおいて ssh IPアドレス(踏み台) -R 適当なポート:localhost:22 sshは公開鍵認証

試したこと

リモートPCのローカルIP固定
sshポート番号の変更

補足情報(FW/ツールのバージョンなど)

ご教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

リモートPCにおいて
ssh IPアドレス(踏み台) -R 適当なポート:localhost:22

踏み台サーバーの 127.0.0.1:ポート で LISTEN しますので、外部からはこのポートへ接続することはできません。
まずは、踏み台サーバーから ssh -p ポート localhost でリモートPC にログインできるか確認ください。

自宅PC からリモートPC にログインするには、以下の 2つの方法のどちらかで対応する必要があります。

  • (A) 踏み台サーバーの /etc/ssh/sshd_configGatewayPorts yes を設定する。他ユーザーから接続される可能性あり、おすすめしない。

  • (B) 自宅PC から踏み台サーバーに LocalForward し、そのポートに ssh で接続する。

# リモートPC → 踏み台 (RemoteForward) [リモートPC]$ ssh IPアドレス(踏み台) -R ポートX:127.0.0.1:22 # 自宅PC → 踏み台 (LocalForward) [自宅PC]$ ssh IPアドレス(踏み台) -L ポートY:127.0.0.1:ポートX # 自宅PC →リモートPC [自宅PC]$ ssh -p ポートY 127.0.0.1

(B) の動作が確認できたら、2ステップ→1ステップでできるよう、$HOME/.ssh/config を設定するといいと思います。
ProxyCommand または ProxyJump をキーワードに検索ください。

投稿2020/04/25 16:02

TaichiYanagiya

総合スコア12173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

GatewayPorts yes 設定

注意喚起の為に最初に書きますが、GatewayPorts yes は古くて影響範囲が大きくて危険な設定なので使わないようにしてください。
転送用のポートに外部からアクセスさせたい場合は、後述する GatewayPorts clientspecified を使ってください。

なぜ接続できないか

OpenSSHの標準の設定では、sshサーバはリモートポート転送を要求された時に 127.0.0.1:指定したポート番号 で Listen します。
サーバのIPアドレスでは待ち受けていない為、ssh -p 転送用のポート 踏み台のIPアドレスでは接続出来ない事になります。

これはサーバ外部の他者から勝手に転送用のポートを利用できないようにする為です。

対応方法

以下の5種類が考えられます。

  1. 一度踏み台サーバにログインし、そこから転送用のポートに接続する
  2. OpenSSH 7.3以降のProxyJumbを利用する
  3. ProxyCommandでssh -Wオプションを利用する
  4. ローカルポート転送を併用する
  5. 踏み台サーバでのリモートポート転送で、外部からの接続を受け付けるようにする

手軽に行いたい場合は 1 がいいでしょう。設定も必要ないですし、クライアントのバージョンも選びません。

ローカル側でOpenSSH 7.3以降を使っているのならば 2 が一発でログイン出来て楽です。

OpenSSH 7.3より前を使ってリモートPCまで一発でログイン出来るようにした場合は 3 ですが、設定が必要です。

4 はOpenSSHではもはや積極的に利用する必要は無いのですが、他のクライアントを使っている場合には便利でしょう。使い方は他の方の回答に書かれていますので、私の方では省略します。

5 は前述したようにサーバ外の他者から勝手に接続される可能性が有るため、お勧めしません。

踏み台サーバからssh接続する

これはタイトルそのままですが、一度踏み台サーバに ssh 接続し、そこで ssh -p 転送用ポート localhost で接続します。
クライアントも選ばず、設定等も必要ないので手軽に使えるのが利点です。

ただし、踏み台サーバの管理者が信頼出来ない場合は、通信内容を覗き見たりできるので避けた方がいいかもしれません。そもそもそのようなサーバを踏み台に利用すべきでは無いと思いますが。

ProxyJumb

ローカル側でOpenSSH 7.3以降を使っているのならば ProxyJump を利用するのが便利でしょう。

ssh -J 踏み台サーバのIPアドレス -p 転送用のポート 127.0.0.1

毎回 -J オプションを指定するのが面倒な場合は、以下の設定を ~/.ssh/config に追加すると ssh remote-pc でログイン出来るようになります。

Host remote-pc HostName 127.0.0.1 Port 転送用のポート番号 ProxyJump 踏み台サーバのIPアドレス

ProxyCommand + ssh -W オプション

この方法はコマンドラインオプションでも指定できない事は無いのですが、毎回指定するには長すぎるので設定ファイルに記述する方法のみを説明します。

以下の設定を ~/.ssh/config に追加すると ssh remote-pc でログイン出来るようになります。

Host remote-pc HostName 127.0.0.1 Port 転送用のポート番号 ProxyCommand ssh -W %h:%p 踏み台サーバのIPアドレス

ssh -W はログインした時にシェルを起動せず、そのまま指定したホストのポートに接続します。
ProxyCommand 設定によって内部的にssh -W 127.0.0.1:転送用のポートを実行して、その中を通してssh接続するという設定となります。

2 の ProxyJump も内部的には同じ事を行っています。

転送用のポートを外部からアクセス可能にする

最初に書いたように、転送用のポートに外部からアクセスできるようにする事はセキュリティ的に好ましくありません。
以下の設定はその事を理解した上でどうしてもアクセスできるようにしたい場合に行ってください。

OpenSSH のデフォルトの設定では転送用のポートに外部からアクセスできないようになっています。
外部からアクセスできるようにする為には sshd_config を編集して GatewayPorts clientspecified に変更します。変更後はsshdを再起動してください。

再起動後、リモートPCから踏み台サーバに以下のコマンドで接続します。

ssh IPアドレス(踏み台) -R '*:適当なポート:localhost:22'

この後はローカルのPCから ssh -p 転送用のポート 踏み台のIPアドレス を実行する事でリモートPCにログインできます。

GetawayPorts 設定

SSHプロトコルでは、ポート転送時にポート番号だけではなく Listen するIPアドレスも指定するようになっています。
ただし、指定されたアドレスをどのように扱うかはサーバ次第となっています。

OpenSSH でこのクライアントが指定したアドレスをどのように扱うかを決めるのが GatewayPorts 設定です。
GatewayPorts では no, yes, clientspecified の三種類の指定が出来ます。

  • no: クライアントの指定を無視して常に localhost として扱う
  • yes: クライアントの指定を無視して常に *(すべてのアドレス) として扱う
  • clientspecified: クライアントが指定したアドレスを使う

GatewayPorts yesでは、

  • すべてのリモートポート転送が外部からの接続を受け付けるようになる
  • クライアントからはこの設定を無視して外部から受け付けないように指定できない

という問題があります。なので通常はGatewayPorts yesを使わず、GwatewayPorts clientspecifiedにして、必要なリモートポート転送のみアドレスに*を指定して外部からの接続を受け付けるようにしてください。

投稿2020/04/30 14:05

doda

総合スコア947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

2種類の解決方法を提示してます。
(1)踏み台PCのsshd_configの設定を変更する。ただし、踏み台PCのsshd_configを変更する権限を持っている必要があります。
(2)自宅PCから踏み台PCへ「ssh -L …」オプションを使ってさらにもう一つのトンネルを作る。

質問にかかれている状態だと、
リモートPCにおいて「ssh -R…」によるトンネルを作った後に、
踏み台PC上でポートフォワーディングポートのバインド状態を見ると、
localhostでしか接続を受け付けない状態になっていると思います。
具体的には…、

リモートPCでトンネルを作った際に、

terminal

1(リモートPC)$ ssh IPアドレス(踏み台) -R 2222:localhost:22

踏み台PCの

terminal

1(踏み台PC)$ netstat -an | grep 2222 2tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN 3tcp6 0 0 ::1:2222 :::* LISTEN

の出力の「127.0.0.1:2222」の部分が問題で、
踏み台PC自身から「ssh -p 2222 localhost」とやればリモートPCに接続出来るが、
外ホストからの2222番ポートへの接続は受け付けないような状態になっています。

(1)踏み台PCの「/etc/ssh/sshd_config」に「GatewayPorts yes」の設定を追加して、sshdを再起動します。そうするとlocalhost以外からの接続を受け付けるようになります。(さきほどのコマンドの出力において「0.0.0.0:2222」と変化していることで確認できます)

terminal

1(踏み台PC)$ netstat -an | grep 2222 2tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 3tcp6 0 0 :::2222 :::* LISTEN

(2)のやり方は2つのトンネルを作ります
まず今までどおりリモートPCから踏み台PCのトンネルを作る

terminal

1(リモートPC)$ ssh IPアドレス(踏み台) -R 2222:localhost:22

次に自宅PCから踏み台にトンネルを作成するために接続する

terminal

1(自宅PC)$ ssh -L 2222:localhost:2222 IPアドレス(踏み台)

上記2つのトンネルを作った状態で、自宅PCからトンネルを使って接続するとリモートPCに接続できます

terminal

1(自宅PC)$ ssh -p 2222 localhost

投稿2020/04/25 17:01

hidezzz

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問