外部記憶装置

脳みそ小さすぎるからメモしとく

L3 技術で研究活動を快適にした話

これは CAMPHOR- Advent Calendar 2020 の12日目の記事です

advent.camph.net

はじめに

どうも、 PiBVT です。CAMPHOR- は11月ごろに初めて行ったばかりで、最近は研究が忙しくて行けてない状態です。

学生エンジニアの方が多く訪れる CAMPHOR- のアドベントカレンダーなので、技術的なことについて書いていきます。

免責事項

当記事の著者 PiBVT は当記事に基づいて行う一切の行為について、何らの責任を負うものではありません。

何をしたのか

研究室に配属された

今年からネットワーク関係の研究室に配属されたのですが、研究室に所属すると以下のメリットがあります

  • 大量の書籍
  • 自分専用のデスク
  • 自由に議論ができるスペース・ホワイトボード
  • やわらかいソファー

学部3回生までの生活とは一変し、研究室で生活できるのでは?と思うくらいに充実しています。

第1世代ネットワーク

院試に無事?合格したのち、研究室でお手伝いをするうちに研究室の VM サーバーを利用する権利を手に入れました。 研究室の VM サーバーでは結構強めで安定した VM を立てれるため、研究に関する開発の一切を研究室の VM 上で行うことにしました。

しかし、研究室の VM は学外からは専用の踏み台や VPN 経由で接続する必要があり、毎回接続するのは面倒です。 また、自宅サーバーに置いているデータを取り寄せるのも面倒です。

そこで、最初は VM と自宅のネットワーク間で VPN を張っていました。

f:id:PiBVT:20201210225228j:plain
第1世代ネットワーク

今回利用した VPN プロトコルが自宅ネットワークのコアルーターである RTX1200 に対応していなかったため、カプセリング用に別途 VyOS VM を用意しました。 自宅のルーターに VyOS を経由する研究室 VM への経路を静的経路として追加することで、自宅のネットワークと VM 間がシームレスに通信できるようになり、非常に快適になりました。

※図中の IP アドレスや AS 番号などはすべて仮のものです。図の通りに運用しているわけではありません。 「セキュリティがなってない!けしからん!」などの意見はご遠慮ください。書いてないだけなので。

※KUINS3 (京都大学の学内ネットワーク) では特定の VPN プロトコルで対外接続が可能です。

第2世代ネットワーク

せっかくネットワークの研究室に属しているのですから、けしからんことをしたくなるのが当然です。 先生や先輩と色々雑談しているうちに、以下の機材・権利を手に入れました。

  • Cisco の小型スイッチ・ルーター
  • 研究室内で割り当てられるプライベート v4 アドレスセグメント
  • (そこそこ自由に)研究室のネットワーク機器を操作する権利

弊研究室は、各個人にセパレーターで区切られた個人的なデスク・環境が割り当てられています。 機材を置くのに十分なスペースがあったため、デスクサイドに持ち込んだ Raspberry Pi などを利用して写真のような環境を構築しました。

f:id:PiBVT:20201210224957j:plain
デスクサイドの機材

機材を置けばそれらを家から操作したくなるのは当然のことなので、自分専用のオーバーレイネットワークは図のようになりました。

f:id:PiBVT:20201211021115j:plain
第2世代ネットワーク

デスクサイドと VM 間は L3 でトンネリングしていますが、VLAN 切り出せばよかったことに今気が付きました。 トンネリングをして、各ルーターに静的経路を設定すれば無事自宅からでもデスクサイドのネットワークに入れるようになりました。 研究室のデスクから自分のプライベートサブネットに接続すれば、自宅ネットワークにもそのままアクセス出来て快適です。

第3世代ネットワーク

便利なネットワークを構築できたことにより、研究も快適にできるようになりました(注:快適でも成果が出るわけではない)

しかし、ある日学内ネットワークの障害(一部対外接続の不通)により研究活動が停止してしまいました。 ネットワークの研究を行う学生として、ネットワークの障害で研究が止まるのはけしからん、 ということで学内のネットワークが死んだ場合でも大丈夫なネットワークへ改良することにしました。

研究室には学内ネットワークの KUINS 経由で外部に疎通する経路と、研究室独自の WIDE 経由で外部に疎通する経路(v6 のみ) があります。 そこで、 v6 をバックアップ経路として利用することにしました。

