🔥

ARS と FRRouting を使った強制トンネリング環境を作る

2023/05/12に公開

ARS と FRRouting を使った強制トンネリング環境を作る

お仕事している中で、強制トンネリングに出会うことはまぁまぁありますが、それの検証環境を作るのは意外と大変だったりします。
VPN Gateway を使った方法もあるのですが、ここでは ARS (Azure Route Server) と NVA (として利用する FRRouting on Ubuntu Server 20.04) を使った本気の (?) の強制トンネリング環境を作っていきます。

参考実装

参考実装はこちらです。

https://github.com/skmkzyk/bicep-templates/tree/main/20230509_forced-tunneling

構成概要

  • ExpressRoute circuit を適当に作成する
  • クラウド想定の VNet #1 と、オンプレミス想定の VNet #2 を作成し、ExpressRoute でそれぞれを接続する
  • クラウド想定の VNet #1 には強制トンネリングの影響を回避してリモート接続するための jump server を作成する
  • オンプレミス想定の VNet #2 には ARS (Azure Route Server) と NVA のための Ubuntu Server 20.04 を作成する
  • ARS と NVA の間で BGP の neighbor を張る
  • クラウド想定の VNet #1 にある client 用 Azure VM から通信させ、その送信元が NVA の Public IP アドレスになっていることを確認する

参考実装の main.bicep においては、それぞれの Azure VM は以下の名前で作成されます。

  • client: vm-hub00
  • jump server: vm-jump00
  • NVA: vm-nva100

NVA となる vm-nva100 に関しては以下のように設定されています。

  • Azure 側
    • IP Forwarding の有効化
    • Public IP アドレスを関連づける
    • NSG で送信元の Service Tag を VirtualNetwork、宛先の Service Tag を Internet とした Inbound rule を作成
    • UDR で 0.0.0.0/0 を Internet に向ける設定を入れ、強制トンネリングの影響を受けないようにする
  • Ubuntu Server の OS 側設定
    • /etc/sysctl.conf での net.ipv4.ip_forward=1 を uncomment して IP forwarding の有効化
      • sed -i.org 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf; sysctl -p の 2 行 (実質 1 行) で一撃です
    • iptables -t nat に以下の内容を追加し、ifconfig.me へのアクセスに対して NAT の有効化
      •   iptables -t nat -A POSTROUTING -d 168.63.129.16/32 -j RETURN
          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 10.100.0.10/32 -o eth0 -j MASQUERADE
        
      • (Azure DNS などで利用する 168.63.129.16 を NAT から除外)
      • (RFC1918 の範囲を NAT から除外、以下同様)
      • (除外されなかった traffic は NVA として利用しているこの仮想マシン自体の packet を除き MASQUERADE し、送信元 IP アドレスを SNAT)
    • iptables の追加が終わったら apt install iptables-persistent で永続化する
      • これやらないと再起動するたびに iptables の内容が消える

NVA の要件については Azure 仮想ネットワーク トラフィックのルーティング に以下のように書かれているのでそれに則っています。

仮想アプライアンス:次のようなアプライアンスである必要があります。

  • インターネットからアクセスできる。
  • パブリック IP アドレスが割り当てられている。
  • デバイスとの通信の妨げとなるネットワーク セキュリティ グループの規則が関連付けられていない。
  • 通信を拒否しない。
  • ネットワーク アドレス変換を実行し、転送することができる。または、サブネット内の宛先リソースへのトラフィックをプロキシし、トラフィックをインターネットに送信できる。

以前書いたこれらの記事も参考にしています。

  • FRRouting を cloud-init で構成する

https://zenn.dev/skmkzyk/articles/frrouting-cloud-init

  • Azure Route Server と FRRouting の間で BGP ピアを張る

https://zenn.dev/skmkzyk/articles/azure-route-server-frrouting

FRRouting sample config

参考にした Zenn の記事から、IP アドレスを変更しています。
また、0.0.0.0/0 を経路広報するために neighbor x.x.x.x default-originate という設定を追加しています。

vm-nva100# show run
Building configuration...

Current configuration:
!
frr version 8.5.1
frr defaults traditional
hostname vm-nva100
log syslog informational
no ipv6 forwarding
service integrated-vtysh-config
!
ip route 10.100.210.0/24 10.100.0.1
!
router bgp 65001
 neighbor 10.100.210.4 remote-as 65515
 neighbor 10.100.210.4 ebgp-multihop 255
 neighbor 10.100.210.5 remote-as 65515
 neighbor 10.100.210.5 ebgp-multihop 255
 !
 address-family ipv4 unicast
  neighbor 10.100.210.4 default-originate
  neighbor 10.100.210.4 soft-reconfiguration inbound
  neighbor 10.100.210.4 route-map rmap-bogon-asns in
  neighbor 10.100.210.4 route-map rmap-azure-asns out
  neighbor 10.100.210.5 default-originate
  neighbor 10.100.210.5 soft-reconfiguration inbound
  neighbor 10.100.210.5 route-map rmap-bogon-asns in
  neighbor 10.100.210.5 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 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
!
end

結果

vm-hub00 から curl.exe で ifconfig.me にアクセスし、NAT された送信元 IP アドレスが何になっているかを確認します。
記事として書くにあたり mask してしまっているのですが、ただこの IP アドレスが NVA に紐づけた Public IP アドレスであることは確認しています。

> curl.exe https://ifconfig.me
52.140.x.x

参考

  • Build a forced tunneling architecture with Azure Route Server

https://github.com/skmkzyk/bicep-templates/blob/main/20230509_forced-tunneling/

  • Azure 仮想ネットワーク トラフィックのルーティング

https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview#default-route

  • Azure Route Server を利用して Azure Firewall へのデフォルトルートを生成する

https://blog.aimless.jp/archives/2022/07/create-default-route-to-firewall-with-route-server-nexthop/

  • Ubuntuでiptablesを再起動後にも保持する方法

https://qiita.com/yas-nyan/items/e5500cf67236d11cce72

  • 強制トンネリング環境で一部通信をAzure Firewall経由で外に向ける構成について

https://zenn.dev/zukako/articles/5ae86e212203ae

  • ExpressRoute 検証環境をシュッと作る

https://zenn.dev/skmkzyk/articles/crisp-expressroute

  • FRRouting を cloud-init で構成する

https://zenn.dev/skmkzyk/articles/frrouting-cloud-init

  • Azure Route Server と FRRouting の間で BGP ピアを張る

https://zenn.dev/skmkzyk/articles/azure-route-server-frrouting

Microsoft (有志)

Discussion