Azure 仮想マシンの RDP と SSH をいつもと違うポート番号で接続してみた

## 背景と目的

ウェルノウン・ポート番号で RDP は 3389、SSH は 22 と割り当てられているので、自宅以外のネットワークを利用する場合は、これらのポート番号が外部ネットワークとの境界にあるファイアウォールで閉じられている場合が多いと思います。とは言え、どうしても緊急事態で緊急対応が必要だったり、Azure Bastion や Windows Admin Center を使う準備が整っていなかったりすると、どうしても RDP や SSH をしなくてはならない状況が発生します。そんな時に備えて、ポート番号を変更して接続する方法を試してみました。

## 前提条件

コマンドの実施環境は、Mac + Azure CLI です。

```bash: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: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: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}*
```