また、VPN で接続している自宅(S〇ftBank 回線)から大学の VM に到達する経路が東京を経由するというけしからんことが判明したため、 この問題にも対処することにしました。(SINET と直接接続している JPNAP と JPIX のトランジットポリシー?)

以下の図が最終的なネットワークの構成図となります。

f:id:PiBVT:20201210225541j:plain
第3世代ネットワーク

VyOS や FRRouting などのソフトウェアルーターを活用することで実費0円で構築することが出来ました。

対外接続時の経路切り替えは、各セグメントごとにプライベート AS 番号を割り当てて BGP を利用することで自動的に到達可能な経路になるようにしました。 デスクサイドと研究室VM の間で AS が異なるのはデスクサイドと VM 間が L3 でトンネルされていた影響です。 IGP は RIP を利用しています。簡単なネットワークなので。(フラグ)

自宅で契約している S〇ftBank 回線と SINET が東京でトランジットしている問題は、 さくらインターネットさんの大阪リージョンで VPS を借りてプライベートトランジットとして利用することで解決しています。

大阪にプライベートトランジットを置いた結果はグラフから確認できます。遅延がほぼ半分になり、大成功といえるでしょう

f:id:PiBVT:20201210225921p:plain
遅延の変化

しかし、さくらインターネットさんの VPS に大量のトラフィックを流すと迷惑なので、レイテンシが気になるもの(SSH など)や観測用の ICMP 以外は すべて大学・自宅間を直接結ぶ経路に流しています(Policy Based Routing)。大学・自宅間が不通になった場合はすべてのトラフィックVPS を流れますが。

f:id:PiBVT:20201210230006j:plain
PBR を適用

