📘

Public IP アドレスを VNet の中で使いたい

2022/11/18に公開

勝手グローバルを許すな

というのもそれはそうなんですが、そうではなくまっとうに VNet の中で Public IP (というか global IP) アドレスを使いたかったとしましょう。
普通に VNet のアドレス空間として global IP アドレスを書いて、それを subnet に割り当てられればそれはそれで動くと思います。
が、今回は /32 だけ割り当てたいということで少し工夫していきます。

参考実装

参考実装はこちらです。

https://github.com/skmkzyk/bicep-templates/tree/main/20221114_public-ip-in-vnet

構成図

構成図はこちらです。

public ip in vnet

参考実装では VNet は 4 つあるため、若干内容は異なりますが、大筋変わっていないのでお許しください。

  • Hub-spoke VNet と branch VNet
  • 適当な ExpressRoute circuit
    • Hub と Branch を ExpressRoute Gateway を使って接続
  • BGP で経路を入れるための ARS (Azure Route Server)
    • Peer として spoke にある NVA VM を指定しておきます
  • NVA VM には FRRouting を入れます

構成のポイント

は GitHub 側にも書いてあるので冗長にはなりますが、こちらにも書いておきます。

  • 目的の IP アドレス (ここでは 1.2.3.4/32) を eth0 の secondary IP として付与する
  • その IP アドレスを FRRouting を使って BGP で ARS に経路広報する
  • NVA VM の NIC において、IP forwarding の設定を有効化しておく

これらの設定をすることで、VNet の中で /32 の経路が伝搬していきます。
Hub VM からも、ExpressRoute で接続された Branch VM からも 1.2.3.4/32 宛ての通信が可能になります。

結果

GitHub の方からそのままコピペしたもの。
まぁ、できたね、というだけなので。。

ikko@vm-hub200:~$ sudo ./ethr -c 1.2.3.4 -p tcp -port 22 -t tr

Ethr: Comprehensive Network Performance Measurement Tool (Version: v1.0.0)
Maintainer: Pankaj Garg (ipankajg @ LinkedIn | GitHub | Gmail | Twitter)

Using destination: 1.2.3.4, ip: 1.2.3.4, port: 22
Tracing route to 1.2.3.4 over 30 hops:
 1.|--???
 2.|--1.2.3.4 []                                                             4.999ms
Ethr done, measurement complete.
ikko@vm-hub200:~$ ping -c 3 1.2.3.4
PING 1.2.3.4 (1.2.3.4) 56(84) bytes of data.
64 bytes from 1.2.3.4: icmp_seq=1 ttl=63 time=5.25 ms
64 bytes from 1.2.3.4: icmp_seq=2 ttl=63 time=5.35 ms
64 bytes from 1.2.3.4: icmp_seq=3 ttl=63 time=5.28 ms

--- 1.2.3.4 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 5.245/5.291/5.351/0.044 ms
Microsoft (有志)

Discussion