ローカルネットワーク間のSSHログインにおけるポートフォワードの使い方を紹介します!

ローカルネットワーク間のSSHログインにおけるポートフォワードの使い方を紹介します!
基本情報技術者試験の試験対策はこちら>>

ポートフォワードとは?


SSHのポートフォワード機能とは特定のポートのデータ通信を他のポートへ転送することです。この機能によってVPNが設置されていない内部ネットワーク間での通信などが可能になります。なお今回は公開鍵認証でクライアントの認証をします。

ここで出てくる端末のアドレスはグローバルやプライベートアドレスを問わず端末AならaddrA, 端末XならaddrXとします。

ポート番号はそのプロトコルでデフォルトのポート番号を使い、ユーザーが指定するポート番号は他のサービスと重複しないものを選び、この説明では5桁の番号を使います。

ローカルポートフォワードを使ってみる

ここでローカル端末A(ネットワークには繋がり、AUserの秘密鍵を持っている)からAUserとしてインターネットで到達可能な端末X(端末Xではユーザー名AUserとAUserの公開鍵が登録してある)があります。

またXと同じネットワークで端末Aからインターネットで直接アクセスできない端末Yがあります。端末Aから端末Yにポートフォワードを使ってログインすることを考えます。

SSHで端末Yにログインする

端末Aから端末XにSSHログインする

 

端末Aから端末Y(ユーザー名AUserとAUserの公開鍵が登録されていてSSHサーバが稼働している)にログインする

端末Aから

端末Aから端末Yに別のユーザーとしてログインする

今度は端末Aから端末Yにユーザー名BUserとしてログインします(端末AはBUserの秘密鍵を持っていて、また端末Yにはユーザー名BUserとBUserの公開鍵も登録されている)。

 

端末Aから

端末Yから内部ネットワークに公開されているWebコンテンツを見る

端末Aから

 

ブラウザを起動してURL http://127.0.0.1:10080を開きます。なおこの通信においてSSHで暗号化されるのは端末Aと端末Xの間で、ポートフォワードされる端末Xと端末Yの間は暗号化されていません。

端末YのMySQLサーバと通信する

まず端末AにMySQLクライアントがインストールされている必要があります。端末Yで稼働するMySQLサーバでのユーザー名はAUserMy、パスワードはAUserPassとします。

端末Aから

 

端末AからMySQLを起動する

端末YのGUI画面を使う(X11フォワーディング)

Linuxなどで使用されているGUI画面を端末Aから使います。

 

WindowsやMac、Linux等で使うことができます。サーバ、クライアントの設定や必要なライブラリなどの準備が必要なので確認してください。

ポートフォワードの実践的な活用方法

ここでは、ローカルネットワーク間のSSHログインにおけるポートフォワードの使い方を説明します。また、それに伴う複数回のSSHログインする際の鍵の管理方法およびダイナミックフォワードについても紹介します。

ここで出てくるAUserはSSHでログインするそれぞれの端末にユーザー名がAUserとして登録されているものとします。

これまでは通信先がネットワークを介して繋がる端末でしたが、今度はポートフォワードを活用してローカルネットワーク内やファイヤーウォールなどによって外部からアクセスできない端末とSSHによって通信します。

ローカルネットワーク間で通信する

SSHクライアントもSSHサーバの属するネットワークもいずれもインターネットからアクセス可能なグローバルIPアドレスを持っていない場合を考えます。ここでインターネット上にグローバルIPアドレスを持つ端末P(中継サーバ)を用意します。

ここで端末Xと端末Yは同一のネットワークで、端末A、端末X、端末Yいずれもインターネットには繋がりますがインターネットからはアクセスできません。SSHのリモートフォワードを使って端末Aから端末Pを経由してさらに端末Xを経由して端末Yにログインします。

リモートフォワーディングとは

まず端末Xから端末Pを繋ぎます。端末Pのポート10022からaddrXへポートフォワードしています。

 

次に端末Aから端末PにSSHでログインします

 

ここでログイン中の端末Pから

 

このようにすると端末Pから端末XのSSHサーバにログインすることができます。このようなポートフォワードをリモートフォワードと呼びます。最後に端末XのSSHから端末YのSSHにログインします。

以上のようにして端末Aから端末Pを経由して端末Xから端末YのSSHサーバに順次ログインすることができます。端末P、端末X、 端末YにはSSHサーバが稼働している必要があります。