この構成にしてから何度か発生した学内ネットワークの障害も乗り越え、研究活動を継続できる超絶快適な環境が完成しました(注:環境が快適でも成果は(ry)

AS?BGP?

AS は Autonomous System の略で、管理のまとまりの単位となります。

www.nic.ad.jp

AS 間でお互いに BGP で経路情報を交換すること(ピアリング)により、互いのネットワークへの疎通が取れるようになります。 つまり、インターネットとは複数の AS 間のピアリングによって構成されているということです。

f:id:PiBVT:20201211134354j:plain
AS 間のピアリング

しかし、すべてのAS(一般に ISP が多い)がお互いにピアリングをするとなると、回線や管理費がかかりすぎて大変です。 Tire1 ISPと呼ばれる、全世界規模にネットワークを張り巡らした最上位のプロバイダが 国内の Tier2, Tier3 のISP や事業者をトランジット(ピアしている相手のトラフィックを交換する)ことで全世界のネットワークに到達することが出来るようになります。 国内では NTT Communications の GIN(Global IP Network) が Tier1 ISP として有名です。

また、トランジットサービスを様々な事業者に提供している組織を IX(Internet eXchange) といいますが、国内では JPIX, JPNAP, BBIX が有名です。

なぜ東京経由?

しかし、トランジット自体もお金がかかるので、事業者がかならずしもすべての IX と接続されているわけではありません。 そのため、 京都大学の上流ネットワークである SINET では、商用 IX としては JPIX と JPNAP としか接続されていません。

www.sinet.ad.jp

www.peeringdb.com

S〇ftbank のIP網からのトラフィックは JPIX か JPNAP を経由する必要がありますが、SINET という学術ネットワークに関するトラフィックを わざわざお金がかかる大阪(堂島)でトランジットするわけでもなく東京(大手町)でまとめてトランジットしていると考えるのが妥当でしょう。

f:id:PiBVT:20201211013013j:plain

一方で、SINET からさくらインターネット大阪リージョンの VPS に対するトラフィックは JPIX OSAKA 経由で、S〇ftbank からは直接到達できるようになっているため、 非常に低遅延で到達することができます。

プライベートトランジットサーバー

ここまでの話を整理すると

となります。

つまり、さくらインターネット大阪リージョンの VPS を経由すればトラフィックの経路が関西圏内に収まり、 遅延をさらに減らすことができると期待できます。

f:id:PiBVT:20201211133839j:plain
大阪でトランジット

そのためには、VPS 上でトラフィックを交換する必要がありますが、ごく簡単に言えば単なるルーティングでしかないので 実証自体は容易にできます。

しかし今回の目的は「研究環境を快適にする」ことなので、動的経路制御をするとなると プライベート AS 番号を割り当てて BGP でピアを張ること必要があるわけです。 そのため、前述のような研究室と自宅を結ぶには大掛かりなネットワークになりました。

Docker で実験

ここまでつらつらと僕自身の体験や経験を書いてきましたが、せっかくなので手軽に似たことを実験してみました。

有志の方によって VyOS の Docker コンテナが作られているため、このコンテナを利用して簡易的な実験ネットワークを組みました。

github.com

ネットワークはこの図のような構成になっています。

f:id:PiBVT:20201211153442j:plain
構築するネットワーク

インターネットを通じて両端の client-65001 と client-65002 が互いに疎通できるようになっています。 しかし、今回の経験を踏まえ、 vyos-65001, vyos-65002 間の経路には計 16ms の遅延が発生するようになっています。(値は大阪・東京間で計測した結果から雰囲気で決めました)

各 VyOS のコンフィグには以下の設定が入るようになっています。

# vyos-internet の設定ファイル
#!/bin/vbash
source /opt/vyatta/etc/functions/script-template
configure

# configure hostname
set system host-name vyos-internet

# configure VLAN interface
set interfaces ethernet eth0 vif 100 address 192.168.1.1/30
set interfaces ethernet eth0 vif 200 address 192.168.1.5/30

# configure latency emulation policy
set traffic-policy network-emulator DELAY-8 network-delay 8
set interfaces ethernet eth0 vif 100 traffic-policy out DELAY-8
set interfaces ethernet eth0 vif 200 traffic-policy out DELAY-8

# configure static route to each vyos
set protocols static route 192.168.100.0/24 next-hop 192.168.1.2
set protocols static route 192.168.200.0/24 next-hop 192.168.1.6

# 環境によって変えること
set protocols static route 0.0.0.0/0 next-hop 172.19.0.1

# configure nat
set nat source rule 1001 outbound-interface eth0
set nat source rule 1001 source address 192.168.100.0/24
set nat source rule 1001 translation address masquerade
set nat source rule 1002 outbound-interface eth0
set nat source rule 1002 source address 192.168.200.0/24
set nat source rule 1002 translation address masquerade

commit
exit
# vyos-65001 の設定ファイル
#!/bin/vbash
ip route del default

source /opt/vyatta/etc/functions/script-template
configure

set system host-name vyos-65001

# configure loopback
set interfaces loopback lo address 192.168.100.1/32

# configure VLAN interface
set interfaces ethernet eth0 vif 100 address 192.168.1.2/30
set interfaces ethernet eth0 vif 150 address 192.168.100.1/25

commit

# configure static route
set protocols static route 0.0.0.0/0 next-hop 192.168.1.1

commit
exit
# vyos-65002 の設定ファイル
#!/bin/vbash
ip route del default

source /opt/vyatta/etc/functions/script-template
configure

set system host-name vyos-65002

# configure loopback
set interfaces loopback lo address 192.168.200.1/32

# configure VLAN interface
set interfaces ethernet eth0 vif 200 address 192.168.1.6/30
set interfaces ethernet eth0 vif 250 address 192.168.200.1/25

# configure static route
set protocols static route 0.0.0.0/0 next-hop 192.168.1.5

commit
exit

各クライアントは起動時に VLAN を設定しています。

# client-65001 の設定
#!/bin/bash

# delete default route via docker network
ip route del default

# configure vlan
ip link add link eth0 name eth0.150 type vlan id 150
ip a add 192.168.100.2/25 dev eth0.150
ip link set dev eth0.150 up

# configure default route via vyos
ip route add default via 192.168.100.1

# wait for tty
while true
do
  sleep 1
done
# client-65002 の設定
#!/bin/bash

# delete default route via docker network
ip route del default

# configure vlan
ip link add link eth0 name eth0.250 type vlan id 250
ip a add 192.168.200.2/25 dev eth0.250
ip link set dev eth0.250 up

# configure default route via vyos
ip route add default via 192.168.200.1

# wait for tty
while true
do
  sleep 1
done

簡単に説明すると、各 VyOS は ISP (vyos-internet) の保有するセグメントの IP アドレスを割り振られているため、それを Interface に対して設定します。 vyos-6500x と vyos-internet 間のリンクは Docker ブリッジを毎回作るのが面倒なので VLAN を切っています。 そのため、まず指定された vlan id の vif (vlan interface) を作成し、それから vif に対してアドレスを割り当てます。

vyos-internet は 65001 と 65002 の経路情報が必要なため、static route でそれぞれのネットワークについて設定しています。 vyos-6500x では、デフォルトルートについて、 vyos-internet が外界に出れる GW となるので vyos-internet の IP アドレスを指定しています。

クライアントについても同様に、各ネットワークの vyos-6500x と VLAN で接続してデフォルトルートに向けるようにしています。

これで2拠点間を結ぶネットワークができました。疎通が取れていることも分かりますが、16ms の遅延があることが分かります。

f:id:PiBVT:20201211153547p:plain
ネットワーク間の疎通確認

では、プライベートトランジットとして vyos-65003 を追加してみましょう。

ネットワークの構成はこの図のようになっています

f:id:PiBVT:20201211171205j:plain
プライベートトランジットを利用するネットワーク

設定ファイルは以下の通りです。

# vyos-65001 の追加設定
set interfaces ethernet eth0 vif 103 address 192.168.250.2/30

# configure BGP
set protocols bgp 65001 address-family ipv4-unicast network 192.168.100.0/24

# configure BGP neighbor
set protocols bgp 65001 neighbor 192.168.250.1 remote-as 65003
# vyos-65002 の追加設定
set interfaces ethernet eth0 vif 203 address 192.168.250.6/30

# configure BGP
set protocols bgp 65002 address-family ipv4-unicast network 192.168.200.0/24

# configure BGP neighbor
set protocols bgp 65002 neighbor 192.168.250.5 remote-as 65003
# vyos-65003 の設定
#!/bin/vbash
ip route del default

source /opt/vyatta/etc/functions/script-template
configure

set system host-name vyos-65003

# configure loopback
set interfaces loopback lo address 192.168.250.1/32

# configure VLAN interface
set interfaces ethernet eth0 vif 103 address 192.168.250.1/30
set interfaces ethernet eth0 vif 203 address 192.168.250.5/30

# configure latency emulation policy
set traffic-policy network-emulator DELAY-3 network-delay 3
set interfaces ethernet eth0 vif 103 traffic-policy out DELAY-3
set interfaces ethernet eth0 vif 203 traffic-policy out DELAY-3

# configure BGP
set protocols bgp 65003 address-family ipv4-unicast network 192.168.250.0/24

# configure BGP neighbor
set protocols bgp 65003 neighbor 192.168.250.2 remote-as 65001
set protocols bgp 65003 neighbor 192.168.250.2 address-family ipv4-unicast nexthop-self

set protocols bgp 65003 neighbor 192.168.250.6 remote-as 65002
set protocols bgp 65003 neighbor 192.168.250.6 address-family ipv4-unicast nexthop-self

commit
exit

vyos-65001,vyos-65002 では vyos-65003 とピアリングするための BGP の設定を追加しています。 vyos-65003 はトランジットするために、各vyos-6500x から受け取った経路の nexthop を自分自身に設定した上で他のピアに対して再広報しています。 本来は route-map などで各ピアごとに広報する経路を制限するのが当然なのですが、今回は実験的なネットワークなので省略します。

設定ができたので実際に動かしてみます。 vyos-65001,vyos-65002 で vyos-65003 を介してそれぞれの経路が広報されていることが分かります。

f:id:PiBVT:20201211170734p:plain
vyos-65001 に BGP で広報された経路情報

traceroute などでも、広報された経路に基づいて経路選択が行われていることが分かります。 さらに、遅延は vyos-internet を介していた時よりも大きく減少していることも分かるかと思います。

f:id:PiBVT:20201211171411p:plain
プライベートトランジットを介する場合の経路と遅延

これで無事、プライベートトランジットを介した通信をすることが出来ました。

最後に

今回は L3 の技術を活用することで研究活動を快適にする環境を構築しました。 普通に開発をしているだけではこういった L2, L3 に触れる機会は少ないため、いい経験になりました。

最近は Docker などのコンテナで簡単に実験環境が構築出来て便利な一方、 現実の環境と異なり、理想的な環境しか提供してくれません。(カオスエンジニアリングのように障害等を注入することはもちろん可能ですが。)

今回は経路や障害といった現実の環境ならではの制約のもとでしたが、 一筋縄ではいかないために試行錯誤する過程は非常に楽しかったです。 少なからぬ研究の時間が吸い取られたことは事実ですが、 今後の研究に役立つかもしれない経験をできたこともまた事実です。 卒業研究が終わるまでは現環境で使い続けますが、春休みには研究室のインフラ刷新に合わせて改良するつもりです。

ここまで読んでくださった方の何かしらの役に立てば幸いです。それでは。