踏み台サーバー経由で内部サーバーに接続しよう(OSごと)

踏み台サーバーを経由して内部サーバーにアクセウスする方法をOSごとに説明した記事です。
2021.11.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。クラスメソッドのスジェです。
内部サーバーへ直接なアクセスを制限するために踏み台サーバーを利用するのはいろんな環境で求められる事項です。
今回は踏み台サーバーを経由して内部サーバーにアクセスする方法を作成してみました。

踏み台サーバー(bastion host)?

内部サーバーや中庸なリソースを保護するためにアクセスが許可されたサーバーで、パブリックからアクセスできるネットワーク環境上に構築します。 踏み台サーバーの情報は一般ユーザーには公開せず、制限されたソースからのアクセスのみ許可されます。

AWSから提供している踏み台サーバー展開ガイドは次のリンクを誤算書ください。
AWS での Linux 踏み台ホスト

続いてMacからLinux / Windows踏み台サーバー経由で内部サーバーにアクセスする方法を見てみます。 アクセス対象は下記の通りです。

  • 踏み台サーバー : 52.69.183.110(Public IP, linux or windows)
  • 内部サーバー(Private Subnet)
    • 189.0.30.243(windows)
    • 189.0.30.245(linux)

Linux - Linux/Windows

Linuxの踏み台サーバーを経由して内部サーバーにアクセスする際はSSHを利用します。

SSHのオプションは多いので接続方法もたくさんあります。
今回は私がよく使うローカル・ポート転送を説明します。

基本的なコマンドは下記の通りです。

ssh -L {ローカルからアクセスするポート}:{内部サーバーIP}:{内部サーバーにアクセスするポート} \
-i {踏み台サーバーアクセスに必要なキーペア} {ユーザー名}@{内部サーバーIP}

内部サーバーがWindowsの場合

次のコマンドを実行します。

ssh -L 13389:189.0.30.243:3389 -i publicTestKey.pem ec2-user@52.69.183.110

アクセスができましたら、SSHのセッションウィンドウを閉めず下記の通りにRDP接続ソフトウェアを利用して露かるからアクセスするポート(13389)と localhost でアクセスすると内部サーバーにRDPで接続できます。

(アクセス成功!)

内部サーバーが Linux の場合

両方SSHアクセスなのでポート転送をせず踏み台サーバーにSSHアクセス後、そこで内部サーバーへSSHアクセスします。
もちろん windows の場合と同様にポート転送もできます。

# ポート転送
ssh -L 11122:189.0.30.245:22 -i publicTestKey.pem ec2-user@52.69.183.110

# 他ターミナルでろーlocalhostにアクセス
ssh -p 11122 -i test.pem ec2-user@localhost

Windows - Linux/Windows

Windows の踏み台サーバーが SSH を提供していると上記の説明と同じく SSHを利用したポート転送で接続できます。
もし SSH アクセスができない場合は Microsoft Remote Desktop や Parallels Client などの RDPアクセスソフトウェアを利用してローカルから踏み台サーバーに RDP アクセスをします。
今回は Parallels Client を利用してアクセスしてみます。

内部サーバーが Windows の場合

内部サーバーが Windows の場合は基本的にインストールされている Remote Desktop や他のソフトウェアを導入します。

内部サーバーが Linux の場合

OpenSSH をインストールして内部サーバーに SSH アクセスをします。
内部サーバーには既に SSH を支援しているので踏み台サーバーだけ OpenSSH を Client としてインストールします。

# OpenSSH 支援可否確認
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

# まだインストールされてなかったら結果は下記の通り
Name  : OpenSSH.Client~~~~0.0.1.0
State : NotPresent

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

# -----
# OpenSSH Client インストール
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# インストール後 SSH で内部サーバーアクセス
ssh -i test.pem ec2-user@189.0.30.245

または OpenSSH をインストールせず putty, mobaXterm, tera term, XShell など SSH アクセスを支援するソフトウェアをインストールしてアクセスします。

OpenSSH も外部ソフトウェアの導入もできない場合

踏み台サーバーが Windows で内部サーバーが Linux なのに OpenSSH も外部ソフトウェアも導入できない場合は
windows 2000 から windows utility に内蔵された netsh を利用してポート転送を設定します。

コマンドは下記の通りです。

# netsh interface portproxy add v4tov4 listenport={入力されるポート} listenaddress={踏み台サーバーのPrivate IP} \ connectport=22 connectaddress={外部サーバーIP}
netsh interface portproxy add v4tov4 listenport=22 listenaddress=189.0.20.202 connectport=22 connectaddress=189.0.30.245

そしてポート転送がちゃんと設定されたのか確認するために次のコマンドを実行します。

netsh interface portproxy show v4tov4

そのあと ファイアウォールで入力されるポートのインバウンドを開放します。

最後に ローカルから踏み台サーバーの Public IP と listenport に設定したポートで SSH アクセスすると内部サーバーにアクセスできます。

# ssh -i {内部サーバーキーペア} {内部サーバーユーザー名}@{踏み台サーバーの Public IP}
ssh -i test.pem ec2-user@52.69.183.110

ポート転送解除は次のコマンドでできます。

# netsh interface portproxy delete v4tov4 listenport={入力されていたポート} \
listenaddress={踏み台サーバーの Private IP}
netsh interface portproxy delete v4tov4 listenport=22 listenaddress=189.0.20.202

まとめ

この記事で紹介した方法以外にも踏み台サーバーを経由して内部サーバーにアクセスする様々な方法がありますが、 今回、説明した方法でも十分対応できると思います。

お読みいただきありがとうございます。
誤字脱字、内容フィードバックはいつもありがとうございます。must01940 gmailでお願いします。