背景と目的
ウェルノウン・ポート番号で RDP は 3389、SSH は 22 と割り当てられているので、自宅以外のネットワークを利用する場合は、これらのポート番号が外部ネットワークとの境界にあるファイアウォールで閉じられている場合が多いと思います。とは言え、どうしても緊急事態で緊急対応が必要だったり、Azure Bastion や Windows Admin Center を使う準備が整っていなかったりすると、どうしても RDP や SSH をしなくてはならない状況が発生します。そんな時に備えて、ポート番号を変更して接続する方法を試してみました。
前提条件
コマンドの実施環境は、Mac + Azure CLI です。
bash
$ sw_vers
ProductName: macOS
ProductVersion: 12.1
BuildVersion: 21C52
$ az version
{
"azure-cli": "2.32.0",
"azure-cli-core": "2.32.0",
"azure-cli-telemetry": "1.0.6",
"extensions": {}
}
検証用の Windows 仮想マシンを作ってポート番号 8080 で接続する
bash
# 環境変数をセットします
region=japaneast
prefix=mnrdevwin
rdpport=8080
# リソースグループを作成します
az group create \
--name ${prefix}-rg \
--location $region
# パスワードを生成します
vmpass=$(openssl rand -base64 16)
echo $vmpass
# 仮想マシンを作成します
az vm create \
--resource-group ${prefix}-rg \
--name ${prefix}-vm \
--os-disk-name ${prefix}-vmOSDisk \
--image Win2019Datacenter \
--size Standard_F2s_v2 \
--admin-username azureuser \
--admin-password $vmpass \
--nsg-rule NONE \
--public-ip-address-dns-name ${prefix} \
--storage-sku StandardSSD_LRS
# RDP ポート番号を 8080 に設定します
az vm run-command invoke \
--resource-group ${prefix}-rg \
--name ${prefix}-vm \
--command-id SetRDPPort \
--parameters "RDPPORT=$rdpport"
# NSG に自分の IP アドレスから RDP 接続出来るようにします
az network nsg rule create \
--resource-group ${prefix}-rg \
--name Allow-RDP \
--nsg-name ${prefix}-vmNSG \
--priority 100 \
--source-address-prefixes $(curl -s inet-ip.info) \
--destination-port-ranges $rdpport \
--access Allow \
--protocol Tcp
# RDP ファイルを作成します
cat <<EOF > ${prefix}.rdp
full address:s:${prefix}.$region.cloudapp.azure.com:$rdpport
username:s:azureuser
EOF
# 仮想マシンに RDP 接続します
open -a "Microsoft Remote Desktop" ${prefix}.rdp
# リソースグループを削除します
az group delete \
--name ${prefix}-rg
# 作成した RDP ファイルを削除します
rm -f ${prefix}.rdp
検証用の Linux 仮想マシンを作ってポート番号 8080 で接続する
bash
# 環境変数をセットします
region=japaneast
prefix=mnrdevlnx
sshport=8080
# リソースグループを作成します
az group create \
--name ${prefix}-rg \
--location $region
# SSH キーペアをファイル名を指定して作成します
ssh-keygen -m PEM -t rsa -b 4096 \
-f ${prefix}
# 仮想マシンを作成します
az vm create \
--resource-group ${prefix}-rg \
--name ${prefix}-vm \
--os-disk-name ${prefix}-vmOSDisk \
--image UbuntuLTS \
--size Standard_B1ls \
--admin-username azureuser \
--ssh-key-value ${prefix}.pub \
--nsg-rule NONE \
--public-ip-address-dns-name ${prefix} \
--storage-sku Standard_LRS
# SSH ポート番号を 8080 に設定します
az vm run-command invoke \
--resource-group ${prefix}-rg \
--name ${prefix}-vm \
--command-id RunShellScript \
--scripts "sed -i 's/#Port 22/Port $sshport/' /etc/ssh/sshd_config && systemctl reload sshd" \
--query value[].message \
--output tsv
# NSG に自分の IP アドレスから SSH 接続出来るようにします
az network nsg rule create \
--resource-group ${prefix}-rg \
--name Allow-SSH \
--nsg-name ${prefix}-vmNSG \
--priority 100 \
--source-address-prefixes $(curl -s inet-ip.info) \
--destination-port-ranges $sshport \
--access Allow \
--protocol Tcp
# 仮想マシンに SSH 接続します
ssh -p $sshport -i ${prefix} azureuser@${prefix}.$region.cloudapp.azure.com
# リソースグループを削除します
az group delete \
--name ${prefix}-rg
# 作成した SSH キーペアを削除します
rm -f ${prefix}*