Private Link Service Direct Connect を利用して Azure からオンプレミスにアクセスする

azure
Published: 2025-10-17

はじめに

Private Link Service で Direct Connect という設定がプレビューになりました。

これまで Private Link Service に紐づけられるのは Standard なロードバランサだけでした。ですが Direct Connecct を利用するとロードバランサではなく任意のプライベート IP アドレスを紐づけられます。ドキュメント上の記載は「A routable IP address to set as the destination IP address.」なので、紐づける IP アドレスは到達性さえあれば仮想ネットワーク内の IP アドレスではなくてもよさそうです。

というわけで今回は、Private Link Service の Direct Connect でオンプレミスの IP アドレスを対象にしたらどうなるのかを動作確認しました。

構成図

今回試す構成は以下の通りです。

構成図

ハブアンドスポークな仮想ネットワークが VPN Gateway 経由でオンプレミスと S2S VPN で接続されています。このハブアンドスポークな仮想ネットワークのスポークに Direct Connect な Private Link Service を用意します。この Private Link Service の紐づけ先はオンプレミスこと自宅のプロキシサーバです。

また、このハブアンドスポークには接続されていないまったく別の仮想ネットワークを用意します。そして、この仮想ネットワークに前述の Private Link Service に接続するための Private Endpoint を設置します。最後に、この仮想ネットワーク内に仮想サーバを立てて、プロキシの設定で Private Endpoint の IP アドレスを指定します。

この状態で、仮想サーバのブラウザでサイトを閲覧できて、かつオンプレミスのプロキシサーバにアクセスログが残れば大成功です。

設定

まずは サブスクリプションにプレビュー機能の利用を登録します。

Register-AzProviderFeature -FeatureName "AllowPrivateLinkserviceUDR" -ProviderNamespace "Microsoft.Network"

次に Private Link Service を作成します。その際に サブネットのプロパティである privateLinkServiceNetworkPolicies を Disabled にする必要があります。また、Private Link Service に紐づけたいプロキシサーバの IP アドレス 192.168.111.120 を -DestinationIPAddress で指定します。

$vnet = Get-AzVirtualNetwork -Name lab-wu-vnet -ResourceGroupName rg-labnet
$subnet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $vnet -Name plsd

$subnet.PrivateLinkServiceNetworkPolicies = "Disabled"
$vnet | Set-AzVirtualNetwork

$ipConfig1 = @{
    Name = "ipconfig1"
    PrivateIpAllocationMethod = "Dynamic"
    Subnet = $subnet
    Primary = $true
}

$ipConfig2 = @{
    Name = "ipconfig2"
    PrivateIpAllocationMethod = "Dynamic"
    Subnet = $subnet
    Primary = $false
}

$pls = New-AzPrivateLinkservice -Name plsd -ResourceGroupName rg-labnet -Location westus -IpConfiguration @($ipConfig1, $ipConfig2) -DestinationIPAddress 192.168.111.120

Private Link Service の Direct Connect を作る際に ipconfig を2つ指定したので、仮想ネットワークには Private Link Service が利用する NIC が2つ生えます。IP アドレスは 10.3.2.4 と 10.3.2.5 になりました。

$res = Invoke-AzRestMethod -Method GET -Uri "https://management.azure.com/subscriptions/$subId/resourceGroups/rg-labnet/providers/Microsoft.Network/virtualNetworks/lab-wu-vnet/subnets/plsd?api-version=2024-01-01&`$expand=ipConfigurations"
$subnet = $res.Content | ConvertFrom-Json
$plsdnic = $subnet.properties.ipConfigurations | Where-Object {$_.id -like "*plsd*" }
$plsdnic.properties.privateIPAddress

10.3.2.4
10.3.2.5

そして、作成した Private Link Service に接続する Private Endpoint を作成します。

$vnet = Get-AzVirtualNetwork -name pls-vnet -ResourceGroupName rg-pls-directconnect
$peSubnet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $vnet -Name vm

