🚅

Equinix Fabric と Equinix Metal で ExpressRoute の環境を作る

2024/06/16に公開

ExpressRoute(プライベートピアリング) は閉域網のサービスで、Azure の 仮想ネットワークとオンプレミスを閉域で接続できます。ExpressRoute の利用には、Azure の契約(サブスクリプション)以外にも、物理的な回線を提供しているサービスプロバイダーとの契約が必要です。
検証においては、サービスプロバイダーとの契約がハードルになることがありなかなか試すことが難しいのですが、Equinix のサービスを利用するとクレジットカード払いの従量課金で利用できるのである程度簡単に試せます。

この記事では、Equinix Fabric と Equinix Metal を利用して、ExpressRoute と接続する方法を紹介します。

構成する全体像:

利用するサービス

今回の一連の手順で利用するサービスがいくつかあるので初めに整理しておきます。

  • Equinix Metal
    Equinix のベアメタルサービスです。物理サーバーのデプロイや回線のデプロイができます。
    Azure 回線の接続については Fabric で設定するのですが、Equinix のデータセンター側の展開は Metal で扱うイメージです。

Interconnections という機能を使います。

https://deploy.equinix.com/developers/docs/metal/interconnections/introduction/

  • Equinix Fabric
    Metal で作成した回線を使って、他のクラウドサービスと接続できるサービスです。以下のドキュメントに ExpressRoute との接続方法が記載されています。

https://docs.equinix.com/en-us/Content/Interconnection/Fabric/connections/Fabric-ms-azure.htm

  • ExpressRoute
    Azure 側のリソースです。Equinix Fabric でConnectionを作成する際に、ExpressRoute のサービスキーを使用して接続します。
    ついでに、仮想ネットワーク、ExpressRoute Gateway、仮想マシンも作っておきましょう。

0. アカウントの作成と事前準備

Equinix Metal と Equinix Fabric のアカウントの作成と Project の作成

少し分かり辛いのですが、Equinix Metal と Equinix Fabric は、それぞれ別のアカウントになっています。ただアカウントの統合化がされているようで、サインアップ後しばらくするとメールアドレスを ID とした統合アカウントでログインできるようになる案内が来ます。

Equinix Metal では、OrganizationProject という概念があります。Organization は Azure でいうと EntraID のテナント(ID管理ではないですが契約の単位?)のようなもので、Project はサブスクリプションのようなものです。Organizationで支払方法の設定をし、Projectの中にリソースを展開します。

ProjectOrganization に紐づいているので、Organization を作成してから Project を作成します。

以降の手順は、Equnix Metal で予め OrganizationProject を作成してある前提で進めます。

ExpressRoute 回線の作成

Azure 上に ExpressRoute 回線を作成しておきます。リージョンは、Equinix Metal で作成する回線のリージョンに合わせておきます。
また、作成されたら、Service Key をメモしておきます。

1. Equinix Fabric と Equinix Metal を ExpressRoute と接続する

1.1 Equinix Metal で回線を作成する

まずは、Equinix Metal のコンソールで回線を作成します。

Request Interconnection から回線を作成します。 Metro は、ExpressRoute のリージョンに合わせて選択します。

Fabric VCMetal Billed で作成します。

Interconnection redundancy type は、Single もしくは Redundant で作成します。
(ただし私の環境だと Equinix Fabric側の接続を作成するときに冗長にしようとしてもウィザードで先に進めなくなったのでこの記事では冗長構成にはしていません)

Metal VLAN は、Create new VLAN で作成します。この VLAN ID は後でベアメタルのサーバーと接続する際に使うのでメモっておきます。

最後までウィザードを進めると回線が作成され、トークンが払い出されます。このトークンは Equinix Fabric で回線を作成する際に使います。

ウィザードのスクリーンショット







1.2 Equinix Fabric で ExpressRoute との接続を作成する

次に、Equinix Fabric のコンソールで ExpressRoute と接続します。