適切に鍵を配置するには

上の例のように複数回SSHサーバを経由した通信が行われていますが、インターネット上の端末Pに端末Xにログインするための秘密鍵を配置するのはセキュリティー上のリスクがあります。

そこで秘密鍵は端末Aで一括して管理することにします。しかし問題があります。なぜならこのままではログイン先のSSHサーバからでは次のログイン先の秘密鍵が参照できないからです。この問題を解決するため端末Aに置かれた秘密鍵にssh-agentコマンドを実行します。

ssh-agentコマンドで秘密鍵を登録する

端末Aから

 

端末Pおよび端末XのSSHサーバを設定します。端末Pと端末Xの/etc/ssh/sshd_configファイルの#AllowAgentForwarding yesをコメントアウトします。

Agent Forwardingによってログインする

先程の例では端末Aから

 

本来現在ログイン中の端末上に秘密鍵が無い場合は次のSSH接続ができませんがAgent Fowarding機能によって端末Aに置かれた秘密鍵がSSH接続先の端末に転送されます。

ssh-agentによって登録されたSSHの秘密鍵は、ユーザー名と接続するホストに応じて適切な秘密鍵を接続の際に注入します。

コマンドオプションを書かないでSSHを使う

コマンドをSSH接続の度に入力するのは面倒で記述が煩雑になりがちです。SSH接続元の自端末のホームディレクトリ.ssh/configにSSH接続設定を書き込みます。上記の例を示します。

ダイナミックフォワードとは

これまでに説明したポートフォワードでは、WEBサーバなどに接続する際、ホストが変わるごとにまた新たにポートを割り当てる必要がありました。さらに、サイト内のリンクが絶対パスで書かれていた場合リンク先に移らなかったり不便な点があります。

そこでSOCKSパケットでカプセル化されたパケットをSSHサーバに中継しポートフォワードします。接続先のポートと一対一での通信ではないので接続先のホストやポートが変わってもブラウザなどで普段通りに通信できます。

SSHクライアントをSOCKSプロキシにする

端末Aからインターネットで繋がる端末XとXと同じネットワークでインターネットからはアクセスできない2台の端末Yと端末Zに置かれているWEBコンテンツを閲覧します。端末Aから

端末AのブラウザやFTPクライアントのプロキシの設定画面を開きSOCKS HOSTをlocalhostと入力します。またポート番号を1080と入力してプロキシのDSNを使う、をチェックします。

SOCKSでカプセル化された通信

このようにしてブラウザを開くとSOCKSでカプセル化された端末Aからの通信はSSHで端末Xに中継され、内部の端末Yと端末ZのWEBコンテンツをポート番号を追加することなく普段のWEBと同じように閲覧することができます。

また端末Xの属するネットワークで使われているDNSを参照してインターネットに繋げることもできます。

さらに、WEBに限らずファイル転送やメールなど、使用するアプリケーションがSOCKSに対応していればダイナミックフォワードを利用することも可能です。

ダイナミックフォワードを応用する

次は端末Pがインターネットからアクセス可能なグローバルIPアドレスを持っていて、端末Xはローカルネットワーク内でインターネットには繋がりますが、インターネットからはアクセスできません。

端末Xと同じネットワークに存在する端末Yと端末ZのWEBコンテンツを端末Pから見ることを考えます。端末Pと端末XにはSSHサーバが稼働しています。

端末PからSOCKSパケットを端末XまでSSH接続させ前項のダイナミックフォワーディングを実現します。

ローカルネットワーク上のサーバをダイナミックフォワードで繋ぐ

まず端末Xから

 

端末Pから

アプリケーションが対応していればSOCKSプロキシを設定することによりブラウザなどで普段と同じように通信ができます。

端末PのブラウザやFTPクライアントなどのプロキシの設定画面を開きSOCKS HOSTをlocalhostと入力します。またポート番号を10022と入力してプロキシのDSNを使うをチェックします。

まとめ

本記事に出てきたコマンド以外にも多数のSSHコマンドが存在する為、自分の端末のman ssh・・コマンドをお読みください(和訳は相当に古いので)。

SSHは便利で強力ですが、大規模で継続的なセキュリティー対策が求められる場合はVPNの利用を検討することをおすすめします。

インフラエンジニア専門の転職サイト「FEnetインフラ」

FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。

転職をお考えの方は気軽にご登録・ご相談ください。