# Create Private Endpoint
$privateLinkserviceConnection = @{
    Name = "connection-to-pls"
    PrivateLinkserviceId = $pls.id
}

$privateEndpoint = New-AzPrivateEndpoint -Name "pe-to-plsd" -ResourceGroupName rg-pls-directconnect -Location westus -Subnet $peSubnet -PrivateLinkserviceConnection $privateLinkserviceConnection

Private Endpoint の IP アドレスは 10.0.0.4 になりました。

$res = Invoke-AzRestMethod -Method GET -Uri "https://management.azure.com/subscriptions/$subId/resourceGroups/rg-pls-directconnect/providers/Microsoft.Network/virtualNetworks/pls-vnet/subnets/vm?api-version=2024-01-01&`$expand=ipConfigurations"
$subnet = $res.Content | ConvertFrom-Json
$penic = $subnet.properties.ipConfigurations | Where-Object {$_.id -like "*pe-to-plsd*" }
$penic.properties.privateIPAddress

10.0.0.4

動作確認

オンプレのプロキシサーバーは TCP8080 で Listen していますので、動作確認用の仮想マシンのプロキシ設定に Private Endpoint の IP アドレスを含む 10.0.0.4:8080 を指定します。

> (Get-ItemProperty -Path "Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings").ProxyServer
10.0.0.4:8080

ブラウザでサイトを開くと閲覧できます。自身の IP を確認するサイトにアクセスすると、Azure のグローバル IP アドレスではなくオンプレミスこと自宅のグローバル IP アドレスになっています。よさげです。

> invoke-webrequest http://ifconfig.me/ip

StatusCode        : 200
StatusDescription : OK
Content           : 36.2.xxx.xxx
RawContent        : HTTP/1.1 200 OK
                    access-control-allow-origin: *
                    X-Cache: MISS from proxy01
                    X-Cache-Lookup: MISS from proxy01:8080
                    Connection: keep-alive
                    Content-Length: 11
                    Content-Type: text/plain
                    Date: Fri, 17...
Forms             : {}
Headers           : {[access-control-allow-origin, *], [X-Cache, MISS from proxy01], [X-Cache-Lookup, MISS from
                    proxy01:8080], [Connection, keep-alive]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : System.__ComObject
RawContentLength  : 11

プロキシサーバには、Private Link Service が利用している NIC の IP アドレスからのアクセスログが記録されます。どちらか片方が使われるというわけでなく、両方とも利用されました。

2025-10-17 04:54:29.987    259 10.3.2.5 TCP_MISS/200 11024 GET http://ifconfig.me/ - HIER_DIRECT/34.160.111.145 text/html
2025-10-17 04:55:20.112    137 10.3.2.4 TCP_MISS/200 279 GET http://ifconfig.me/ip - HIER_DIRECT/34.160.111.145 text/plain

まとめ

新たにプレビューになった Private Link Service の Direct Connect を利用して、オンプレミスにアクセスできるかを確認しました。仮想ネットワーク内の IP アドレスだけでなく、Private Link Service から到達性さえあればオンプレミスのアドレスも利用できるようです。そうなると使い方は無限大な気がします。

今回のシナリオでは、プロキシを使いたいサーバが存在する仮想ネットワークをスポークとしてハブに接続するのが素直な実装だと思います。ですが、アドレスが重複していたり、ピアリングの上限に到達していたりすると採用できません。そんな困ったときの必殺技として覚えておくとよさそうです。

Note

  • 当サイトは個人のブログです。このブログに示されている見解や意見は個人的なものであり、所属組織の見解や意見を表明するものではありません。
  • 公開情報を踏まえて正確な情報を掲載するよう努めますが、その内容の完全性や正確性、有用性、安全性、最新性について一切保証しません。
  • 添付文章やリンク先などを含む本サイトの内容は作成時点でのものであり、予告なく変更される場合があります。