前提・実現したいこと
自宅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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
リモートPCにおいて
ssh IPアドレス(踏み台) -R 適当なポート:localhost:22
踏み台サーバーの 127.0.0.1:ポート で LISTEN しますので、外部からはこのポートへ接続することはできません。
まずは、踏み台サーバーから ssh -p ポート localhost
でリモートPC にログインできるか確認ください。
自宅PC からリモートPC にログインするには、以下の 2つの方法のどちらかで対応する必要があります。
-
(A) 踏み台サーバーの /etc/ssh/sshd_config で
GatewayPorts 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
総合スコア12173
0
GatewayPorts yes 設定
注意喚起の為に最初に書きますが、GatewayPorts yes
は古くて影響範囲が大きくて危険な設定なので使わないようにしてください。
転送用のポートに外部からアクセスさせたい場合は、後述する GatewayPorts clientspecified
を使ってください。
なぜ接続できないか
OpenSSHの標準の設定では、sshサーバはリモートポート転送を要求された時に 127.0.0.1:指定したポート番号
で Listen します。
サーバのIPアドレスでは待ち受けていない為、ssh -p 転送用のポート 踏み台のIPアドレス
では接続出来ない事になります。
これはサーバ外部の他者から勝手に転送用のポートを利用できないようにする為です。
対応方法
以下の5種類が考えられます。
- 一度踏み台サーバにログインし、そこから転送用のポートに接続する
- OpenSSH 7.3以降のProxyJumbを利用する
- ProxyCommandで
ssh -W
オプションを利用する - ローカルポート転送を併用する
- 踏み台サーバでのリモートポート転送で、外部からの接続を受け付けるようにする
手軽に行いたい場合は 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
総合スコア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
総合スコア1248
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。