Create Connection からウィザードを開始します。

Microsoft Azure のメニューがあるのでCreate Connectionを選択し、Use a Token の次のページで Equinix Metal で払い出されたトークン(図中1)と、ExpressRoute のService Key(図中2)を入力します。


次の Connection Details に進みます。Name は任意のものを選択し、Peering Type は Private を選択します。Seller C-Tag には、ExpressRoute 回線で指定する VLAN ID を入力します。
これは、Equinix Metal で作成した VLAN ID とは違うものです。

作成を完了すると、ExpressRoute の Provider statusProvisoned になります。

回線作成ウィザードのスクリーンショット








回線のインベントリのスクリーンショット






1.3 ExpressRoute でピアリングを作成する

ExpressRoute のピアリングを作成します。
Peer ASN は、Equinix Metal でこれから作成するベアメタルサーバー上の BGP の ASN と同じものを指定します。
VLAN ID は、Equinix Fabric で指定した VLAN ID(Seller C-Tag)と同じものを指定します。

2. Equinix Metal でのサーバーの作成と ExpsressRoute との BGP 接続

2.1 サーバーの作成

続いて、Equinix Metal でルーター用のサーバーを作成し、ExpressRoute と BGP で接続します。Azure で仮想マシンを作ったことがあれば何となくわかると思います。
サイズは一番小さいc3.small.x86で十分です。

サーバーの作成ウィザードのスクリーンショット





作成したサーバーのネットワークの設定を Hybrid Bonded Mode に変更して、VLANIDを指定できるようにします。
https://deploy.equinix.com/developers/docs/metal/layer2-networking/hybrid-bonded-mode/

この時、VLANは、Equinix Metal の回線作成時に指定した VLAN ID を指定します。

2.2 ルーターの設定

作成したサーバーに SSH でログインして、ルーターを設定していきます。
SSH は、グローバルIPアドレスに対して直接接続できます。ユーザー名は root です。

今回はルーターに FRRouting を使用します。

Equinix Metal のサーバーはシリアルコンソールへ SSH でログインできるのでネットワーク周りの設定をする時にはおすすめです。

インターフェースの設定

作成された bond インターフェースに VLAN を設定します。IP アドレスは、ExpressRoute のプライベートピアリングを作成した時に指定した Primary アドレス空間の若番を指定します。

インターフェースの設定
root@c3-small-x86-01:/etc/network# cat interfaces
auto lo
iface lo inet loopback

auto enp1s0f0np0
iface enp1s0f0np0 inet manual
    bond-master bond0

auto bond0
iface bond0 inet static
    address ****
    netmask 255.255.255.254
    gateway ****
    dns-nameservers **** ****

    bond-downdelay 200
    bond-miimon 100
    bond-mode 4
    bond-updelay 200
    bond-xmit_hash_policy layer3+4
    bond-lacp-rate 1
    bond-slaves enp1s0f0np0

iface bond0 inet6 static
    address ****
    netmask 127
    gateway ****

auto bond0:0
iface bond0:0 inet static
    address 10.79.72.129
    netmask 255.255.255.254
    post-up route add -net 10.0.0.0/8 gw 10.79.72.128
    post-down route del -net 10.0.0.0/8 gw 10.79.72.128

##### 以下追加 ####
auto bond0.1000
iface bond0.1000 inet static
    pre-up sleep 5
    address 192.168.0.1
    netmask 255.255.255.252
    vlan-raw-device bond0

systemctl restart networking.service で設定を反映します。

FRRouting の設定

FRRouting のインストールと設定をします。

FRRoutingのインストール
curl -s https://deb.frrouting.org/frr/keys.asc | sudo apt-key add -
apt update && apt -y install frr frr-pythontools
sed -i s/bgpd=no/bgpd=yes/ /etc/frr/daemons

