SSHトンネリングを使用して制限付きサーバーにアクセスし、安全に参照する方法
公開: 2022-01-29SSHクライアントはSecureShellサーバーに接続します。これにより、別のコンピューターの前に座っているかのようにターミナルコマンドを実行できます。 ただし、SSHクライアントを使用すると、ローカルシステムとリモートSSHサーバー間のポートを「トンネリング」することもできます。
SSHトンネリングには3つの異なるタイプがあり、それらはすべて異なる目的で使用されます。 それぞれ、SSHサーバーを使用してトラフィックを1つのネットワークポートから別のネットワークポートにリダイレクトする必要があります。 トラフィックは暗号化されたSSH接続を介して送信されるため、転送中に監視または変更することはできません。
これは、Linux、macOS、およびその他のUNIXライクなオペレーティングシステムに含まれているssh
コマンドを使用して行うことができ、設定を保存するためのssh構成ファイルを作成できます。 組み込みのsshコマンドが含まれていないWindowsでは、SSHサーバーに接続するための無料のツールPuTTYをお勧めします。 SSHトンネリングもサポートしています。
ローカルポートフォワーディング:ローカルシステムでリモートリソースにアクセスできるようにする
「ローカルポートフォワーディング」を使用すると、インターネットに公開されていないローカルネットワークリソースにアクセスできます。 たとえば、自宅からオフィスのデータベースサーバーにアクセスするとします。 セキュリティ上の理由から、そのデータベースサーバーはローカルオフィスネットワークからの接続のみを受け入れるように構成されています。 ただし、オフィスでSSHサーバーにアクセスでき、そのSSHサーバーがオフィスネットワークの外部からの接続を許可している場合は、自宅からそのSSHサーバーに接続して、オフィスにいるかのようにデータベースサーバーにアクセスできます。 さまざまな異なるネットワークリソースを保護するよりも、単一のSSHサーバーを攻撃から保護する方が簡単であるため、これはよくあることです。
これを行うには、SSHサーバーとのSSH接続を確立し、ローカルPCの特定のポート(ポート1234など)からデータベースのサーバーのアドレスとオフィスネットワーク上のポートにトラフィックを転送するようにクライアントに指示します。 したがって、現在のPC「localhost」のポート1234でデータベースサーバーにアクセスしようとすると、そのトラフィックはSSH接続を介して自動的に「トンネリング」され、データベースサーバーに送信されます。 SSHサーバーは中央に配置され、トラフィックを前後に転送します。 任意のコマンドラインまたはグラフィカルツールを使用して、ローカルPCで実行されているかのようにデータベースサーバーにアクセスできます。
ローカル転送を使用するには、SSHサーバーに通常どおり接続しますが、 -L
引数も指定します。 構文は次のとおりです。
ssh -L local_port:remote_address:remote_port [email protected]
たとえば、オフィスのデータベースサーバーがオフィスネットワークの192.168.1.111にあるとします。 ssh.youroffice.com
でオフィスのSSHサーバーにアクセスでき、SSHサーバーのユーザーアカウントはbob
です。 その場合、コマンドは次のようになります。
ssh -L 8888:192.168.1.111:1234 [email protected]
そのコマンドを実行すると、ローカルホストのポート8888でデータベースサーバーにアクセスできるようになります。 したがって、データベースサーバーがWebアクセスを提供している場合は、http:// localhost:8888をWebブラウザに接続してアクセスできます。 データベースのネットワークアドレスを必要とするコマンドラインツールがある場合は、localhost:8888を指定します。 PCのポート8888に送信されるすべてのトラフィックは、オフィスネットワークの192.168.1.111:1234にトンネリングされます。
SSHサーバー自体と同じシステムで実行されているサーバーアプリケーションに接続する場合は、もう少し混乱します。 たとえば、オフィスコンピュータのポート22でSSHサーバーを実行しているが、同じアドレスの同じシステムのポート1234でデータベースサーバーを実行しているとします。 自宅からデータベースサーバーにアクセスしたいのですが、システムはポート22でのみSSH接続を受け入れており、そのファイアウォールは他の外部接続を許可していません。
この場合、次のようなコマンドを実行できます。
ssh -L 8888:localhost:1234 [email protected]
現在のPCのポート8888でデータベースサーバーにアクセスしようとすると、トラフィックはSSH接続を介して送信されます。 SSHサーバーを実行しているシステムに到着すると、SSHサーバーはSSHサーバー自体を実行しているのと同じPCである「localhost」のポート1234に送信します。 したがって、上記のコマンドの「localhost」は、リモートサーバーの観点からは「localhost」を意味します。
WindowsのPuTTYアプリケーションでこれを行うには、[接続]> [SSH]> [トンネル]を選択します。 「ローカル」オプションを選択します。 「送信元ポート」には、ローカルポートを入力します。 「宛先」には、宛先アドレスとポートをremote_address:remote_portの形式で入力します。
たとえば、上記と同じSSHトンネルを設定する場合は、送信元ポートとして8888
を入力し、宛先としてlocalhost:1234
を入力します。 その後、「追加」をクリックし、「開く」をクリックしてSSH接続を開きます。 もちろん、接続する前に、メインの「セッション」画面でSSHサーバー自体のアドレスとポートを入力する必要があります。
関連: SSHエージェント転送とは何ですか?どのように使用しますか?
リモートポートフォワーディング:リモートシステムでローカルリソースにアクセスできるようにする
「リモートポートフォワーディング」はローカルフォワーディングの反対であり、それほど頻繁には使用されません。 これにより、ローカルPC上のリソースをSSHサーバーで使用できるようにすることができます。 たとえば、前に座っているローカルPCでWebサーバーを実行しているとします。 ただし、PCは、サーバーソフトウェアへの着信トラフィックを許可しないファイアウォールの背後にあります。
リモートSSHサーバーにアクセスできると仮定すると、そのSSHサーバーに接続して、リモートポート転送を使用できます。 SSHクライアントは、SSHサーバーの特定のポート(たとえば、ポート1234)を現在のPCまたはローカルネットワークの特定のアドレスとポートに転送するようにサーバーに指示します。 誰かがSSHサーバーのポート1234にアクセスすると、そのトラフィックはSSH接続を介して自動的に「トンネリング」されます。 SSHサーバーにアクセスできる人は誰でも、PCで実行されているWebサーバーにアクセスできます。 これは事実上、ファイアウォールをトンネリングする方法です。
リモート転送を使用するには、 -R
引数を指定してssh
コマンドを使用します。 構文は、ローカル転送の場合とほぼ同じです。
ssh -R remote_port:local_address:local_port [email protected]
ローカルPCのポート1234でリッスンしているサーバーアプリケーションを、リモートSSHサーバーのポート8888で使用できるようにしたいとします。 SSHサーバーのアドレスはssh.youroffice.com
で、SSHサーバーのユーザー名はbobです。 次のコマンドを実行します。
ssh -R 8888:localhost:1234 [email protected]
次に、誰かがポート8888でSSHサーバーに接続すると、その接続は、接続を確立したローカルPCのポート1234で実行されているサーバーアプリケーションにトンネリングされます。
WindowsのPuTTYでこれを行うには、[接続]> [SSH]> [トンネル]を選択します。 「リモート」オプションを選択します。 「送信元ポート」には、リモートポートを入力します。 「宛先」には、宛先アドレスとポートをlocal_address:local_portの形式で入力します。
たとえば、上記の例を設定する場合は、送信元ポートとして8888
を入力し、宛先としてlocalhost:1234
を入力します。 その後、「追加」をクリックし、「開く」をクリックしてSSH接続を開きます。 もちろん、接続する前に、メインの「セッション」画面でSSHサーバー自体のアドレスとポートを入力する必要があります。
その後、SSHサーバーのポート8888に接続すると、トラフィックがローカルシステムのポート1234にトンネリングされます。
デフォルトでは、リモートSSHサーバーは同じホストからの接続のみをリッスンします。 つまり、SSHサーバー自体と同じシステム上のユーザーのみが接続できます。 これはセキュリティ上の理由によるものです。 この動作をオーバーライドする場合は、リモートSSHサーバーのsshd_configで「GatewayPorts」オプションを有効にする必要があります。
関連: WindowsおよびLinuxでSSH構成ファイルを管理する方法
動的ポート転送:SSHサーバーをプロキシとして使用する
関連: VPNとプロキシの違いは何ですか?
プロキシやVPNと同様に機能する「動的ポート転送」もあります。 SSHクライアントは、使用するアプリケーションを構成できるSOCKSプロキシを作成します。 プロキシを介して送信されるすべてのトラフィックは、SSHサーバーを介して送信されます。 これはローカル転送に似ています。PCの特定のポートに送信されたローカルトラフィックを取得し、SSH接続を介してリモートの場所に送信します。

