Equinix Fabric と Equinix Metal で ExpressRoute の環境を作る
ExpressRoute(プライベートピアリング) は閉域網のサービスで、Azure の 仮想ネットワークとオンプレミスを閉域で接続できます。ExpressRoute の利用には、Azure の契約(サブスクリプション)以外にも、物理的な回線を提供しているサービスプロバイダーとの契約が必要です。
検証においては、サービスプロバイダーとの契約がハードルになることがありなかなか試すことが難しいのですが、Equinix のサービスを利用するとクレジットカード払いの従量課金で利用できるのである程度簡単に試せます。
この記事では、Equinix Fabric と Equinix Metal を利用して、ExpressRoute と接続する方法を紹介します。
構成する全体像:
利用するサービス
今回の一連の手順で利用するサービスがいくつかあるので初めに整理しておきます。
- Equinix Metal
Equinix のベアメタルサービスです。物理サーバーのデプロイや回線のデプロイができます。
Azure 回線の接続については Fabric で設定するのですが、Equinix のデータセンター側の展開は Metal で扱うイメージです。
Interconnections
という機能を使います。
- Equinix Fabric
Metal で作成した回線を使って、他のクラウドサービスと接続できるサービスです。以下のドキュメントに ExpressRoute との接続方法が記載されています。
- ExpressRoute
Azure 側のリソースです。Equinix Fabric でConnection
を作成する際に、ExpressRoute のサービスキーを使用して接続します。
ついでに、仮想ネットワーク、ExpressRoute Gateway、仮想マシンも作っておきましょう。
0. アカウントの作成と事前準備
Equinix Metal と Equinix Fabric のアカウントの作成と Project の作成
少し分かり辛いのですが、Equinix Metal と Equinix Fabric は、それぞれ別のアカウントになっています。ただアカウントの統合化がされているようで、サインアップ後しばらくするとメールアドレスを ID とした統合アカウントでログインできるようになる案内が来ます。
Equinix Metal では、Organization
と Project
という概念があります。Organization
は Azure でいうと EntraID のテナント(ID管理ではないですが契約の単位?)のようなもので、Project
はサブスクリプションのようなものです。Organization
で支払方法の設定をし、Project
の中にリソースを展開します。
Project
は Organization
に紐づいているので、Organization
を作成してから Project
を作成します。
以降の手順は、Equnix Metal で予め Organization
と Project
を作成してある前提で進めます。
ExpressRoute 回線の作成
Azure 上に ExpressRoute 回線を作成しておきます。リージョンは、Equinix Metal で作成する回線のリージョンに合わせておきます。
また、作成されたら、Service Key
をメモしておきます。
1. Equinix Fabric と Equinix Metal を ExpressRoute と接続する
1.1 Equinix Metal で回線を作成する
まずは、Equinix Metal のコンソールで回線を作成します。
Request Interconnection
から回線を作成します。 Metro
は、ExpressRoute のリージョンに合わせて選択します。
Fabric VC
の Metal 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 status
が Provisoned
になります。
回線作成ウィザードのスクリーンショット
回線のインベントリのスクリーンショット
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を指定できるようにします。
この時、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 のインストールと設定をします。
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 の設定
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
!
強制トンネリングするために、このサーバーを転送用のルーターとしても使います。
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
強制トンネリングされてきたパケットを外部に送るために、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
apt install iptables-persistent
# iptables を変更したら実行
netfilter-persistent save
この設定は以下の記事を参考にさせてもらいました。
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 のサービスを活用してみてください。
Discussion