FRRouting の設定ファイルを編集します。この設定では、以下を前提にしています。BGP のあたりはもうちょっと綺麗に出来そうですね。

  • MSEE は 192.168.0.2
  • ASN は64580 を使用
  • Azure の仮想ネットワークのアドレス空間は 10.0.0.0/16
  • 確認用に 192.168.100.0/24 を広報する
  • このサーバーをデフォルトルートのネクストホップにして強制トンネリングする
FRRouting の設定
/etc/frr/frr.conf
frr version 8.1
frr defaults traditional
hostname c3-small-x86-01
log syslog informational
no ipv6 forwarding
service integrated-vtysh-config
!
ip route 192.168.0.0/24 bond0.1000
ip route 192.168.100.0/24 Null0
!
router bgp 64580
 bgp router-id 192.168.0.1
 bgp log-neighbor-changes
 neighbor 192.168.0.2 remote-as 12076
 neighbor 192.168.0.2 ebgp-multihop 255
 !
 address-family ipv4 unicast
  network 192.168.0.0/24
  network 192.168.100.0/24
  neighbor 192.168.0.2 default-originate
  neighbor 192.168.0.2 soft-reconfiguration inbound
  neighbor 192.168.0.2 route-map rmap-bogon-asns in
  neighbor 192.168.0.2 route-map rmap-azure-asns out
 exit-address-family
exit
!
bgp as-path access-list azure-asns seq 5 permit _65515_
bgp as-path access-list azure-asns seq 10 permit _12076_
bgp as-path access-list bogon-asns seq 5 permit _0_
bgp as-path access-list bogon-asns seq 10 permit _23456_
bgp as-path access-list bogon-asns seq 15 permit _1310[0-6][0-9]_|_13107[0-1]_
bgp as-path access-list bogon-asns seq 20 deny _65515_
bgp as-path access-list bogon-asns seq 25 permit ^65
!
route-map rmap-bogon-asns deny 5
 match as-path bogon-asns
exit
!
route-map rmap-bogon-asns permit 10
exit
!
route-map rmap-azure-asns deny 5
 match as-path azure-asns
exit
!
route-map rmap-azure-asns permit 10
exit
!

強制トンネリングするために、このサーバーを転送用のルーターとしても使います。

sysctl.confの変更
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p

強制トンネリングされてきたパケットを外部に送るために、iptables の設定をします。

iptables の設定
iptables -t nat -A POSTROUTING -d 10.0.0.0/8 -j RETURN
iptables -t nat -A POSTROUTING -d 172.16.0.0/12 -j RETURN
iptables -t nat -A POSTROUTING -d 192.168.0.0/16 -j RETURN
iptables -t nat -A POSTROUTING ! -s 192.168.0.1/32 -o bond0 -j MASQUERADE
iptables -t nat -A POSTROUTING ! -s 10.79.30.129/32 -o bond0 -j MASQUERADE
iptables -t nat -A POSTROUTING ! -s 147.75.94.xxx/32 -o bond0 -j MASQUERADE
iptables の永続化
apt install iptables-persistent
# iptables を変更したら実行
netfilter-persistent save

この設定は以下の記事を参考にさせてもらいました。
https://zenn.dev/microsoft/articles/forced-tunneling-with-ars-and-frrouting

2.3 設定後の確認

ここまでで BGP のピアの接続と強制トンネリングが出来たのでそれぞれの状態を確認してみます。

  • ルーターのルートテーブル
c3-small-x86-01# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

K>* 0.0.0.0/0 [0/0] via 147.75.94.194, bond0 onlink, 00:17:09
K>* 10.0.0.0/8 [0/0] via 10.79.30.128, bond0, 00:17:09
B>* 10.0.0.0/16 [20/0] via 192.168.0.2, bond0.1000, weight 1, 00:17:03  <---------------- Azure の仮想ネットワークのアドレス
B>* 10.1.0.0/16 [20/0] via 192.168.0.2, bond0.1000, weight 1, 00:14:18  <---------------- 同上(ゲートウェイが存在する仮想ネットワークに別の仮想ネットワークをピアリングしてみた)
C>* 10.79.30.128/31 is directly connected, bond0, 00:17:09
C>* 147.75.94.194/31 is directly connected, bond0, 00:17:09
S>* 192.168.0.0/24 [1/0] is directly connected, bond0.1000, weight 1, 00:17:08
C>* 192.168.0.0/30 is directly connected, bond0.1000, 00:17:09
S>* 192.168.100.0/24 [1/0] unreachable (blackhole), weight 1, 00:17:08
c3-small-x86-01#