関連:暗号化されたWebサイトにアクセスしている場合でも、パブリックWi-Fiネットワークの使用が危険な場合がある理由
たとえば、パブリックWi-Fiネットワークを使用しているとします。 詮索されることなく安全に閲覧したい。 自宅でSSHサーバーにアクセスできる場合は、SSHサーバーに接続して、動的ポート転送を使用できます。 SSHクライアントは、PC上にSOCKSプロキシを作成します。 そのプロキシに送信されるすべてのトラフィックは、SSHサーバー接続を介して送信されます。 パブリックWi-Fiネットワークを監視している人は、ブラウジングを監視したり、アクセスできるWebサイトを検閲したりすることはできません。 アクセスするWebサイトから見ると、自宅のPCの前に座っているように見えます。 これは、米国外でこのトリックを使用して米国のみのWebサイトにアクセスできることも意味します。もちろん、米国内のSSHサーバーにアクセスできると仮定します。
別の例として、ホームネットワーク上にあるメディアサーバーアプリケーションにアクセスしたい場合があります。 セキュリティ上の理由から、SSHサーバーのみがインターネットに公開されている場合があります。 インターネットからメディアサーバーアプリケーションへの着信接続を許可しません。 動的ポート転送を設定し、SOCKSプロキシを使用するようにWebブラウザーを構成してから、自宅のSSHシステムの前に座っているかのように、Webブラウザーを介してホームネットワークで実行されているサーバーにアクセスできます。 たとえば、メディアサーバーがホームネットワークのポート192.168.1.123にある場合、SOCKSプロキシを使用してアドレス192.168.1.123
を任意のアプリケーションに接続すると、ホームネットワークにいるかのようにメディアサーバーにアクセスできます。 。
動的転送を使用するには、次のように-D
引数を指定してsshコマンドを実行します。
ssh -D local_port [email protected]
たとえば、 ssh.yourhome.com
でSSHサーバーにアクセスでき、SSHサーバーのユーザー名がbob
であるとします。 動的転送を使用して、現在のPCのポート8888でSOCKSプロキシを開く必要があります。 次のコマンドを実行します。
ssh -D 8888 [email protected]
次に、ローカルIPアドレス(127.0.01)とポート8888を使用するようにWebブラウザーまたは別のアプリケーションを構成できます。そのアプリケーションからのすべてのトラフィックは、トンネルを介してリダイレクトされます。
WindowsのPuTTYでこれを行うには、[接続]> [SSH]> [トンネル]を選択します。 「動的」オプションを選択します。 「送信元ポート」には、ローカルポートを入力します。
たとえば、ポート8888でSOCKSプロキシを作成する場合は、送信元ポートとして8888
と入力します。 その後、「追加」をクリックし、「開く」をクリックしてSSH接続を開きます。 もちろん、接続する前に、メインの「セッション」画面でSSHサーバー自体のアドレスとポートを入力する必要があります。
次に、ローカルPC上のSOCKSプロキシ(つまり、ローカルPCを指すIPアドレス127.0.0.1)にアクセスするようにアプリケーションを構成し、正しいポートを指定できます。
関連: Firefoxでプロキシサーバーを構成する方法
たとえば、SOCKSプロキシを使用するようにFirefoxを設定できます。 Firefoxは独自のプロキシ設定を持つことができ、システム全体のプロキシ設定を使用する必要がないため、これは特に便利です。 FirefoxはSSHトンネルを介してトラフィックを送信しますが、他のアプリケーションは通常どおりインターネット接続を使用します。
Firefoxでこれを行う場合は、「手動プロキシ設定」を選択し、SOCKSホストボックスに「127.0.0.1」と入力し、「ポート」ボックスに動的ポートを入力します。 [HTTPプロキシ]、[SSLプロキシ]、および[FTPプロキシ]ボックスは空のままにします。
SSHセッション接続が開いている限り、トンネルはアクティブで開いたままになります。 SSHセッションを終了してサーバーから切断すると、トンネルも閉じられます。 適切なコマンド(またはPuTTYの適切なオプション)で再接続するだけで、トンネルを再度開くことができます。
Linuxコマンド | ||
ファイル | tar・pv・cat・tac・chmod・grep・diff・sed・ar・man・pushd・popd・fsck・testdisk・seq・fd・pandoc・cd・$ PATH・awk・join・jq・fold・uniq・journalctl・tail・stat・ls・fstab・echo・less・chgrp・chown・rev・look・strings・type・rename・zip・unzip・mount・umount・install・fdisk・mkfs・rm・rmdir・rsync・df・gpg・vi・nano・mkdir・du・ln・patch・convert・rclone・shred・srm | |
プロセス | エイリアス・screen・top・nice・renice・progress・strace・systemd・tmux・chsh・history・at・batch・free・which・dmesg・chfn・usermod・ps・chroot・xargs・tty・pinky・lsof・vmstat・タイムアウト・wall・yes・kill・sleep・sudo・su・time・groupadd・usermod・groups・lshw・shutdown・reboot・halt・poweroff・passwd・lscpu・crontab・date・bg・fg | |
ネットワーキング | netstat・ping・traceroute・ip・ss・whois・fail2ban・bmon・dig・finger・nmap・ftp・curl・wget・who・whoami・w・iptables・ssh-keygen・ufw |
関連:開発者と愛好家のための最高のLinuxラップトップ