########## 広報しているルート
c3-small-x86-01# show ip bgp neighbors 192.168.0.2 advertised-routes
BGP table version is 4, local router ID is 192.168.0.1, vrf id 0
Default local pref 100, local AS 64580
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

Originating default network 0.0.0.0/0

   Network          Next Hop            Metric LocPrf Weight Path
*> 192.168.0.0/24   0.0.0.0                  0         32768 i
*> 192.168.100.0/24 0.0.0.0                  0         32768 i

Total number of prefixes 2

########## 学習しているルート
c3-small-x86-01# show ip bgp neighbors 192.168.0.2 received-routes
BGP table version is 4, local router ID is 192.168.0.1, vrf id 0
Default local pref 100, local AS 64580
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

   Network          Next Hop            Metric LocPrf Weight Path
*> 10.0.0.0/16      192.168.0.2                            0 12076 i
*> 10.1.0.0/16      192.168.0.2                            0 12076 i

Total number of prefixes 2
c3-small-x86-01#  
  • ExpressRoute ゲートウェイの学習しているルート
> az network vnet-gateway list-learned-routes -g rg-expressroute -n gw-er
Network           NextHop    Origin    SourcePeer    AsPath       Weight
----------------  ---------  --------  ------------  -----------  --------
10.0.0.0/16                  Network   10.0.2.13                  32768
192.168.100.0/24  10.0.2.4   EBgp      10.0.2.4      12076-64580  32769
192.168.0.0/24    10.0.2.4   EBgp      10.0.2.4      12076-64580  32769
0.0.0.0/0         10.0.2.4   EBgp      10.0.2.4      12076-64580  32769
10.1.0.0/16                  Network   10.0.2.13                  32768

  • ExpressRoute回線 のルートテーブル

  • ExpressRoute ゲートウェイと同じ仮想ネットワークに存在する仮想マシンの Effective Route

  • Azure 上の仮想マシンからのトラフィックの確認

tsunomur@vm-er-test:~$ curl ifconfig.me
147.75.94.xxx <-------- Equinix Metal のサーバーのグローバル IP
tsunomur@vm-er-test:~$ traceroute ifconfig.me
traceroute to ifconfig.me (34.117.118.44), 64 hops max
  1   10.0.2.4  3.740ms  2.496ms  2.524ms     <------- ExpressRoute Gateway
  2   192.168.0.1  3.821ms  3.476ms  3.454ms  <------- Equinix Metal のサーバー
  3   169.254.137.1  3.207ms  2.951ms  2.668ms
  4   10.253.105.52  4.143ms  3.785ms  4.107ms
  5   10.253.104.12  3.398ms  4.104ms  3.441ms
  6   147.28.130.xx  5.624ms  5.011ms  4.874ms
  7   147.28.130.xxx  5.514ms  5.557ms  5.050ms
  8   108.170.248.xxx  6.253ms  5.978ms  6.413ms
  9   209.85.242.xx  4.782ms  4.673ms  4.576ms
 10   34.117.118.44  4.151ms  7.583ms  3.948ms

まとめ

物理環境とサービスプロバイダーの契約が無いとなかなか試せない ExpressRoute ですが、Equinix Metal と Equinix Fabric を使うことで全てリモートで、かつ数時間で試すことができました。料金も従量課金なので数百円で済みます。
ExpressRoute は実際に試してみないと分からないことが多くあるので皆さんもぜひ Equnix のサービスを活用してみてください。

Microsoft (有志)

Discussion