NTTドコモビゞネスのブログ - TECH PLAY

TECH PLAY

NTTドコモビゞネス

NTTドコモビゞネス の技術ブログ

å…š641ä»¶

はじめに DevOpsプラットフォヌムの取り組みを玹介する3回目の蚘事です。 Qmonus Value Stream のアヌキテクトの牧志 ( @JunMakishi ) です。 本蚘事では、Qmonus Value Streamの独自技術であるCloud Native Adapterを玹介したす。はじめにInfrastructure as Codeの課題を指摘し、Cloud Native Adapterを䜿っおこれらの課題をどう解決するのかを解説したす。 Infrastructure as Codeの課題 Infrastructuer as Code (以䞋IaC) は、特定のツヌルを指すのではなく、むンフラストラクチャをコヌドで蚘述し、゜フトりェアず同じように取り扱うプラクティスを指したす。むンフラストラクチャのリ゜ヌス構成や蚭定をコヌドで蚘述・適甚するこずで、再珟性、䞀貫性、および透明性のあるむンフラストラクチャを埗られたす。分散されたコンポヌネントを組み合わせおシステムを組み䞊げるクラりドアヌキテクチャを運甚する䞊で、その構成をコヌドで管理するこずは必芁䞍可欠であるず考えたす。 Cloud Native Days Tokyo 2021の 発衚 では、IaCを、「User Interface」「Workflow」「Test」および「Feedback Loop」の4぀に分解しお考察したした図。Qmonus Value Streamのコア技術であるCloud Native Adapterは、これらのうち User Interface ず Workflow の課題を解決するための方匏です。 User Interfaceの課題 IaCにおけるUser Interfaceは、むンフラストラクチャのリ゜ヌス構成ず蚭定の期埅倀をコヌドで定矩するための方匏です。䞀般的に、JSON、YAML、たたは専甚のDSLなどが利甚されおいたす。 詊隓環境ず商甚環境の間で䞀貫したむンフラストラクチャ構成を埗るためには、IaC実装のパラメヌタ化を進める必芁がありたす。䟋えば、APIアプリケヌションをデプロむする堎合、ナヌザに公開するAPIのFQDNをパラメヌタ化するようなIaC実装が求められたす。詊隓環境ず商甚環境で想定する負荷が異なり、割り圓おるCPUやメモリ量をパラメヌタ化するこずもあるでしょう。 ここで、Kustomize、Python+Jinjaなどのツヌル、たたはDSL専甚の蚘法を甚いおパラメヌタ化するこずが考えられたす。しかし、コヌドの芏暡が倧きくなるほど、パラメヌタの管理が煩雑になりたす。むンフラストラクチャは指定可胜な蚭定倀が倚岐にわたるため、耇数のナヌスケヌスに察応しようずするあたり、パラメヌタの数が倚くなる傟向にありたす。IaCを実践しおいお、各パラメヌタがむンフラストラクチャのどの倀を蚭定しおいるかを远いかけるのが難しいず感じたこずがある方は少なくないでしょう。 たた、゜フトりェア開発のプラクティスに埓い、むンフラストラクチャ蚭定をグルヌプ化・抜象化しおいくこずで、より芏暡の倧きいむンフラストラクチャを管理できたす。しかし、YAMLなどの既存のむンタヌフェヌスでは、リ゜ヌス間の䟝存関係や構成党䜓の芋通しが悪くなる傟向にあるず考えたす。䟋えば、繰り返し凊理やたずたったコンテクストを1぀のモゞュヌルにたずめる、実装したコヌドを事前に怜蚌する、ずいった゜フトりェア開発プラクティスを適甚するこずが難しいず考えおいたす。 私たちは、 IaCが゜フトりェア゚ンゞニアにずっお、読み曞きしやすく、か぀メンテナンスしやすいものである必芁がある ず考えたす。IaCの「User Interface」ずしお、゜フトりェアプラクティスを適甚でき、スケヌラブルにむンフラストラクチャ構成を宣蚀できるデヌタ蚘述蚀語が求められたす。むンフラストラクチャのコンフィグ定矩を扱うのに適したもので、芋通しよくIaC実装をモゞュヌル化やグルヌプ化できる蚀語が必芁です。 Workflowの課題 IaCにおけるWorkflowは、むンフラストラクチャを蚭定するたでの䞀連の手続きを自動化するための方匏です。䟋えば、Terraformは、列挙されたリ゜ヌス間の䟝存関係を解決しお、リ゜ヌス蚭定を適甚する順序を制埡したす。 様々なIaCツヌルがありたすが、チヌムのDevOpsず゜フトりェアアヌキテクチャにもずづき、 IaCを実装しおからツヌルを実行しおむンフラストラクチャに適甚するたでの䞀連のワヌクフロヌを簡単に自動化する手段やデファクトスタンダヌドがただないず考えおいたす。チヌムごずに独自のスクリプトを甚意し、倚様なツヌルを組みあわせるためのグルヌコヌドや、前述したパラメヌタを埋めるための煩雑な凊理などを実装する必芁がありたす。その高いメンテナンスコストは運甚フェヌズでチヌムに重くのしかかっおきたす。 再珟性の高いむンフラストラクチャ構成を埗るためにIaCを実践したずしおも、それを適甚するスクリプト実装を信頌性高く保たない限り、倉曎に匱いむンフラストラクチャずなっおしたうリスクを孕んでいたす。そのため、パラメヌタ蚭定ミスを誘発しおしたわないよう、泚意深くスクリプトを修正する必芁がでおきたす。䟋えば、Jenkinsずそこで動かすスクリプトをメンテナンスするために倚倧な劎力を割いおいるチヌムも倚いこずでしょう。 私たちは、 システムアヌキテクチャ蚭蚈の肝の䞀぀は、継続的にデリバリする仕組みを䜜るこず であり、 IaC実装においおそのワヌクフロヌを考慮するべき ず考えたす。 IaCの「Workflow」ずしお、むンフラストラクチャをデプロむするたでの䞀連のワヌクフロヌを簡単に自動化し、䜿いたいクラりド技術・ツヌルを、自チヌムのCI/CDパむプラむンに苊痛なく組み入れられるような方匏が求められたす。 発展途䞊の゚コシステム 近幎、前述したIaCのワヌクフロヌの課題に取り組む゜リュヌションが台頭しおきおいたす。 Terraform Cloud は、HashiCorp瀟が提䟛するSaaSです。「Plan, Policy Check, Apply」ずいうTerraformを実行するたでの䞀連の流れをSaaSで管理するこずを可胜ずし、チヌムで䞀貫したプラクティスを適甚可胜ずしおいたす。 Waypoint は、同様にHashiCorp瀟が開発しおいるオヌプン゜ヌス゜フトりェアです。「Build, Deploy, Release」ずいう開発から゜フトりェアリリヌスたでのワヌクフロヌを連結する゜リュヌションを提䟛しおいたす。 Dagger は、Dockerの創始者であるSolomon Hykesらにより開発されおいるオヌプン゜ヌス゜フトりェアです。ポヌタブルなCI/CDワヌクフロヌを蚘述・実行できる゚ンゞンを提䟛し、チヌムサむロでメンテナンスしおいたGlueコヌドを無くすこずができたす。 KubeVela は、Alibaba Cloudのチヌムが䞭心ずなっお開発しおいるオヌプン゜ヌス゜フトりェアです。プラットフォヌムチヌムが、耇数のKubernetesリ゜ヌスずそれらをデプロむするワヌクフロヌずをセットでパッケヌゞングするこずを可胜ずしおいたす。 それぞれ、既存ツヌルでは足りなかったワヌクフロヌの自動化を達成するための゜リュヌションを提䟛しおいたす。詳现に぀いおは、それぞれのWebサむトを参照ください。 このように、前述したIaCの課題は、゚コシステムの䞭でも近幎泚目されおいる課題であるものの、ただただデファクトスダンダヌドず呌べる゜リュヌションが確立されおいたせん。そこで、私たちは、これらの課題を解決するための独自の方匏をQmonus Value Streamに実装し、提案しおいたす。 私たちの提案Cloud Native Adapter Qmonus Value Streamは、Cloud Native Adapterず呌ばれる独自のIaC実装を提案し「User Interface」ず「Workflow」の課題を解決しおいたす。そのアむデアは、 KubeCon EU 2020 で「Design Pattern as Code」ずいう名称で玹介しおいたす。 Cloud Native Adapterのコアずなるアプロヌチを以䞋に挙げたす。 ワヌクフロヌ定矩を含む統䞀的なむンタヌフェヌス CUE蚀語を䜿っお、クラりドアヌキテクチャを構成する「むンフラストラクチャ構成」ずそれをデプロむする「ワヌクフロヌ」をたずめお1぀のむンタヌフェヌスで宣蚀する。 䞊蚘によっお、むンフラストラクチャを継続的にデリバリする「Workflow」を提䟛する。 コンフィグのモゞュヌル化ず結合 宣蚀的に蚘述された「むンフラストラクチャ構成」ず「ワヌクフロヌ」に぀いお、再利甚可胜な圢に分割しお、そのデヌタ構造を隠蔜せずに「結合」する。 1の統䞀的なむンタヌフェヌスで䞊蚘の仕組みを提䟛するこずで、芋通しの良いIaC実装のモゞュヌル化を促進し、゜フトりェア゚ンゞニアにずっおメンテナンスしやすい「User Interface」を提䟛する。 以䞋、それぞれのアプロヌチを玹介したす。 1. ワヌクフロヌ定矩を含む統䞀的なむンタヌフェヌス 以䞋のむメヌゞ図で瀺すように、Cloud Native Adapterは、「むンフラストラクチャの構成」ず「ワヌクフロヌ」をCUE蚀語を䜿っお宣蚀したす。Qmonus Value Streamは、このCloud Native Adapterのうち、むンフラストラクチャ構成を宣蚀する箇所を読み出し、むンフラストラクチャに適甚するマニフェストを生成したす。たた、ワヌクフロヌを宣蚀する箇所を読み出すこずで、このマニフェストを適甚するためのCI/CDパむプラむンを生成したす。 CUE蚀語は、型付デヌタ蚘述蚀語であり、デヌタ構造をシンプルに衚珟・操䜜できるだけでなく、モゞュヌル化などずいった゜フトりェアプラクティスを適甚できたす。前述したDaggerやKubeVelaでもCUE蚀語を採甚しおいたす。CUE蚀語の詳现は、別の蚘事で玹介予定です。 以䞋に、Cloud Native Adapterの実装䟋ずしお、APIアプリケヌションを公開する「GKE API Adapter」を玹介したす。 resources fieldにむンフラストラクチャのリ゜ヌス蚭定を宣蚀し、 pipelines fieldにCI/CDパむプラむン定矩を宣蚀したす。この䟋では、GCPぞ適甚する publicIp/securityPolicy 蚭定ずKubernetesぞ適甚する service/ingress 蚭定に加えお、CI/CDパむプラむン䞭でKubernetesぞの適甚埌に実行すべきAPIの正垞性確認 testApi タスクを1぀のAdapterずしおパッケヌゞ化しおいたす。GCPずKubernetesずいう異なるAPIだけでなく、CI/CDのロゞックたで1぀のむンタヌフェヌスで蚘述できるこずが分かりたす。 package api DesignPattern: { name: "GKE API Adapter" // infrastructure configuration resources: { gcpPublicIp: ... gcpSeculicyPolicy: ... k8sService: ... k8sIngress: ... } // CI/CD operations pipelines: { // tasks in "deploy" stage deploy: { applyManifest: ... // a task to test API endpoint after deploying resources testApi: ... } } } 䞊蚘の䟋のようにInfrastructureずCI/CDパむプラむンを1぀のCloud Native Adapterずしおたずめるのではなく、それぞれ異なるAdapterずしお実装するこずも可胜です。第2回連茉の 前線 では、GKEでAPIサヌビス公開するむンフラストラクチャ構成を宣蚀したCloud Native Adapterを、たた 埌線 では、bookinfoをデプロむするワヌクフロヌを宣蚀したCloud Native Adapterを䜿ったデモを玹介したした。 マルチクラりドのむンフラストラクチャ構成だけでなく、その構成をデプロむするワヌクフロヌたでを1぀のCloud Native Adapterずしおたずめるこずで、継続的なデリバリ・自動化たでを芖野に入れたIaCを実装できたす。CUE蚀語を曞くだけで実践的なパむプラむンずずもにむンフラストラクチャを拡匵・成長させられるようなナヌザ䜓隓Developer Experienceを提䟛したいず考えおいたす。 さらに、CUE蚀語を掻甚しお、宣蚀したむンフラストラクチャ構成およびパむプラむン定矩におけるデヌタ構造を安党に評䟡・怜蚌できたす。このCUE蚀語の匷みに぀いおは、別の蚘事で玹介したす。 2. コンフィグのモゞュヌル化ず結合 Cloud Native Adapterは、宣蚀的に蚘述した「むンフラストラクチャ構成」ず「ワヌクフロヌ」をグルヌプ化、モゞュヌル化できたす。以䞋のむメヌゞ図に瀺すように、ナヌザは、再利甚できる単䜍にパッケヌゞ化された耇数のモゞュヌルを遞択しお、1぀のシステムアヌキテクチャを組み䞊げるこずができたす。 CUE蚀語は、宣蚀的に蚘述されたデヌタ構造を結合し䞀貫した結果を出力できるこずが特城です。Cloud Native Adapterは、むンフラストラクチャ構成ずワヌクフロヌ定矩に぀いお、そのデヌタ構造を過床に隠蔜・抜象化せずに、再利甚出来る単䜍に分割できたす。Qmonus Value Streamのナヌザは、このCUE蚀語の特城を掻甚し、分割された任意のCloud Native Adapterを結合するこずで、目的に沿ったむンフラストラクチャ構成ずワヌクフロヌ定矩を埗られたす。 䞊蚘むメヌゞ図で瀺したCloud Native Adapterを結合する実装䟋を以䞋に瀺したす。前述した「GKE API Adapter」に加えお、Securityルヌルを適甚するAdapterや、監芖 (uptime check) 蚭定するAdapterを composites field䞭に宣蚀しおいたす。Qmonus Value Streamは、これをコンパむルするこずで、各Adapterがそれぞれ宣蚀しおいるリ゜ヌス蚭定ずCI/CDパむプラむン定矩を結合しお、1぀のシステムずCI/CDパむプラむンを生成したす。さらに、コヌド䟋の䞋郚に瀺しおいるように、 resources fieldや pipelines fieldに独自のむンフラストラクチャ構成ルヌルやワヌクフロヌタスクを宣蚀するこずで、カスタマむズを加えるこずができたす。 DesignPattern: { // unify exisitng Cloud Native Adapter composites: [ { pattern: api.DesignPattern params: { ... } }, { pattern: containerSecurity.DesignPattern params: { ... } }, { pattern: uptimecheck.DesignPattern params: { ... } } ] // customize resources: { // application specific configuration k8sConfigmap: { metadata: name: "application-config" data: "example.conf" : "..." // mount the configuration k8sDeployment: spec: template: spec: volumes: [ { name: "config" configMap: name: "application-config" } ] } // application specific tasks pipelines: { ... } } Helm のように自己完結型のパッケヌゞを䜜るアプロヌチの堎合、アプリケヌション単䜓の蚭定を1぀のパッケヌゞにたずめられたすが、クラりドプロバむダごずの蚭定や、セキュリティや監芖ずいった運甚蚭定に぀いおは、別の手段で远加するこずになりたす。カスタマむズ性を远求する堎合、1぀のパッケヌゞが受け取るパラメヌタを増やすこずになり、パッケヌゞが耇雑化したす。 䞀方、Cloud Native Adapterのアプロヌチでは、機胜や目的単䜍でIaC実装をモゞュヌル化し、ナヌザ偎で必芁なモゞュヌルを遞択するこずでアヌキテクチャを拡匵したす。具䜓的には、ナヌザは、1぀のモゞュヌルを過床に抜象化およびパラメヌタ化するこずなく、コンテクストごずにたずたったデヌタだけを宣蚀したCloud Native Adapterを䜜成したす。䞊蚘の䟋では、 resources fieldに、拡匵したい远加のリ゜ヌス蚭定だけを宣蚀しおいたす。Qmonus Value Streamは、結合察象のCloud Native Adapterを読み出し、それぞれが宣蚀したリ゜ヌス蚭定に぀いお、デヌタ構造をそのたたに結合したす。 このアプロヌチによっお、Qmonus Value Streamのナヌザは、汎化したモゞュヌルを䜜りながらIaC党䜓を芋通しよくシンプルに蚘述できたす。 このように、Cloud Native Adapterは、アヌキテクチャやコンテクストの境界でモゞュヌル化し、ナヌザ偎で再利甚するモゞュヌルを遞択・結合するプラクティスを提䟛したす。䟋で挙げたようなセキュリティ蚭定や監芖蚭定を1぀のモゞュヌルに抌し蟌む必芁がなくなりたす。私たちは、モゞュヌル化ずいう゜フトりェアプラクティスを掻甚し、スケヌラブルで盎感的にクラりドアヌキテクチャを組み䞊げるこずができるナヌザ䜓隓を提䟛したいず考えおいたす。 おわりに DevOpsプラットフォヌムの取り組み連茉の3回目の蚘事ずしお、Qmonus Value Streamチヌムが取り組んでいるInfrastructure as Codeの課題ず、それを解決するための独自IaC実装であるCloud Native Adapterを玹介したした。 Qmonus Value Streamチヌムは、メンバ䞀人䞀人が、利甚者であるアプリケヌション開発者のために信念を持っお掻動を続けおいたす。 プラットフォヌムを内補開発するポゞション、プラットフォヌムを䜿っおNTTグルヌプのクラりド基盀やCICDを構築支揎するポゞションそれぞれで 、䞀緒に働く仲間を募集しおいたすので、興味を持たれた方は応募いただけるず嬉しいです。 CI/CDプラットフォヌム開発、゜フトりェア゚ンゞニア NTTグルヌプのクラりド基盀構築およびCI/CD導入、゜リュヌションアヌキテクト 次回は、CUE蚀語に぀いおさらに螏み蟌んでご玹介したす。お楜しみに
はじめに DevOpsプラットフォヌムの取り組みを玹介する2回目の蚘事の埌半です。 Qmonus(クモナス) Value Stream の開発チヌムの奥井 @HirokiOkui です。 連茉第2回では、 Qmonus Value Stream を䜿っおアプリケヌションを実際にビルド・デプロむする事䟋を2぀、前線・埌線に分けお玹介したす。 前線では、Cloud Native Adapterを甚いおパブリッククラりドずKubernetesの䞡方をたずめおInfrastructure as Code以䞋、IaCずしお衚珟し、クラりド基盀を構築する事䟋を玹介したした。 埌線では、Cloud Native Adapterを甚いたContinuous Integration/Continuous Delivery以䞋、CI/CDパむプラむンの構築を䞭心に説明したす。 1回目、2回目前線の蚘事をただご芧になっおない方は、ぜひそちらもご芧ください。 1回目 Qmonus Value Streamの玹介 2回目 Qmonus Value Streamを䜿っおみた(前線) - クラりド基盀の構築 ナヌスケヌス2: Istio BookInfo アプリケヌションのデリバリを実践する事䟋ずしお、第2回前線では「KubernetesずGCPによるパブリックAPI公開」を玹介したした。埌線では2぀目の事䟋ずしお、Istioプロゞェクトのサンプルアプリケヌションである BookInfo を扱いたす。 BookInfoは、曞籍のカタログを衚瀺するシンプルなWebアプリケヌションですが、蚀語の異なる4぀のマむクロサヌビスから構成されおおり、実践的なアプリケヌションに近い耇雑さずデリバリの難しさを備えおいたす。このため、IaCやCI/CDのツヌルを評䟡するのに適しおいたす。  Istioのドキュメント より リリヌス゚ンゞニアリングの難しさ Kubernetesに察しおコンテナをデリバリするためには、 Tekton CI によるビルド、 Kustomize や Helm によるマニフェスト生成、 Argo CD によるデプロむを甚いおCI/CDパむプラむンを構成するこずが䞀般的です。 これらを甚いおBookInfoをデリバリする方法が、むンプレス瀟の Kubernetes CI/CDパむプラむンの実装 に詳しく蚘されおいたす。 こちら で公開されおいるBookInfoのデリバリに必芁なマニフェストを芋るず、デリバリ察象のKustomizeマニフェスト、CI/CDのためのTektonずArgo CDのマニフェストず、倚くのマニフェストずパラメヌタが含たれおいたす。 CI/CDパむプラむンを構築するためには、それぞれを正しく結合しお䜿いこなす必芁がありたす。 このように、アプリケヌションをリリヌスするためのCI/CDパむプラむンを信頌性高く構築し保守する技術領域のこずを、リリヌス゚ンゞニアリングず蚀いたす。 BookInfoのように、マむクロサヌビスアヌキテクチャを採甚したアプリケヌションのリリヌスには、高床なリリヌス゚ンゞニアリングのスキルが芁求されたす。 これを少人数の開発チヌムで実践するのは至難の業です。 Qmonus Value Streamを甚いたCI/CDパむプラむンの構成 Qmonus Value Stream以䞋、QVSでは、前線で玹介したずおり、独自のIaC実装であるCloud Native Adapter以䞋、Adapterを甚いお䞊述の問題を解決したす。 以降の節で、BookInfoをデリバリするCI/CDパむプラむンをAdapterを甚いお構成する実䟋に぀いお、順を远っお説明したす。 ここでは、BookInfoを構成する4぀のマむクロサヌビスのそれぞれをむメヌゞビルドし、生成されたむメヌゞを甚いたKubernetes Deploymentず内郚通信甚のServiceをマむクロサヌビスごずにデプロむするCI/CDパむプラむンを構成したす。 Cloud Native Adapterの遞択 たず、QVSの蚭定ファむルであるQVS Configを䜜成し、その䞭で䜿甚するAdapterを遞択したす。 BookInfoの reviews アプリケヌションでは、以䞋のQVS Configを䜿甚したす。 params : - name : namespace type : string - name : imageName type : string designPatterns : - pattern : qmonus.net/adapter/official/kubernetes/deployment/simple params : appName : reviews namespace : $(params.namespace) imageName : $(params.imageName) port : "9080" env : - name : LOG_DIR value : "/tmp/logs" useDefaultService : true - pattern : qmonus.net/adapter/official/pipeline/build:buildkit - pattern : qmonus.net/adapter/official/pipeline/deploy:simpleDeploy ここでは、QVSで甚意しおいる3぀のAdapterを䜿甚したす。 1぀目は、Applicationマニフェストを扱う Adapterであり、Kubernetes Deploymentリ゜ヌスずServiceリ゜ヌスを提䟛したす。 2぀目ず3぀目は Pipelineマニフェストを扱う Adapterであり、それぞれ Buildkit を甚いたBuild Taskず、IaCツヌルである Pulumi を甚いたDeploy Taskを提䟛したす。 BookInfoの残り3぀のサヌビスのQVS Configも、reviewsず同様に、䞊蚘で玹介した3぀のAdapterを䜿甚したす。 Tekton Pipelineの生成 次に、䞊述したBookInfoの4぀のマむクロサヌビスに察する各QVS Configを指定しおコンパむルしたす。 するず、各マむクロサヌビスごずのビルド甚ずデプロむ甚のTekton Pipelineが自動生成されたす。 $ kubectl get pipeline -o custom-columns=NAME:.metadata.name NAME details-build details-deploy productpage-build productpage-deploy rating-build rating-deploy reviews-build reviews-deploy Tekton Pipelineから䜿甚されるTekton Taskも自動生成されたす。 今回の堎合、1぀のマむクロサヌビスに぀き5個、蚈20個のTekton Taskが生成されたす。 $ kubectl get task -o custom-columns=NAME:.metadata.name | grep reviews reviews-app-compile-design-pattern reviews-app-deployment-worker reviews-auth-google-registry reviews-buildkit reviews-git-checkout # productpage, details, rating に぀いおも同様 生成されたTekton PipelineおよびTaskを以䞋の図に瀺したす。 Build Pipelineは゜ヌスコヌドからBuildkitを甚いおdocker imageをビルドし、Google Artifact Registryにプッシュしたす。 Deploy Pipelineは、QVS Configで指定されおいるAdapterをコンパむルしおInfrastructureマニフェストを生成し、Pulumiを甚いおKubernetesクラスタヌに察しおデプロむしたす。 Adapterをコンパむルしお生成されるTekton Pipelineは、CI/CDパむプラむン党䜓を担うのではなく、䞊蚘䟋のようにBuild、Deploy、Test、Release ずいったたずたったプロセス単䜍ごずに分割されたす。 Tekton Pipelineを再利甚可胜で可搬性がある単䜍に分割するこずで、Tekton Pipelineをビルディングブロックのように扱い、柔軟にCI/CDパむプラむンを組み立おるこずができたす。 AssemblyLineの䜜成 最埌に、AssemblyLineずいうQVS独自のリ゜ヌスを甚いおCI/CDパむプラむンを構成したす。 AssemblyLineに実行察象のTekton Pipelineず実行順序を定矩するこずで、その順序に埓いTekton Pipelineが実行されたす。 今回は、BookInfoの4぀のマむクロサヌビスをそれぞれビルドし、ステヌゞング環境にデリバリするAssemblyLineを䜜成したす。 䜜成したAssemblyLineを以䞋に蚘したす。簡単のため、reviewsのビルドずデプロむに限定し、他の3぀は省略しおいたす。 apiVersion : vs.axis-dev.io/v1 kind : AssemblyLine metadata : name : bookinfo-build-and-deploy spec : params : - name : gitRevision - name : imageTag stages : - name : reviews-build-staging spec : deployment : app : reviews name : staging pipeline : reviews-build params : - name : gitRevision value : $(inputs.gitRevision) - name : imageTag value : $(inputs.imageTag) - name : reviews-deploy-staging runAfter : - reviews-build-staging spec : deployment : app : reviews name : staging pipeline : reviews-deploy params : - name : gitRevision value : $(inputs.gitRevision) - name : imageName value : $(stages.reviews-build-staging.results.imageFullNameTag) # 以䞋は省略 - name : rating-build-stating... - name : rating-deploy-stating... - name : productpage-build-stating... - name : productpage-deploy-stating... - name : details-build-stating... - name : details-deploy-stating.... AssemblyLineには耇数のStageが蚭定可胜であり、1぀のStageは1぀のTekton Pipelineで構成されたす。 Stageごずに、Tekton Pipelineで蚘述された凊理をどのマむクロサヌビスのどの環境向けに䜜甚させるのか、を遞択したす。 各Stageの runAfter に䟝存するStageを指定するこずで、DAG有向非巡回グラフが圢成され、䟝存関係を持぀耇数のStageを順番に実行できたす。 たた、各Stageの params を蚘述するこずで、Tekton Pipeline実行時のパラメヌタをどこから取埗するかを定矩したす。 ここでは、Build Pipelineの匕数である gitRevision や imageTag の倀をAssemblyLine実行時のパラメヌタから取埗しおおり、Deploy Pipelineの imageName の倀をBuild Pipelineの実行結果から取埗しおいたす。 CI/CDパむプラむンの構築が簡単に 以䞊、Adapterを甚いおCI/CDパむプラむンを構成する手順を玹介したした。 前述したように、Tekton、Kustomize、ArgoCDなどを甚いおCI/CDパむプラむンを構築するためには、各ツヌルに察するスキルに加えおツヌルごずに異なる様匏で倚くのマニフェストを蚘述し結合する必芁があり、高い専門性が芁求されたす。 BookInfoの䟋では20〜30ほどのマニフェストが必芁になり、アプリケヌションの構成がより耇雑化するに぀れお倧きく増倧したす。 QVSでは、ベストプラクティスずしお提䟛されおいるAdapterを遞択するだけで必芁なTekton Pipelineが生成されるので、マニフェストを蚘述する必芁がありたせん。 BookInfoのようなマむクロサヌビスアプリケヌションの䟋であっおも、生成されたTekton Pipelineの実行順序をAssemblyLineに蚘述するだけで、CI/CDパむプラむンを構築できたす。 リリヌス゚ンゞニアリングの専門家でなくおも、信頌性の高いCI/CDパむプラむンを構成できるようになりたす。 CI/CDパむプラむンの実行 前述した構成の元、 CI/CDパむプラむンがどのように実行されるか説明したす。 BookInfoのAssemblyLineマニフェストをQVSに登録するず、QVSのWebUI䞊で以䞋のようにAssemblyLineが衚瀺されたす。 今回は、各マむクロサヌビスごずにBuild PipelineのあずにDeploy Pipelineを実行するだけのシンプルなAssemblyLineなので2局だけですが、実際のAssemblyLineはCI/CDの様々なタスクや承認行為を含み、より耇雑なパむプラむンを構成するこずになりたす。 AssemblyLineを実行するためには、BookInfoを構成するマむクロサヌビスやデプロむ先の環境情報などをQVSに事前に入力する必芁がありたす。 ここでも、マニフェストの蚘述量やパラメヌタ数を枛らすための様々な工倫が導入されおいたすが、こちらに぀いおは別の蚘事で改めお玹介したす。 AssemblyLineは、WebUI䞊から実行するか、gitのプッシュむベントをトリガずしお実行されたす。 実行されるず、AssemblyLineの実行順序定矩に埓い先頭から順番にTekton PipelineRunおよびTaskRunが実行され、Kubernetes SchedulerによっおPodがスケゞュヌリングされお、各CI/CDタスクが実行されおいきたす。 WebUIでは、リアルタむムな進捗衚瀺に加えお、Taskを実行しおいるPodのLogやEventなどの情報を確認できたす。 Taskが正垞に動䜜しおいない堎合には、Tektonが動䜜しおいるKubernetesクラスタヌにアクセスするこずなく、WebUI䞊から問題の切り分けを行うこずが可胜です。 以䞋のように党おのStageに正垞終了のマヌクが぀けば、AssemblyLineの凊理は完了です。 デプロむ先のKubernetesクラスタヌにアクセスしお、BookInfoアプリケヌションが正垞動䜜しおいるこずを確認したす。以䞋の通り、4぀のマむクロサヌビスのDeploymentずServiceが生成され、党おのPodが䞊がっおいるこずが確認できたす。 $ kubectl get all -n sample-bookinfo NAME READY STATUS RESTARTS AGE pod/details-78457fc5c9-7szn5 1/1 Running 0 12h pod/productpage-7fccdbdb9c-8cqw8 1/1 Running 0 12h pod/rating-6c8db77566-gfkxj 1/1 Running 0 12h pod/reviews-855b779f4d-xqs7t 1/1 Running 0 12h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/details ClusterIP 10.44.12.16 <none> 9080/TCP 12h service/productpage ClusterIP 10.44.10.189 <none> 9080/TCP 12h service/rating ClusterIP 10.44.0.210 <none> 9080/TCP 12h service/reviews ClusterIP 10.44.0.249 <none> 9080/TCP 12h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/details 1/1 1 1 12h deployment.apps/productpage 1/1 1 1 12h deployment.apps/rating 1/1 1 1 12h deployment.apps/reviews 1/1 1 1 12h NAME DESIRED CURRENT READY AGE replicaset.apps/details-78457fc5c9 1 1 1 12h replicaset.apps/productpage-7fccdbdb9c 1 1 1 12h replicaset.apps/rating-6c8db77566 1 1 1 12h replicaset.apps/reviews-855b779f4d 1 1 1 12h productpageのPodにport-forwardしおUIを衚瀺しおみるず、画面が衚瀺され、正垞にデプロむできおいるこずが確認できたす。 おわりに DevOpsプラットフォヌムの取り組み連茉の2回目の蚘事ずしお、Cloud Native Adapterを䜿甚するこずでクラりド基盀ずCI/CDパむプラむンが簡単に構築できるこずを、2぀の事䟋を甚いお玹介したした。 NTTコミュニケヌションズでは倚くのプロゞェクトで内補開発をしおおり、開発チヌムがプロダクト開発の最も重芁な郚分に泚力できるように、Qmonus Value Streamの開発ずCloud Native Adapterの拡充を進めおいたす。 Qmonus Value Streamチヌムは、メンバ䞀人䞀人が、利甚者であるアプリケヌション開発者のために信念を持っお掻動を続けおいたす。 プラットフォヌムを内補開発するポゞション、プラットフォヌムを䜿っおNTTグルヌプのクラりド基盀やCICDを構築支揎するポゞションそれぞれで 、䞀緒に働く仲間を募集しおいたすので、興味を持たれた方は応募いただけるず嬉しいです。 https://hrmos.co/pages/nttcom0033/jobs/0000019 https://hrmos.co/pages/nttcom0033/jobs/1692796 次回は、Cloud Native Adapterに぀いおさらに螏み蟌んで玹介したす。お楜しみに
はじめに DevOpsプラットフォヌムの取り組みを玹介する2回目の蚘事の前半です。 こんにちは。 Qmonus (クモナス) Value Stream の開発チヌムの束本です。 前回の蚘事 では、 Qmonus Value Stream の抂芁を玹介したした。 連茉第2回ずなる今回は、Qmonus Value Streamの重芁で特城的な機胜の1぀であるCloud Native Adapterを䜿い、アプリケヌションをデリバリする事䟋を2぀、前線ず埌線の2回に分けお玹介したす。 前線では、Cloud Native Adapterを甚いたクラりド基盀の構築を䞭心に説明したす。 クラりド技術の倚様化・耇雑化 近幎のアプリケヌション開発においお、GCP/Azure/AWS等のパブリッククラりドの利甚はデファクトスタンダヌドずなりたした。 たた、倚くのプロダクトはコンテナアプリケヌションずしお開発され、Kubernetesやその他のコンテナ実行環境を䜿っおサヌビス提䟛されおいたす。 システムの基盀はパブリッククラりドを䜿う事で迅速に構築できるようになりたしたが、パブリッククラりドが提䟛するサヌビスは倚様化・耇雑化しおおり、芁件によっおは監芖や認蚌、メヌル送信などで別々のパブリッククラりドやSaaSを組み合わせる必芁がありたす。 それぞれのサヌビスには適切なパラメヌタの決定も必芁です。 商甚提䟛しおいるプロダクトでは、開発環境やステヌゞング環境そしおプロダクション環境ず耇数の環境を適切に構築するために、Infrastructure as Code以䞋、「IaC」ずいいたすの導入も必芁ずなるでしょう。 このように、クラりド技術によりアゞリティは倧幅に向䞊したものの、芁件に応じおクラりドサヌビスを組み合わせおアヌキテクチャを蚭蚈し構築するためには、高い専門性だけではなく倚倧な劎力をも必芁ずするのが珟状の課題です。 Qmonus Value Stream以䞋、「QVS」ずいいたすでは、このような課題をCloud Native Adapter以䞋、「Adapter」ずいいたすを提䟛しお解決したす。 ナヌスケヌス1: KubernetesずGCPによるパブリックAPI公開 アプリケヌションのデリバリを実践する1぀目の事䟋ずしお、GCPのWAF/FirewallであるCloud Armorを適甚したWebアプリケヌションを構築したす。 コンテナでWebアプリケヌションを公開する際には、倚くの堎合GKEのようなマネヌゞドKubernetesサヌビスを利甚したすが、マネヌゞドKubernetesを甚意するだけではWebアプリケヌションを公開できたせん。 䟋えば、WEBアプリケヌションをWAFを適甚しお提䟛する堎合、マネヌゞドKubernetesの準備に付随しお次の䜜業が必芁ずなりたす。 グロヌバルIPアドレスの確保 確保したグロヌバルIPアドレスに名前解決するためのDNSレコヌドの蚭定 SSL/TLSサヌバ蚌明曞の発行 適切なSSL/TLS暗号スむヌトの蚭定 WAF/Firewallのポリシヌ蚭定 ロヌドバランサの蚭定 䞍適切な蚭定や蚭定挏れがあるず、アプリケヌションが動䜜しないだけではなく、最悪の堎合セキュリティホヌルを䜜っおしたいプロダクトの継続に倧きな悪圱響を䞎えおしたうので、確実な実斜が必芁です。 これらのリ゜ヌスを構築するには、TerraformでCloud ArmorやGCLBなどのGCPリ゜ヌスを構築し、そしお、Kustomizeなどを䜿っおService・Ingress・BackendConfigなど倚くのKubernetesマニフェストを蚘述し適甚する必芁がありたす。 たた、これら倚くのサヌビスを盞互参照しながら正しく構成する必芁がありたす。意図した動䜜をしない堎合には、利甚する耇数サヌビスのログやマニフェストを調査しお修正した埌に再床動䜜確認するずいうこずを繰り返すこずずなりたす。 このように、QVSを䜿わない堎合には、パブリッククラりド、Kubernetes、IaCツヌルに察する高い専門性ず倚くの時間が芁求されたす。 Qmonus Value Streamを甚いたクラりド基盀構築 前回ご玹介したように、Adapterは、クラりド基盀ずContinuous Integration/Continuous Delivery以䞋、「CI/CD」ずいいたすパむプラむンを構築するためのベストプラクティスをパッケヌゞ化したものです。 アプリケヌション開発者は、Adapterを遞択しパラメヌタを指定するだけで、クラりド基盀ずCI/CDパむプラむンを高い専門知識がなくおも構築できたす。 Adapterは、デプロむ察象のApplicationマニフェストず、Pipelineマニフェストの䞡方を生成したす。 Applicationマニフェストは、Kubernetesリ゜ヌスやクラりドリ゜ヌスにより構成され、デプロむするアプリケヌションのシステム構成を瀺したす。 Pipelineマニフェストは、CI/CDパむプラむンのビルドからリリヌスに至る過皋においお「い぀どのようなTaskを実行するか」を定矩しおいたす。QVSはCI/CDの実行゚ンゞンずしお Tekton を採甚しおおり、PipelineマニフェストはTekton Pipeline/Taskリ゜ヌスずしお蚘述されたす。 Adapterの遞択 QVSの蚭定ファむルであるQVS Configを䜜成し、その䞭で䜿甚するAdapterを遞択したす。 以䞋に、QVS Configの具䜓䟋を瀺したす。Adapterは、 designPatterns の䞋に配列で配眮されたす。 params : - name : namespace type : string - name : imageName type : string designPatterns : - pattern : qmonus.net/adapter/official/kubernetes/deployment/simple params : appName : public-api-test-app namespace : $(params.namespace) imageName : $(params.imageName) port : "5000" replicas : "1" - pattern : qmonus.net/adapter/official/kubernetes/gke/publicapi params : appName : public-api-test-app namespace : $(params.namespace) port : "5000" domainName : public-api-app-demo1.example.com gcpExternalAddressName : matsumoto-gip2 gcpSecurityPolicyName : matsumoto-policy1 gcpSslPolicyName : matsumoto-ssl-policy - pattern : qmonus.net/adapter/official/pipeline/build:buildkit - pattern : qmonus.net/adapter/official/pipeline/deploy:simple 1぀目ず2぀目のAdapterは、クラりド基盀の構築を担圓し、1぀目は䞋図の赀砎線、2぀目は䞋図の青砎線で囲たれた堎所を構築したす。 1぀目のAdapterではKubernetesのDeploymentを生成し、2぀目のAdapterではGCPのWAF/FirewallであるCloud ArmorやCloud Load Balancingを構築し぀぀、連携するようにKubernetesのService、Ingress、ManagedCertificate、BackendConfig、FrontendConfigを構成したす。 これらのリ゜ヌスを党おTerraformやKubernetesマニフェストで蚘述するず倚くのリ゜ヌスが必芁になり耇雑ですが、Adapterを䜿えば䞊蚘の通り簡朔に蚘述できたす。 各Adapterは、実行時にパラメヌタを倖郚から泚入できたす。 1぀目のAdapterでは、倖郚から泚入されたimageNameパラメヌタによりコンテナむメヌゞずバヌゞョンを受け取り、Kubernetes Deploymentを生成しおいたす。 パラメヌタずしお泚入するコンテナむメヌゞずバヌゞョンを倉曎するこずで、QVS Config自䜓に倉曎を加えるこずなく簡単にバヌゞョンアップが実珟できたす。 Adapterにおけるパラメヌタの正芏化・倖郚むンタヌフェヌス化の機構はCUE蚀語の衚珟力を甚いお実珟されおいたす。 この詳现に぀いおは、別の蚘事で改めお玹介したす。 3぀目ず4぀目のAdapterは、CI/CDパむプラむンを構築するものです。 この郚分の詳现は埌線で説明したす。 今回説明した4぀のAdapterは、党おQVS開発チヌムが提䟛し保守しおいるOfficial Cloud Native Adapter以䞋、「Official Adapter」ずいいたすです。 広く䞀般的に䜿われるクラりド構成や CI/CDパむプラむンの基本ずなるタスクに぀いおは、Official Adapterに含たれおいるので、そのたた利甚できたす。 CI/CDパむプラむンの構成 QVSでは、AssemblyLineずいう独自のリ゜ヌスを甚いおCI/CDパむプラむンを構成し、Adapterより生成されたTekton Pipelineを実行するこずでアプリケヌションをデリバリしたす。 AssemblyLineの詳现に぀いおは、埌線でご説明したす。 CI/CDパむプラむンの実行 AssemblyLineマニフェストをQVSに登録し実行するず、Build PipelineずDeploy Pipelineが実行されお、Adapterより生成される各皮ApplicationマニフェストがGCPずGKEに察しおデプロむされたす。 AssemblyLineを実行するず、QVSのWebUIから進捗状況が確認できたす。 Build PipelineずDeploy Pipelineが実行されお、凊理が正垞終了したこずを確認できたした。 デプロむ先のGKEにアクセスし、アプリケヌションが正垞に動䜜しおいるこずを確認したす。以䞋の通り、DeploymentやService、Ingressが正しく䜜成されおいたした。 % kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE public-api-test-app 1/1 1 1 1h %kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE public-api-test-app NodePort 10.0.72.51 <none> 5000:32663/TCP 1h %kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE public-api-test-app <none> * 203.0.113.10 80 1h たた、GCPのコン゜ヌルからもWebアプリケヌション提䟛に必芁ずなるCloud ArmorやロヌドバランサなどのGCPリ゜ヌスが適切に䜜成されおいるこずが確認できたす。 以䞋のCloud Armorの画面で、ロヌドバランサにポリシヌが適甚されおいたす。 以䞋のロヌドバランサの画面では、SSLのポリシヌや蚌明曞などが蚭定されおおりバック゚ンドであるKubernetesに転送されるように蚭定されおいたす。 そしお、実際に構築したWebアプリケヌション https://public-api-app-demo1.example.com にアクセスするず、サンプルアプリケヌションからの応答が確認できたした。 前線では、耇雑なTerraformやKubernetesマニフェストの蚘述する代わりに、QVSチヌムから提䟛されるOfficial Adapterをいく぀か遞択し蚘述するだけでクラりド基盀を構築する事䟋を玹介したした。 埌線 に続きたす。
サマリ Multi-AS で構成されるネットワヌクにおいお、 SR-MPLS + EVPN による L2VPN を実珟 IOS XR + Junos の Multi-vendor 環境で動䜜怜蚌に成功 この蚘事は Multi-AS SR 怜蚌連茉の第 3 回です。目次は こちら 抂芁 むノベヌションセンタヌの田島です。 本蚘事では Single-/Multi-AS SR-MPLS での L2VPN に぀いお解説したす。 我々の䞀連の怜蚌では 第 0 回の蚘事 にもありたすように、 Multi-AS でアンダヌレむを構築するこずで拡匵性や保守性を担保したたた拡匵可胜なネットワヌクを怜蚎しおいたす。 第 2 回の蚘事 では Multi-AS/Multi-domain SR-MPLS で分割されおいるアンダヌレむを甚いお L3VPN を実珟したした。 本蚘事は同様のアンダヌレむで L2VPN を実珟したす。 なお L2VPN ずいう総称は、 2 点間の接続 (point-to-point) を仮想的に L2 レベルで行う Pseudo Wire や VPWS 1 ずも呌ばれる E-Line ず、耇数拠点間 (point-to-multipoint) を仮想的に L2 スむッチングする VPLS 2 ずも呌ばれる E-LAN の 2 皮類を指すこずがありたす。 本蚘事では埌者の、耇数拠点間の E-LAN を察象にしたす。 このあずは L2VPN の仕組みに぀いお抂説したのち、 Multi-vendor 環境における怜蚌トポロゞヌや蚭定䟋を玹介したす。 Segment Routing (SR) や Multi-AS/Multi-domain SR-MPLS に぀いおの玹介は 第 0 回の蚘事の目次 から L3VPN の各蚘事をご参照ください。 EVPN による L2VPN L2VPN 実珟の手段ずしお EVPN (Ethernet VPN) がありたす。 EVPN は RFC7432 - BGP MPLS-Based Ethernet VPN で芏栌化された L2VPN の方匏で、経路情報の亀換や転送が定められおいたす。 誀解を恐れずに衚珟するず L2 における経路ずは぀たり MAC アドレスのこずです。 EVPN では、各ルヌタヌは MP-BGP 3 を甚いお亀換された MAC アドレスを孊習し、照合するこずで各 MAC アドレス宛おのフレヌムを転送したす。 䞊蚘の図は L2VPN の暡匏図で、耇数台のルヌタヌからなるコアネットワヌクがあたかも単䞀の巚倧な L2SW のように転送する様子を衚しおいたす。 顧客 A ず B それぞれ専甚の L2SW が存圚し、各 PE からアクセスできるむメヌゞです。 顧客 A ず B の間では通信ができず、それぞれ独立しおいたす。 なお先ほど亀換する経路ずは L2 の MAC アドレスのこずであるずしたしたが、実際のずころ EVPN においおは MAC アドレスの他に L3 情報である IP アドレスや Ethernet Segment 識別子 (ESI) なども亀換するこずにより、マルチホヌミングなどの単なる L2VPN 以䞊の機胜を実珟しおいたす。 機胜が広範囲にわたる EVPN では亀換する情報を Route Type ずしお定矩しおいたす。 この蚘事内では Type 2 を詳现に芋たすが、そのほかにも Type はありたす。 Type 1 は Ethernet Auto-Discovery ずよばれ、 ESI を広告し障害時の高速な収束などのために䜿われたす。 Type 2 は MAC アドレスや IP アドレスを扱いたす。これは文字通り、 CE 偎の端末のアドレスを亀換したす。 Type 3 は BUM トラフィックの送信先に䜿われたす。 Type 4 は ESI に基づきマルチホヌム時のトラフィック制埡に䜿われたす。 EVPN においおは VLAN ずの察応付けに際しお、 3 ぀の方匏がありたす。 VPN を識別しお転送するために EVPN Instance (EVI) / Bridge Domain (BD) / Broadcast Domain (VLAN) をどう構成するかによっお、䞋蚘のような 3 方匏がありたす。 VLAN-Based: それぞれ1察1で察応する。単䞀の EVI には 単䞀の BD が察応し、それには単䞀の VLAN のみが察応する。 VLAN Bundle: EVI ず BD は 1 察 1 だが、BD には耇数の VLAN が所属する。 VLAN-Aware Bundle: EVI には 耇数の BD が所属するが、各 BD にはそれぞれ単䞀の VLAN が察応する。 今回はわかりやすく各むンスタンスが 1 察 1 で察応する 1. VLAN-Based を甚いお怜蚌したす。 なお、方匏ごずに蚭定方法があるため、特に Multi-vendor 環境においおはどの方匏がどの蚭定に察応しおいるのかは芁確認です。 これら3぀に盞互運甚性はなく、同じ方匏にそろえる必芁がありたす。 実際に我々も怜蚌䞭に 1. VLAN-Based ず 3. VLAN-Aware が混圚し盞互接続できなくなり原因調査するこずがありたした。 EVPN ず Inter-AS Option B の察応状況 Multi-AS/Multi-domain SR-MPLS で分割されおいるアンダヌレむを通じお VPN を実珟する際に、拡匵性を求めるず Option B での実装が望たしいこずは 第 2 回の蚘事 で瀺したした。 圓該蚘事䞭でも蚀及したしたが、このようなアンダヌレむにおいお EVPN を Option B で AS 間接続する実装は始たったばかりです。 具䜓的には Cisco ASR 9000 シリヌズでは IOS XR 7.4.1 から 4 実装されおいたす。 2022幎7月珟圚では、 ASBR ずしお䜿甚できる機噚が限られおいたす。 Single-AS での L2VPN たずは単玔な Single-AS でのアンダヌレむ環境においお L2VPN を実珟するこずで、基本的な蚭定を玹介したす。 トポロゞヌは䞋蚘のような、 IOS XR ず Junos それぞれ 1 台ず぀、 PE が P ルヌタヌを介しお接続された状態です。 䜿甚した機材および OS バヌゞョンは次の通りです。 PE PE1: Cisco ASR9901 (IOS XR 7.6.1) PE2: Juniper MX204 (Junos 21.3R1.9) P P1: Cisco C8201 (IOS XR 7.5.1) P2: Juniper PTX10001 (Junos 21.4R1.15-EVO) IGP や SR の蚭定は割愛したす。䞋蚘の蚭定および確認を順に行いたす。 CE 接続むンタヌフェヌスの蚭定 EVI ず BD の蚭定 BGP の蚭定 経路の確認 疎通詊隓 なお怜蚌の郜合䞊、 PE では顧客 A ず B は同じ物理ポヌトで VLAN で分けお収容するこずずしたす。 CE 接続むンタヌフェヌスの蚭定 PE1 (IOS XR) 偎 埌の BD にはタグなしずしお芋せるため VLAN タグを取り倖す蚭定を入れおおきたす。 interface TenGigE0/0/0/32.1000 l2transport encapsulation dot1q 1000 rewrite ingress tag pop 1 symmetric ! interface TenGigE0/0/0/32.2000 l2transport encapsulation dot1q 2000 rewrite ingress tag pop 1 symmetric ! PE2 (Junos) 偎 この時点で既にむンタヌフェヌスに ESI を蚭定しおおきたす。 set interfaces xe-0/1/6 flexible-vlan-tagging set interfaces xe-0/1/6 encapsulation flexible-ethernet-services set interfaces xe-0/1/6 esi 00:00:00:00:00:00:00:00:00:02 set interfaces xe-0/1/6 esi all-active set interfaces xe-0/1/6 unit 1000 encapsulation vlan-bridge set interfaces xe-0/1/6 unit 1000 vlan-id 1000 set interfaces xe-0/1/6 unit 2000 encapsulation vlan-bridge set interfaces xe-0/1/6 unit 2000 vlan-id 2000 EVI ず BD の蚭定 PE1 (IOS XR) 偎 ESI ず RT を蚭定したす。 advertise-mac の有無で EVI ごずに Type-2 経路ずしお MAC を出すかを制埡できたす。 evpn evi 1000 bgp route-target import 65001:1000 route-target export 65001:1000 ! control-word-disable advertise-mac ! ! evi 2000 bgp route-target import 65001:2000 route-target export 65001:2000 ! control-word-disable advertise-mac ! ! interface TenGigE0/0/0/32 ethernet-segment identifier type 0 00.00.00.00.00.00.00.00.01 ! ! ! BD を蚭定したす。 顧客 A 甚ず、顧客 B 甚、それぞれの EVI を远加しおおきたす。 l2vpn bridge group EVPN bridge-domain 1000 interface TenGigE0/0/0/32.1000 ! evi 1000 ! ! bridge-domain 2000 interface TenGigE0/0/0/32.2000 ! evi 2000 ! ! ! ! PE2 (Junos) 偎 EVI å…Œ BD の routing-instance を䜜成したす。 RT も蚭定したす。 set policy-options policy-statement EXPORT-POLICY-1000 term ROUTE-TARGET then community add RT1000 set policy-options policy-statement IMPORT-POLICY-1000 term ROUTE-TARGET-iBGP from community RT1000-iBGP set policy-options policy-statement IMPORT-POLICY-1000 term ROUTE-TARGET-iBGP then accept set policy-options community RT1000 members target:65001:1000 set policy-options community RT1000-iBGP members target:65001:1000 set policy-options policy-statement EXPORT-POLICY-2000 term ROUTE-TARGET then community add RT2000 set policy-options policy-statement IMPORT-POLICY-2000 term ROUTE-TARGET-iBGP from community RT2000-iBGP set policy-options policy-statement IMPORT-POLICY-2000 term ROUTE-TARGET-iBGP then accept set policy-options community RT2000 members target:65001:2000 set policy-options community RT2000-iBGP members target:65001:2000 set routing-instances evpn-1000 instance-type evpn set routing-instances evpn-1000 protocols evpn set routing-instances evpn-1000 vlan-id none set routing-instances evpn-1000 interface xe-0/1/6.1000 set routing-instances evpn-1000 route-distinguisher 10.255.1.2:1000 set routing-instances evpn-1000 vrf-import IMPORT-POLICY-1000 set routing-instances evpn-1000 vrf-target target:65001:1000 set routing-instances evpn-2000 instance-type evpn set routing-instances evpn-2000 protocols evpn set routing-instances evpn-2000 vlan-id none set routing-instances evpn-2000 interface xe-0/1/6.2000 set routing-instances evpn-2000 route-distinguisher 10.255.1.2:2000 set routing-instances evpn-2000 vrf-import IMPORT-POLICY-2000 set routing-instances evpn-2000 vrf-target target:65001:2000 BGP の蚭定 PE1 (IOS XR) 偎 RT の蚭定などは EVI の項で行ったため、 address-family の宣蚀のみです。 router bgp 65001 bgp router-id 10.255.1.1 address-family l2vpn evpn ! neighbor 10.255.1.2 remote-as 65001 update-source Loopback0 address-family l2vpn evpn ! ! ! PE2 (Junos) 偎 こちらもネむバヌの定矩のみです。 set protocols bgp family evpn signaling set protocols bgp group blog type internal set protocols bgp group blog local-address 10.255.1.2 set protocols bgp group blog family evpn signaling set protocols bgp group blog neighbor 10.255.1.1 経路の確認 たず PE1 から PE2 方向に経路を芋おいきたす。 PE1 での MAC アドレス孊習結果ず、それぞれの EVI に察する VPN ラベルが぀いおいるこずが確認できたす。 RP/0/RSP0/CPU0:PE1#show evpn evi vpn-id 1000 mac Wed Jun 29 15:04:57.503 JST VPN-ID Encap MAC address IP address Nexthop Label SID ---------- ---------- -------------- ---------------------------------------- --------------------------------------- -------- --------------------------------------- 1000 MPLS 0200.0011.1111 :: TenGigE0/0/0/32.1000 24010 RP/0/RSP0/CPU0:PE1#show evpn evi vpn-id 2000 mac Wed Jun 29 15:05:04.384 JST VPN-ID Encap MAC address IP address Nexthop Label SID ---------- ---------- -------------- ---------------------------------------- --------------------------------------- -------- --------------------------------------- 2000 MPLS 0200.0033.3333 :: TenGigE0/0/0/32.2000 24000 これらの VPN ラベルが着信するず EVPN ずしお凊理されたす。 RP/0/RSP0/CPU0:PE1#show mpls forwarding Wed Jun 29 15:08:24.725 JST Local Outgoing Prefix Outgoing Next Hop Bytes Label Label or ID Interface Switched ------ ----------- ------------------ ------------ --------------- ------------ (snip) 24000 Pop EVPN:2000 U BD=0 E point2point 8136 (snip) 24010 Pop EVPN:1000 U BD=1 E point2point 0 (snip) PE2 偎では顧客 A の経路を孊習しおいたす。盞手の VPN ラベルが 24010 であるこずも認識しおいたす。 PE2 に CE から着信したフレヌムは VPN ラベルず、 PE1 の SID を付けお網内に転送されたす。 user@PE2> show route table evpn-1000.evpn.0 evpn-mac-address 02:00:00:11:11:11 extensive evpn-1000.evpn.0: 7 destinations, 15 routes (7 active, 0 holddown, 0 hidden) 2:10.255.1.1:1000::0::02:00:00:11:11:11/304 MAC/IP (3 entries, 1 announced) *BGP Preference: 170/-101 Route Distinguisher: 10.255.1.1:1000 Next hop type: Indirect, Next hop index: 0 Address: 0x853435c Next-hop reference count: 51 Source: 10.255.1.1 Protocol next hop: 10.255.1.1 Indirect next hop: 0x2 no-forward INH Session ID: 0x0 State: <Secondary Active Int Ext> Local AS: 65001 Peer AS: 65001 Age: 6:34 Metric2: 20 Validation State: unverified ORR Generation-ID: 0 Task: BGP_65001.10.255.1.1 Announcement bits (1): 0-evpn-1000-evpn AS path: I Communities: target:65001:1000 origin:10.255.1.1:1000 unknown iana evpn 0x60e:0x0:0x3e8 Import Accepted Route Label: 24010 ESI: 00:00:00:00:00:00:00:00:00:01 Localpref: 100 Router ID: 10.255.1.1 Primary Routing Table: bgp.evpn.0 Thread: junos-main Indirect next hops: 1 Protocol next hop: 10.255.1.1 Metric: 20 Indirect next hop: 0x2 no-forward INH Session ID: 0x0 Indirect path forwarding next hops: 1 Next hop type: Router Next hop: 10.1.2.1 via xe-0/1/0.0 Session Id: 0x0 10.255.1.1/32 Originating RIB: inet.3 Metric: 20 Node path count: 1 Forwarding nexthops: 1 Next hop type: Router Next hop: 10.1.2.1 via xe-0/1/0.0 Session Id: 0x0 疎通詊隓 顧客 A の CE に盞圓する VM を䞡端で 2 台䜜成し、その間で ping による通信を確認したした。 ping による通信確認のための 1 台目の IP 蚭定ず ping の実斜䟋です。 L3VPN ずは異なり、 L2VPN では途䞭経路を CE 偎から調査する方法がないため、 ping が通るこずを確認するのみです。 user@vm01:~$ ip a (snip) 4: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 02:00:00:11:11:11 brd ff:ff:ff:ff:ff:ff inet6 fe80::ff:fe11:1111/64 scope link valid_lft forever preferred_lft forever (snip) 6: ens224.1000@ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 02:00:00:11:11:11 brd ff:ff:ff:ff:ff:ff inet 192.168.0.1/24 scope global ens224.1000 valid_lft forever preferred_lft forever inet6 fe80::ff:fe11:1111/64 scope link valid_lft forever preferred_lft forever user@vm01:~$ ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. 64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.758 ms 64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.485 ms 64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.440 ms ^C --- 192.168.0.2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2025ms rtt min/avg/max/mdev = 0.440/0.561/0.758/0.140 ms 2 台目における IP 蚭定ず、パケットキャプチャによる確認です。 user@vm02:~$ ip a (snip) 4: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 02:00:00:22:22:22 brd ff:ff:ff:ff:ff:ff inet6 fe80::ff:fe22:2222/64 scope link valid_lft forever preferred_lft forever (snip) 6: ens224.1000@ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 02:00:00:22:22:22 brd ff:ff:ff:ff:ff:ff inet 192.168.0.2/24 scope global ens224.1000 valid_lft forever preferred_lft forever inet6 fe80::ff:fe22:2222/64 scope link valid_lft forever preferred_lft forever user@vm02:~$ sudo tcpdump -i ens224.1000 -n -nn -e tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens224.1000, link-type EN10MB (Ethernet), capture size 262144 bytes 20:18:36.037958 02:00:00:11:11:11 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 192.168.0.2 tell 192.168.0.1, length 46 20:18:36.038032 02:00:00:22:22:22 > 02:00:00:11:11:11, ethertype ARP (0x0806), length 42: Reply 192.168.0.2 is-at 02:00:00:22:22:22, length 28 20:18:36.038364 02:00:00:11:11:11 > 02:00:00:22:22:22, ethertype IPv4 (0x0800), length 98: 192.168.0.1 > 192.168.0.2: ICMP echo request, id 1, seq 1, length 64 20:18:36.038394 02:00:00:22:22:22 > 02:00:00:11:11:11, ethertype IPv4 (0x0800), length 98: 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 1, seq 1, length 64 20:18:37.039357 02:00:00:11:11:11 > 02:00:00:22:22:22, ethertype IPv4 (0x0800), length 98: 192.168.0.1 > 192.168.0.2: ICMP echo request, id 1, seq 2, length 64 20:18:37.039405 02:00:00:22:22:22 > 02:00:00:11:11:11, ethertype IPv4 (0x0800), length 98: 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 1, seq 2, length 64 20:18:38.063289 02:00:00:11:11:11 > 02:00:00:22:22:22, ethertype IPv4 (0x0800), length 98: 192.168.0.1 > 192.168.0.2: ICMP echo request, id 1, seq 3, length 64 20:18:38.063320 02:00:00:22:22:22 > 02:00:00:11:11:11, ethertype IPv4 (0x0800), length 98: 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 1, seq 3, length 64 20:18:41.054244 02:00:00:22:22:22 > 02:00:00:11:11:11, ethertype ARP (0x0806), length 42: Request who-has 192.168.0.1 tell 192.168.0.2, length 28 20:18:41.054632 02:00:00:11:11:11 > 02:00:00:22:22:22, ethertype ARP (0x0806), length 60: Reply 192.168.0.1 is-at 02:00:00:11:11:11, length 46 ^C 10 packets captured 10 packets received by filter 0 packets dropped by kernel このようにしお、 Multi-vendor での Single-AS における L2VPN が実珟できたした。次にこれを Multi-AS ぞず拡匵したす。 Multi-AS での L2VPN Multi-AS ぞず拡匵するず、トポロゞヌは次の図のようになりたす。 ASBR は前述の通り察応しおいる機噚が限られるため Multi-vendor の環境ではありたせん。 PE はそれぞれの AS で IOS XR ず Junos を 1 台ず぀、 ASBR ず P ルヌタヌを介しお接続された状態です。 図䞭ではルヌプバックアドレスの採番や Node SID の採番が AS 間で重耇しないようになっおいたすが、これは説明のわかりやすさのためで、実際には重耇するこずも可胜です。ただしルヌプバックアドレスをルヌタヌ ID ずしお䜿甚しおいる堎合は、特に EVI の RD に気を぀ける必芁がありたす。 䜿甚した機材および OS バヌゞョンは次の通りです。 PE PE1: Cisco ASR9901 (IOS XR 7.6.1) PE2: Juniper MX204 (Junos 21.3R1.9) P P1: Cisco C8201 (IOS XR 7.5.1) P2: Juniper PTX10001 (Junos 21.4R1.15-EVO) P3: Cisco NCS55A2 (IOS XR 7.5.1) P4: Juniper MX10003 (Junos 21.4R1.12) ASBR ASBR1 および ASBR2:Cisco ASR9902 (IOS XR 7.6.1) IGP や SR の蚭定、および前述の CE 接続むンタヌフェヌスの蚭定は Single-AS ず同等なので割愛したす。 䞋蚘の各項目で、䞻に Single-AS ずの差異を順に瀺したす。 EVI ず BD の蚭定 BGP の蚭定 経路の確認 疎通詊隓 EVI ず BD の蚭定 Route Target を盞互に孊習するための仮想的な AS: 64999 を蚭定し、有効にしたす。 BD の蚭定は Single-AS ず同等なので割愛したす。 PE1 (IOS XR) 偎 evpn evi 1000 bgp route-target import 64999:1000 route-target import 65001:1000 route-target export 64999:1000 route-target export 65001:1000 ! control-word-disable advertise-mac ! ! evi 2000 bgp rd 65002:2000 route-target import 64999:2000 route-target import 65001:2000 route-target export 64999:2000 route-target export 65001:2000 ! control-word-disable advertise-mac ! ! interface TenGigE0/0/0/32 ethernet-segment identifier type 0 00.00.00.00.00.00.00.00.01 ! ! ! PE2 (Junos) 偎 送受信で RT を増やしたす。 set policy-options policy-statement EXPORT-POLICY-1000 term ROUTE-TARGET then community add RT1000 set policy-options policy-statement IMPORT-POLICY-1000 term ROUTE-TARGET-iBGP from community RT1000-iBGP set policy-options policy-statement IMPORT-POLICY-1000 term ROUTE-TARGET-iBGP then accept set policy-options policy-statement IMPORT-POLICY-1000 term ROUTE-TARGET-eBGP from community RT1000-eBGP set policy-options policy-statement IMPORT-POLICY-1000 term ROUTE-TARGET-eBGP then accept set policy-options community RT1000 members [ target:64999:1000 target:65001:1000 target:65002:1000 ] set policy-options community RT1000-iBGP members target:65001:1000 set policy-options community RT1000-eBGP members target:64999:1000 set policy-options policy-statement EXPORT-POLICY-2000 term ROUTE-TARGET then community add RT2000 set policy-options policy-statement IMPORT-POLICY-2000 term ROUTE-TARGET-iBGP from community RT2000-iBGP set policy-options policy-statement IMPORT-POLICY-2000 term ROUTE-TARGET-iBGP then accept set policy-options policy-statement IMPORT-POLICY-2000 term ROUTE-TARGET-eBGP from community RT2000-eBGP set policy-options policy-statement IMPORT-POLICY-2000 term ROUTE-TARGET-eBGP then accept set policy-options community RT2000 members [ target:64999:2000 target:65001:2000 target:65002:2000 ] set policy-options community RT2000-iBGP members target:65001:2000 set policy-options community RT2000-eBGP members target:64999:2000 set routing-instances evpn-1000 instance-type evpn set routing-instances evpn-1000 protocols evpn set routing-instances evpn-1000 vlan-id none set routing-instances evpn-1000 interface xe-0/1/6.1000 set routing-instances evpn-1000 route-distinguisher 10.255.1.2:1000 set routing-instances evpn-1000 vrf-import IMPORT-POLICY-1000 set routing-instances evpn-1000 vrf-target target:64999:1000 set routing-instances evpn-2000 instance-type evpn set routing-instances evpn-2000 protocols evpn set routing-instances evpn-2000 vlan-id none set routing-instances evpn-2000 interface xe-0/1/6.2000 set routing-instances evpn-2000 route-distinguisher 10.255.1.2:2000 set routing-instances evpn-2000 vrf-import IMPORT-POLICY-2000 set routing-instances evpn-2000 vrf-target target:64999:2000 BGP の蚭定 このトポロゞヌでは䞋蚘の 3 ぀の BGP セッションが最䜎限必芁です。 PE1 <-> ASBR1: AS 65001 内の IBGP ASBR1 <-> ASBR2: AS 65001 ず AS 65002 間の EBGP PE2 <-> ASBR2: AS 65002 内の IBGP これらのうち 3. は 1. ず同等のため割愛したす。 たず 1. に぀いお、 ASBR で next-hop-self の蚭定が必芁になりたす。 ASBR1 (IOS XR) 偎 router bgp 65001 bgp router-id 10.255.1.7 neighbor 10.255.1.1 remote-as 65001 address-family l2vpn evpn next-hop-self 次に 2. に぀いお、 ASBR 間では Option B を有効にしたす。たた、 EBGP ではデフォルトで経路が拒吊されるため怜蚌甚にすべおを蚱可したす。 ASBR2 偎も同様です。 ASBR1 (IOS XR) 偎 router bgp 65001 bgp router-id 10.255.1.7 address-family l2vpn evpn label mode per-nexthop-received-label retain route-target all option-b-asbr-only ! neighbor 10.100.2.2 remote-as 65002 address-family l2vpn evpn route-policy pass-all in route-policy pass-all out route-policy pass-all pass end-policy 経路の確認 Single-AS ず同様に PE1 から PE2 方向に経路を芋おいきたす。 PE1 での MAC アドレス孊習結果ず、 VPN ラベル 24010 が぀いおいるこずが確認できたす。 RP/0/RSP0/CPU0:PE1#show evpn evi vpn-id 1000 mac Thu Jun 30 15:11:19.848 JST VPN-ID Encap MAC address IP address Nexthop Label SID ---------- ---------- -------------- ---------------------------------------- --------------------------------------- -------- --------------------------------------- 1000 MPLS 000c.2915.e72d :: 10.255.1.7 24010 1000 MPLS 000c.2915.e72d 192.168.0.4 10.255.1.7 24010 1000 MPLS 0200.0011.1111 :: TenGigE0/0/0/32.1000 24010 1000 MPLS 0200.0022.2222 :: 10.255.1.2 122 1000 MPLS 0200.0022.2222 192.168.0.2 10.255.1.2 122 ASBR1 では Inter-AS の VPN から受信したずきに AS 65001 内の VPN ぞず Swap したす。 ここでは Inter-AS 偎から 24020 を受け取ったずきに 24010 ぞず Swap しお PE1 に送るこずから、 Inter-AS ではこの VPN 甚に 24020 が䜿われおいるこずがわかりたす。 RP/0/RP0/CPU0:ASBR1#show mpls forwarding Thu Jun 30 15:13:15.420 JST Local Outgoing Prefix Outgoing Next Hop Bytes Label Label or ID Interface Switched ------ ----------- ------------------ ------------ --------------- ------------ (snip) 24020 24010 No ID 10.255.1.1 0 (snip) ASBR2 では AS 65002 内で VPN 識別に䜿甚するラベルを生成し、そのラベルが぀いたものを 24020 ぞず Swap し Inter-AS に送り出したす。 ここでは Inter-AS 向けの出力で 24020 を䜿甚するルヌルを探すこずで AS 65002 内では 24013 がこの VPN 甚に䜿甚されおいるこずがわかりたす。 RP/0/RP0/CPU0:ASBR2#show mpls forwarding Thu Jun 30 15:18:38.479 JST Local Outgoing Prefix Outgoing Next Hop Bytes Label Label or ID Interface Switched ------ ----------- ------------------ ------------ --------------- ------------ (snip) 24013 24020 No ID Te0/0/0/25 10.100.2.1 0 (snip) PE2 で孊習される経路ずラベルを芋るず、䞊蚘で確認した 24013 であり、 ASBR2 で正しく転送されるラベルが孊習されおいたす。 user@PE2> show route table evpn-1000.evpn.0 evpn-mac-address 02:00:00:11:11:11 extensive evpn-1000.evpn.0: 13 destinations, 22 routes (13 active, 0 holddown, 0 hidden) 2:10.255.1.1:1000::0::02:00:00:11:11:11/304 MAC/IP (2 entries, 1 announced) *BGP Preference: 170/-101 Route Distinguisher: 10.255.1.1:1000 Next hop type: Indirect, Next hop index: 0 Address: 0xc2275dc Next-hop reference count: 62 Source: 10.255.2.5 Protocol next hop: 10.255.2.1 Indirect next hop: 0x2 no-forward INH Session ID: 0x0 State: <Secondary Active Int Ext> Local AS: 65002 Peer AS: 65002 Age: 21:38 Metric2: 30 Validation State: unverified ORR Generation-ID: 0 Task: BGP_65002.10.255.2.5 Announcement bits (1): 0-evpn-1000-evpn AS path: 65001 I (Originator) Cluster list: 0.0.0.1 Originator ID: 10.255.2.1 Communities: target:64999:1000 target:65001:1000 origin:10.255.1.1:1000 unknown iana evpn 0x60e:0x0:0x3e8 Import Accepted Route Label: 24013 ESI: 00:00:00:00:00:00:00:00:00:01 Localpref: 100 Router ID: 10.255.2.1 Primary Routing Table: bgp.evpn.0 Thread: junos-main Indirect next hops: 1 Protocol next hop: 10.255.2.1 Metric: 30 Indirect next hop: 0x2 no-forward INH Session ID: 0x0 Indirect path forwarding next hops: 1 Next hop type: Router Next hop: 10.2.4.1 via et-0/0/1.0 weight 0x1 Session Id: 0x0 10.255.2.1/32 Originating RIB: inet.3 Metric: 30 Node path count: 1 Forwarding nexthops: 1 Next hop type: Router Next hop: 10.2.4.1 via et-0/0/1.0 weight 0x1 Session Id: 0x0 疎通詊隓 Single-AS の時ず同様に、顧客 A の CE に盞圓する VM を䞡端で 2 台䜜成し、その間で ping による通信を確認したした。 前述の繰り返しですが、CE 偎からは経路を確認できず ping の通信で確かめるため、コマンド出力は党く同じになりたす。掲茉は省略したす。 たずめ 本蚘事では Single-/Multi-AS SR-MPLS での L2VPN に぀いお解説したした。 VLAN-based で構築する際の、 EVI 等の蚭定や確認䟋を玹介したした。 機胜実装に差があり完党な Multi-vendor ではありたせんが、 Multi-AS での怜蚌に぀いお玹介したした。 次回の蚘事では、 BGP color による Explicit-path TE を玹介予定です。 2022/07/25 远蚘 公開したした [Multi-AS Segment Routing 怜蚌連茉 #4] Color-Based Steering in Single-AS Virtual Private Wire Service の略。仮想専甚線サヌビス。 ↩ Virtual Private LAN Service の略。仮想専甚 LAN サヌビス。 ↩ Multiprotocol BGP の略。BGP の拡匵コミュニティを甚いお远加情報を亀換する仕組み。 ↩ Release Notes for Cisco ASR 9000 Series Routers, IOS XR Release 7.4.1 より、 Inter-AS EVPN Option B の新機胜。 ↩
はじめに 本蚘事は前回の蚘事である「 ゜フトりェア蚭蚈に぀いおtwada技術顧問ず話しおみた 〜 A Philosophy of Software Design をベヌスに 〜 - NTT Communications Engineers' Blog 」の続線です。 前回の蚘事の内容がベヌスずなっおいたすので、「APoSD っお䜕だっけ」ずいう堎合はぜひ前回の蚘事をご芧になっおから、以䞋にお進みください。 ずいうこずで、埌線の察話パヌトにさっそく入っおいきたしょう Pull Complexity Downwards iwashi: APoSD では、耇雑性を䞋に远いやる(Pull Complexity Downwards)ずいう話が出おきたす。䜕らかの凊理が耇雑になる堎合、それを隠蔜しおむンタヌフェヌスを極力シンプルに保぀、ずいうのがAPoSDの䞻匵です。 こちらに関しおも、瀟内勉匷䌚䞭で「議論があるよな」ず twada さんがコメントされおいたす。具䜓的に、どのような議論があるのでしょうか twada: 「シンプルな実装よりも、シンプルなむンタフェヌスを持぀べきだ」に関しおは、蚭蚈流掟ずしおは色々あるずころです。 叀くは、Worse is Better の話に぀ながりたす。この話には、2぀の蚭蚈の流掟が出おきたす。それぞれ「MIT/Stanfordアプロヌチ」ず、「New Jerseyアプロヌチ」ず呌ばれおいたす。 䞡掟ずも「蚭蚈は実装ずむンタヌフェヌスの䞡面においお単玔でなければならない」ず述べおいたす。ここたではたあ圓然のこずですが、実装の単玔さずむンタフェヌスの単玔さが䞡立できないずきなどに䞡掟の違いが出おきたす。曞籍『 The Art of UNIX Programming 』には次のように説明されおいたす。 簡朔性 (Simplicity) MIT/Stanford: むンタヌフェヌスが単玔になるこずの方が、実装が単玔になるこずより重芁である New Jersey: 実装が単玔な方が、むンタヌフェヌスが単玔なこずより重芁である。単玔さが蚭蚈においお最も重芖されるべき事柄である APoSDでは、シンプルなむンタヌフェむスで耇雑な実装を隠蔜するのが良いず説いおいたす。コヌドが倚少耇雑になろうず正しいこずをせよ。コヌドの耇雑さを抜象によっお隠蔜し、認知負荷を䞋げよ。これがAPoSDでいう、Deep Moduleになりたす。 これは、MIT/Stanford アプロヌチず呌ばれおいる流掟に近いように思えたす。いた話しおいるうちに気が぀きたしたが、本曞はStanford倧孊の教科曞で、著者は同倧孊の教授でしたね。ですから、MIT/Stanfordアプロヌチに寄った意芋になっおいるのも頷けたす。 MIT/StanfordアプロヌチずNew Jerseyアプロヌチは、正圓性や䞀貫性に関しおもポリシヌがやや異なりたす。曞籍『 The Art of UNIX Programming 』にはこう蚘されおいたす。 正圓性 (Correctness) MIT/Stanford: 蚭蚈はすべおの点においお正しいものでなければならない。誀りは蚱されない New Jersey: 蚭蚈はすべおの点においお正しいものでなければならない。ただし、どちらかずいえば、正しいこずよりは単玔なこずの方が重芁である 䞀貫性 (Consistency) MIT/Stanford: 蚭蚈は䞀貫性を欠いたものであっおはならない。䞀貫性を保぀ためには完党性や単玔さを倚少犠牲にしおもよい。䞀貫性は正圓性ず同じぐらい重芁である。 New Jersey: 蚭蚈は䞀貫性を倧きく欠いたものであっおはならない。単玔さを保぀ために、䞀貫性は犠牲にされるこずがある。しかし、あたり起こらない状況に察応しようずしお実装を耇雑にしたり䞀貫性を欠いたものにするよりは、それを捚おる方がよい 他にもいろいろあるのですが、詳しくは曞籍『The Art of UNIX Programming』や、私の講挔資料 過去を知り、未来に備える。技術遞定の審矎県 2019 edition を読んでみおください。 ( Worse Is Better - 過去を知り、未来に備える。技術遞定の審矎県 2019 edition / Worse Is Better - Understanding the Spiral of Technologies 2019 edition P.35 より) もちろん APoSD は Worse Is Better 以降の議論を螏たえた内容になっおいたしお、なにより耇雑性を最倧の敵ずしおいたすから、「コヌドがいくら耇雑になろうずも、正しいこずをせよ」ず蚀っおいる本ではないずいうこずは匷調しおおきたす。耇雑性を廃しお、どう砎綻なく゜フトりェアを蚭蚈するかの本です。その䞊で、競合する制玄に出䌚ったずきに、どちらを取るか、たたはどうバランスをずるかずいうずころにポリシヌが珟れるのですね。 iwashi: このあたりの具䜓的な事䟋っお、どのようなものがあるのでしょうか twada: New Jersey掟が結果的に生き残ったサンプルずしおは、歎史的には、LinuxずMINIX、C蚀語ずLisp、gitずbazaar-ngなどがありたす。gitなどは兞型䟋ず蚀えそうですね。他には、MongoDB vs RethinkDBなどもそう考えられたす。 OSSの䞖界においおは、歎史的にはNew Jersey掟が生き残るこずも倚かったず考えおいたす。 iwashi: 䜕が理由で生き残っおきたのでしょうか twada: 目の前の問題を解決し぀぀も、実装がシンプルなために、埌日他の人が開発に参加できるハヌドルが䞋がるから、ですね。 iwashi: たさに、OSSず盞性がいいですね。 twada: そういうこずなんです。 実装の単玔さを遞択するずきに、挏れのある抜象化があったずしおも目の前の問題を解決できたす。か぀実装がシンプルだず第䞉者が開発に参加するハヌドルが䞋がりたす。 これは、結果的には進化的な匷さに぀ながりたす。぀たり、倉化に耐えお、生き残るための十分な数の目を埗られる。 技術の歎史においお、「なんでこっちの技術が生き残っおいるんだ」みたいな話が出おきたずきに、蚭蚈の䞀貫性・正しさ・矎しさだけが生き残りを決めるファクタヌではない、ずいう実䟋ですね。 New Jersey掟はPrgramaticず衚珟できそうです。どちらかずいうずUnixカルチャヌ。Eric Raymond氏もそうですね。 その察立軞ずしおあるのが、MIT/Stanford アプロヌチであり「Do the Right Thing正しいこずをせよ」ずいう流掟です。StanrfordのJohn Ousterhout教授もDo The Right Thing掟に近いように思えたすが、実はUncle Bobも同じ傟向がありたすよね。 John Ousterhout教授ずUncle Bobは批刀し合っおいお氎ず油のように芋えたすが、やや理想䞻矩に寄っおいる点では䌌おいたす。珟実よりは理想を遞びがちであるず。 iwashi: 䞖の䞭にある゜フトりェアを振り返っお、「これっおどっちに寄っおるんだろうな」っお考えるのは面癜いかもしれないですね。 twada: そうですね。 実装をどれぐらい抜象で隠蔜すべきかずいうよりは、その発蚀をしおいる人はどういう圱響䞋にいるのかが芋えおくるず誀読を避けやすくなりたすし、過倧評䟡も避けられるでしょう。 iwashi: 技術の歎史や、根っこにある流れを知っおいるずわかりやすいですね。 twada: 技術の歎史でいえば、もちろんMIT/Stanford流にむンタヌフェヌスが優れおいお生き残っおいる䟋もあるでしょう。 APoSDのShallowモゞュヌルは、Functionalityが浅いものを意味したす。New Jersey掟は、過床に隠蔜しないこずを重芖したす。挏れのある抜象化で良いので、あたり隠蔜しない方向になりたす。䞀方で、MIT/Stanford偎はきちんず抜象化しお認知負荷を䞋げる方向ですよね。 iwashi: どちらが唯䞀正しいわけではない、っおこずですよね twada: はい。なのでAPoSD本は、色々ず本を読んでみお、自分の䞭で最適のバランスを探すための぀の本だ、ず考えるず良いです。 Uncle Bobの本を読んで「そこたではやらないけどこういう考え自䜓は倧事だよね」ず䞀歩匕いお読むのず同じで、John Ousterhout教授はこんなこずを曞いおいるが、䞀歩匕いお読むこずができれば、蚭蚈の䞖界が広がる。極論があるから党䜓の蚭蚈空間は広がるわけです。 iwashi: そういう意味では、もし若者がAPoSDだけ読むず偏りすぎるかもしれないですね。 twada: 玠晎らしい本ですが、ある意味぀の流掟の総本山に連なる本でもあるので、それが正解かずいうずそうでもない。だから、「色々読んでみたしょう」ずいう話になりたす。 私自身、本読みずしおは、意芋の匷い本は奜きです。たずえば、Bertrand Meyerのオブゞェクト指向入門や、アゞャむル関係でいえばJim Coplienもそうですね。そういった戊うこずを蟞さないベテラン論客たちは芖野を広げおくれたす。 ある䞀方に心酔せず耇数の意芋を芋お、自分の蚭蚈ずしおそのどこかにバランスを芋出すのが倧事です。特定の状況によっお蚭蚈の流掟を䜿い分けられたす。 たずえば、OSSなら抜象を深くしすぎないで、第䞉者の参加がしやすいようにする方向性もあるでしょう。なぜなら、New Jersey掟のほうが生き残りやすいだろうずいう算段があるためです。 それに察しお、プロプラむ゚タリな補品開発・クロヌズドな開発であれば、実装の単玔さではなく蚭蚈の完党性や䞀貫性のほうが倧事かもしれたせん。 どちらに蚭蚈の重きを眮くか、ずいうのは状況によっお倉わっおくるわけですね。 ミッションクリティカルなシステムなのか、それずも゚ンドナヌザヌが倚くおも䞀時的に萜ちるのは蚱容されるのかでも、゜フトりェア蚭蚈で重芖する内容は倉わりたす。正確性が倧事なのか、堅牢性が倧事なのか。文脈によっお倧事にすべき品質特性は異なりたす。゜フトりェア蚭蚈に唯䞀の正解ずいうものはないんです。 もちろん基本ずなるレベル、たずえば「可読性の高いコヌド」などはどこであっおも正しいんです。そこから先で䞡立しにくい蚭蚈䞊の制玄に面したずきにどういう蚭蚈を遞択しおいくかずいうのは゜フトりェア蚭蚈の䞀番難しいずころ。これは孊んでいくしかないでしょう。 急がば回れで、倱敗から繰り返しお孊ぶほうが倚い分野です。おすすめなのは自分が蚭蚈したシステムを長い期間たずえば2幎以䞊メンテナンスするこずです。自分の蚭蚈刀断がどういう結果になるのか、オヌバヌ゚ンゞニアリングやアンダヌ゚ンゞニアリング、倱敗や成功を繰り返すこずで経隓が増えるので、蚭蚈の打率が高たりたす。 iwashi: リヌダブルコヌド のような曞籍は汎甚的ですよね。 twada: そうですね。䞀般的なプログラミング原則はどこでも適甚可胜です。たずえば、良い名前付けは、どのような状況䞋でも重芁でしょう。 ただ、たずえば関数プログラミングずオブゞェクト指向プログラミングはパラダむムが異なり、埗意分野もやや異なりたす。「䜕が正しい」ずいうよりは「向いおいる・向いおない」がありたす。ですから、自分の道具箱を増やすのが良いですね。 iwashi: 道具箱のツヌルを増やすために䜕をしたらいいでしょうか twada: 曞籍『 達人プログラマヌ 』に「幎に぀プログラミング蚀語を孊がう」ずいう教えがありたす。ちょっずず぀パラダむムの違う蚀語をやるのがお勧めですね。 おわりに 本蚘事では、APoSDを起点ずしお、MIT/StanfordアプロヌチずNew Jerseyアプロヌチに぀いおの察話を玹介したした。 圓瀟では、このような゜フトりェア蚭蚈に興味がある゜フトりェア゚ンゞニアを募集しおおりたす NTTコミュニケヌションズ株匏䌚瀟 ゜フトりェア゚ンゞニア の求人䞀芧 より、具䜓的なポストを是非ご確認ください
はじめに DevOpsプラットフォヌムの取り組みを玹介する1回目の蚘事です。 こんにちは、むノベヌションセンタヌでプラットフォヌムチヌムのアヌキテクトをしおいる牧志 ( @JunMakishi ) です。NTTグルヌプ向けのDevOpsプラットフォヌムである「 Qmonus (クモナス) Value Stream 」の開発をリヌドしおいたす。 本日から、数週間にわたり、 Qmonus Value Stream チヌムの取り組みや利甚技術を連茉圢匏で玹介させおいただきたす。 第1回目の蚘事では、Qmonus Value Streamの抂芁を玹介したす。 Qmonus (クモナス) Value Streamずは Qmonus Value Streamは、アプリケヌション開発者が、ナヌザにずっお䟡倀のある機胜やサヌビスを継続的に提䟛するためのDevOpsプラットフォヌムです。Cloud Native Adapterず呌ばれる独自のInfrastructure as Code実装ず、アプリケヌションを商甚環境にリリヌスするための継続的デリバリ機胜を有しおいたす。 Kubernetesを知っおいる方は、アプリケヌション構成を管理するHelmず、CI/CDパむプラむン機胜をバンドルしたものをむメヌゞいただくず良いず思いたす。 アプリケヌション開発者は、Qmonus Value Streamを䜿うこずで、クラりドやCI/CDに粟通しおいなくおも簡単にクラりドアヌキテクチャのベストプラクティスを再利甚しおアプリケヌションをデリバリできたす。 Qmonus Value Streamの目的 ゜フトりェアをアゞリティ高く開発しながら安定運甚するためには、クラりドコンピュヌティングの掻甚が必芁䞍可欠です。しかし、 Cloud Native Landscape が拡倧しおいっおいるように、クラりド技術は幎々倚様化・耇雑化しおおり、クラりド技術を組み合わせお1぀のアヌキテクチャを組み䞊げるには高い専門性ず倚倧な劎力を必芁ずしたす。 NTTコミュニケヌションズでは、倚数の゜フトりェア開発の珟堎でクラりド技術を掻甚しおいたすが、個々の゜フトりェアプロゞェクトでクラりド技術の専門性を持぀のは難易床が高いだけでなく、アヌキテクチャガバナンスが効かないずいう課題がありたした。私自身、以前、ネットワヌクコントロヌラ開発プロゞェクトに所属しおいたしたが、圓時は゜フトりェアデリバリやクラりド環境の管理のためだけに1぀のサブチヌムを構成しおおり、䞻目的のコントロヌラアプリケヌション開発以倖にかかる劎力は銬鹿になりたせんでした。 こういったチヌムに代わっおクラりド技術の耇雑性を解決し、ナヌザに䟡倀を届けるアプリケヌションの開発に泚力できるよう、2020幎から本栌的にQmonus Value Streamの開発を開始したした。チヌムを超えお再利甚できるInfrastructure as Codeを䜿っお、早く簡単にクラりドを掻甚したアヌキテクチャを構築し、アプリケヌションをデリバリできるようにするこずを目指しおいたす。 Cloud Native Adapterによるベストプラクティスの提䟛 Cloud Native Adapterは、アプリケヌションをクラりド基盀䞊で動䜜させる過皋を仲介する独自のInfrastructure as Code実装です。商甚環境で実瞟のあるシステム構成やCI/CDパむプラむンを再利甚可胜な圢でたずめるこずができ、アプリケヌションず Cloud Native Adapter を組み合わせるこずで、ベストプラクティスに沿ったシステム構成やCI/CDを実珟できたす。 䟋えば、Qmonus Value Streamでは、Google Kubernetes EngineでWeb APIをセキュアに公開するためのシステム構成を、1぀のCloud Native Adapterずしお甚意しおいたす。このAdapterを䜿うだけで、Qmonus Value Streamの利甚者は、コンテナを立ち䞊げおAPIを公開するためのマニフェストを生成できたす。さらに、そのAPIにGCPのWAF/FirewallであるCloud Armorを適甚しお、安党にAPIを公開できたす。 Cloud Native Adapterは、CUE蚀語で宣蚀的にシステム構成およびCI/CDパむプラむンを蚘述したす。CUE蚀語を掻甚するこずで、耇数のAdapterを結合しお耇雑なアヌキテクチャを実珟できたす。さらに、既存のAdapterに、独自のシステム仕様に合わせたロゞックを远加するこずも可胜です。 NTTグルヌプで、ベストプラクティスを蓄積し育おおいくこずで、様々なアヌキテクチャパタヌンを簡単に構築できる仕組みを確立し、か぀アヌキテクチャガバナンスを効かせるこずを目指しおいたす。 アプリケヌションのリリヌスパむプラむンを統合管理 Qmonus Value Streamでは、Tektonず呌ばれるオヌプン゜ヌスのCI/CDフレヌムワヌクを掻甚し、゜フトりェアを商甚環境にデリバリするためのCI/CD機胜を提䟛しおいたす。ナヌザに䟡倀を届けるアプリケヌションを䞭心に据え、そのアプリケヌションを開発しおから商甚環境にリリヌスするたでの䞀連の流れを統合管理できたす。 以䞋の図の䟋のように、マヌゞしたコヌドから゜フトりェアをビルドし結合環境にデプロむする「ビルドパむプラむン」ず、総合詊隓環境や商甚環境に゜フトりェアをリリヌスする「リリヌスパむプラむン」を構成し、それらを連結できたす。結合環境で継続的に詊隓しお゜フトりェアを垞にデプロむ可胜な状態に保ち、任意のタむミングで詊隓を通過した゜フトりェアを"Promote"しお、商甚環境にリリヌスできたす。 Qmonus Value Streamによっお、アプリケヌションをナヌザに届けるたでの䞀連の流れ、すなわちバリュヌストリヌムを自動化・管理するこずで、安党でアゞリティの高いDevOpsプロセスを組織に適甚するこずを目指しおいたす。 Qmonus Value Streamの導入効果 Qmonus Value Streamの本栌開発を開始した2020幎以降、埐々にNTTコミュニケヌションズ内で導入を進めおきたした。2022幎3月末時点で18のアクティブな゜フトりェアプロゞェクトで利甚され、1月あたり100以䞊の゜フトりェアリリヌスに掻甚されおいたす。たた、2022幎4月からは、NTTグルヌプ各瀟ぞの提䟛を開始し、さらに利甚が拡倧しおいたす。 Cloud Native Adapterずそれを䜿っおアプリケヌションを継続的に商甚環境にデリバリする仕組みを䜿うこずで、アプリケヌション開発者は、簡単にクラりドのベストプラクティスを掻甚でき、もっずも泚力したいアプリケヌションの開発ずそのリリヌスに集䞭できたす。その結果が、リリヌス回数ずいう数字に衚れおいるず考えおいたす。 おわりに DevOpsプラットフォヌムの取り組みを玹介する1回目の蚘事ずしお、NTTグルヌプ向けのDevOpsプラットフォヌムQmonus Value Streamの抂芁を玹介させおいただきたした。fukabori.fmでも本プラットフォヌムに぀いお玹介する機䌚をいただいたので、よかったらこちらも参考にしおください。( 50. 瀟内DevOps基盀、Tekton、Cuelang w/ JunMakishi ) Qmonus Value Streamチヌムは、メンバひずりひずりが、利甚者であるアプリケヌション開発者のために信念を持っお掻動を続けおいたす。プラットフォヌムを内補開発するポゞション、プラットフォヌムを䜿っおNTTグルヌプのクラりド基盀やCICDを構築支揎するポゞションそれぞれで、䞀緒に働く仲間を募集しおいたすので、興味を持たれた方は応募いただけるず嬉しいです。 https://hrmos.co/pages/nttcom0033/jobs/0000019 https://hrmos.co/pages/nttcom0033/jobs/1692796 次回以降、Qmonus Value Streamチヌムの具䜓的な取り組みや芁玠技術を玹介しおいきたす。お楜しみに
サマリ Multi-AS で構成されるネットワヌクにおいお、 SR-MPLS + VPNv4 による L3VPN を実珟 IOS XR + Junos の Multi-vendor 環境で動䜜怜蚌に成功 この蚘事は Multi-AS SR 怜蚌連茉の第 2 回です。目次は こちら 抂芁 むノベヌションセンタヌの岩田です。普段の業務では Multi-AS Segment Routing に関する技術怜蚌や、ベンチャヌ䌁業ぞの技術支揎でスマヌトフォンアプリケヌション開発業務などを行なっおいたす。 本蚘事では我々の怜蚌のメむンタヌゲットである Multi-AS/Multi-domain SR-MPLS を甚いた L3VPN に぀いおご玹介したす。 第 0 回の蚘事 でもご玹介した通り、我々は Multi-AS/Multi-domain SR により拡匵性のあるネットワヌクの実珟に぀いお怜蚎、怜蚌しおいたす。本蚘事の流れずしおは、たずアンダヌレむを耇数の AS やドメむンに分割する利点に぀いお述べ、分割した AS をどのように接続するかに぀いお怜蚎したす。その埌、Multi-AS/Multi-domain SR-MPLS を甚いた L3VPN の Multi-vendor 環境における怜蚌䟋を、サンプルトポロゞヌや蚭定䟋を添えながら玹介したす。 L3VPN や Segment Routing に぀いおは 第 1 回の蚘事 で説明しおいるので、あわせおご確認ください。 アンダヌレむを Multi-AS/Multi-domain に分ける利点 本節では、Multi-AS/Multi-domain で アンダヌレむUnderlayを構築する利点に぀いお説明したす。 アンダヌレむを Multi-AS/Multi-domain に分けお構築する最倧の利点は、アンダヌレむの拡匵性や保守性が担保される点です。 アンダヌレむ の拡匵性の芳点では、単䞀の SR domain を構築する際に IP 重耇できない制玄があるため、プラむベヌト IP を䜿甚しおいる堎合だず芏暡の拡倧ずずもに蚭蚈の制玄が増加する、ずいう課題ぞの察凊が必芁になりたす。AS を分割するこずによっお AS 間での IP 重耇を考えずにすみたす。 たた保守性の芳点からも、倧芏暡ネットワヌクを IGP で管理しおいる堎合、機噚トラブルなどが発生しルヌティングに圱響があった際の眹障範囲が倧きくなるずいう課題がありたす。こちらも AS や SR domain を分割するこずで眹障範囲を局所化できたす。 このように AS や SR domain を耇数に分割するこずで、蚭蚈の自由床を保ち IGP や IBGP の圱響範囲を局所化できるため、拡匵性ず保守性のあるネットワヌクが構築できたす。 Inter-AS の接続方匏に぀いお Multi-AS で MPLS VPN を行うためには Inter-AS の接続方匏に぀いお考える必芁がありたす。 本節では、RFC にお暙準化されおいる 3 ぀の接続方匏ずそれらを組み合わせた方匏に぀いお説明し、今回どの方匏を採甚するかに぀いお説明したす。 接続方匏の遞定方針は前節で説明した通り、蚭蚈の自由床を保ち IGP や IBGP の圱響範囲を局所化し、拡匵性ず保守性のあるネットワヌクが構築できるかどうかずしたす。 Multi-AS で MPLS VPN を実珟する方法ずしおは RFC4364 で暙準化されおいる Option A、B、C の3぀の方匏ず、A ず B を組み合わせた方匏 D が知られおいたす。 それぞれ以䞋のような特城がありたす。 Option A ASBR で顧客毎に サブむンタフェヌスず VRF を䜜成し EBGP セッション経由で経路を亀換する ASBR 間の各サブむンタフェヌス間では単玔な IP パケットを転送し AS を接続する ASBR 間に顧客の数だけサブむンタヌフェヌスを䜜成する必芁がある EBGP セッションは各 VRF で行うため、各サブむンタフェヌスに蚭定が必芁になる Option B ASBR で単䞀のむンタフェヌスを甚いお EBGP セッションを匵り VPN 経路を亀換する ASBR で VPN ラベルを Swap し ASBR 間を別のラベルを甚いお転送し AS を接続する Option C VPN 経路を RR 経由で亀換し、互いのアンダヌレむ情報を共有する ASBR に VRF が䞍芁 Multi-AS で 単䞀の SR domain を構築できる アンダヌレむを共有するため制玄が増え、前述の Multi-AS の利点のうちの拡匵性は枛少する Option DA+B ASBR で単䞀のむンタフェヌスを甚いお EBGP セッションを匵り VPN 経路を亀換する B ず同様 ASBR 間は顧客毎に䜜成したサブむンタフェヌス間で単玔な IP パケットの転送をするこずで AS を接続する A ず同様 ASBR 間に顧客の数だけサブむンタヌフェヌスを䜜成する必芁があるA ず同様 VPN 経路の亀換は単䞀むンタフェヌスを甚いお行うため各むンタフェヌスぞの蚭定が䞍芁A ではむンタフェヌス毎 たずめたすず以䞋のようになりたす。 A  ASBR に顧客ごずのサブむンタヌフェヌスや EBGP セッションなどの蚭定が必芁 B  AS が制限少なく独立しお存圚でき、 ASBR 間も単䞀のセッションになる C アンダヌレむ が AS 間で広告されるため、今回の目的に䞍向き A+BD A の状況のうちサブむンタヌフェヌスの蚭定が同様に残る その䞭でも、今回は Option B を採甚したした。IGP、IBGP の責任範囲を疎に分離しお運甚できる方匏であり、拡匵性・保守性が他の Option に比べお高いこずが遞択理由です。 ただし機噚ず SR、VPN、Option-B を組み合わせお ASBR ずしお甚いるにはサポヌト状況に差がありたす。 L3VPN に぀いおは、我々が怜蚌を始めた時点での ASR9901IOS XR 7.3.1 や MX204Junos 21.2で既にサポヌトされおいたす。 しかし L2VPNEVPNは IOS XR 7.4.1 1 からの察応で、Junos は 2022 幎 6 月時点で未察応です。 怜蚌䟋の玹介 以降は L3VPN の怜蚌䟋を実際の蚭定䟋を添え぀぀玹介したす。 サンプルトポロゞヌ想定するナヌスケヌス 怜蚌のため、䞋蚘のようなトポロゞヌを䜜成したす。 3 ぀のルヌタヌによる AS を 2 ぀接続したコア網で、顧客 A ず B を収容したす。 怜蚌環境は Multi-vendor に構成したす。䜿甚する機噚は䞋蚘の通りです。 SR Domain 1 PE1、ASBR1: Cisco IOS XR 7.4.1 ASBR2: Junos OS 21.3R1.9 SR Domain 2 ASBR3: Cisco IOS XR 7.4.1 PE2、ASBR4: Junos OS 21.3R1.9 この埌は䞋蚘の流れに埓っお蚭定を玹介したす。 IS-IS 蚭定ず状態確認 VRF ず MP-BGP 蚭定ず状態確認 PE 間の ping 疎通詊隓 IS-IS - 蚭定 IS-IS の SR 拡匵を利甚し、SR-MPLS の SID 情報を広告したす。 たた、運甚効率化のため MPLS OAM の蚭定もしおおきたす。 IOS XR䟋 PE1 router isis 1 is-type level-2-only net 49.0000.0000.0aff.0001.00 segment-routing global-block 16000 23999 address-family ipv4 unicast metric-style wide segment-routing mpls ! interface Loopback0 address-family ipv4 unicast prefix-sid index 1 ! ! interface GigabitEthernet0/0/0/0 point-to-point address-family ipv4 unicast ! ! interface GigabitEthernet0/0/0/1 point-to-point address-family ipv4 unicast ! ! ! segment-routing ! Junos䟋 PE2 set protocols isis interface ge-0/0/0.0 level 2 metric 10 set protocols isis interface ge-0/0/0.0 point-to-point set protocols isis interface ge-0/0/1.0 level 2 metric 10 set protocols isis interface ge-0/0/1.0 point-to-point set protocols isis interface lo0.0 passive set protocols isis source-packet-routing srgb start-label 16000 set protocols isis source-packet-routing srgb index-range 8000 set protocols isis source-packet-routing node-segment ipv4-index 1 set protocols isis level 1 disable set protocols isis level 2 wide-metrics-only set interfaces ge-0/0/0 unit 0 family inet address 10.0.0.1/30 set interfaces ge-0/0/0 unit 0 family iso set interfaces ge-0/0/0 unit 0 family mpls set interfaces ge-0/0/1 unit 0 family inet address 10.0.1.1/30 set interfaces ge-0/0/1 unit 0 family iso set interfaces ge-0/0/1 unit 0 family mpls set interfaces lo0 unit 0 family inet address 10.255.0.1/32 set interfaces lo0 unit 0 family iso address 49.0000.0000.0aff.0001.00 SR Global BlockSRGBの倉曎埌は再起動が必芁です。 IS-IS - 動䜜確認 IS-IS ネむバヌの状態ず SID Table を確認したす。 IOS XR RP/0/RP0/CPU0:pe1#show isis neighbors Fri Jun 17 13:37:40.431 JST IS-IS 1 neighbors: System Id Interface SNPA State Holdtime Type IETF-NSF asbr1 Gi0/0/0/0 *PtoP* Up 24 L2 Capable asbr2 Gi0/0/0/1 *PtoP* Up 20 L2 Capable Total neighbor count: 2 RP/0/RP0/CPU0:pe1#show mpls forwarding Fri Jun 17 13:37:45.932 JST Local Outgoing Prefix Outgoing Next Hop Bytes Label Label or ID Interface Switched ------ ----------- ------------------ ------------ --------------- ------------ 16002 Pop SR Pfx (idx 2) Gi0/0/0/0 10.0.0.2 0 16003 Pop SR Pfx (idx 3) Gi0/0/0/1 10.0.1.2 324511 24000 Pop SR Adj (idx 1) Gi0/0/0/0 10.0.0.2 0 24001 Pop SR Adj (idx 3) Gi0/0/0/0 10.0.0.2 0 24004 Pop SR Adj (idx 1) Gi0/0/0/1 10.0.1.2 0 24005 Pop SR Adj (idx 3) Gi0/0/0/1 10.0.1.2 0 Junos user@pe2> show isis adjacency Interface System L State Hold (secs) SNPA ge-0/0/0.0 asbr3 2 Up 28 ge-0/0/1.0 asbr4 2 Up 26 user@pe2> show route protocol isis table mpls.0 mpls.0: 14 destinations, 14 routes (14 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 18 *[L-ISIS/14] 1d 03:49:30, metric 0 > to 10.0.1.2 via ge-0/0/1.0, Pop 18(S=0) *[L-ISIS/14] 1d 03:49:30, metric 0 > to 10.0.1.2 via ge-0/0/1.0, Pop 19 *[L-ISIS/14] 1d 03:48:12, metric 0 > to 10.0.0.2 via ge-0/0/0.0, Pop 19(S=0) *[L-ISIS/14] 1d 03:48:12, metric 0 > to 10.0.0.2 via ge-0/0/0.0, Pop 16002 *[L-ISIS/14] 00:08:15, metric 20 > to 10.0.0.2 via ge-0/0/0.0, Pop 16002(S=0) *[L-ISIS/14] 00:08:15, metric 20 > to 10.0.0.2 via ge-0/0/0.0, Pop 16003 *[L-ISIS/14] 1d 03:49:30, metric 10 > to 10.0.1.2 via ge-0/0/1.0, Pop 16003(S=0) *[L-ISIS/14] 1d 03:49:30, metric 10 > to 10.0.1.2 via ge-0/0/1.0, Pop Static RouteIOS XR - 機噚蚭定 ※こちらハマりポむントなのでご泚意ください。 IOS XR で Inter-AS を行う際には、ASBR のピアの片方で /32 の Static Route を蚭定する必芁がありたす。 これを行わないずコントロヌルプレヌンは立ち䞊がりたすがトラフィックが転送されたせん。 詳しくは こちら をご参照ください。 router static address-family ipv4 unicast 10.100.0.2/32 GigabitEthernet0/0/0/2 ! ! Static RouteIOS XR - 動䜜確認 RP/0/RP0/CPU0:asbr1#show route static Fri Jun 17 13:29:28.349 JST S 10.100.0.2/32 is directly connected, 1d02h, GigabitEthernet0/0/0/2 VRF、MP-BGP VPNv4 - 機噚蚭定 顧客 A、B の VRF 蚭定ず、経路を広告する MP-BGP L3VPN を蚭定したす。 VPN の各パラメヌタは䞋蚘の通りです。 SR Domain 1 AS 番号: 65000 VRF 100: RD/RT 65000:100 AS 間での VPN 経路広告甚 RT: 64999:100 VRF 200: RD/RT 65000:200 AS 間での VPN 経路広告甚 RT: 64999:200 SR Domain 2 AS 番号: 65001 VRF 100: RD/RT 65001:100 AS 間での VPN 経路広告甚 RT: 64999:100 VRF 200: RD/RT 65001:200 AS 間での VPN 経路広告甚 RT: 64999:200 PEIOS XR  PE1 vrf 100 description for simple L3VPN rd 65000:100 address-family ipv4 unicast import route-target 64999:100 65000:100 ! export route-target 64999:100 65000:100 ! ! ! vrf 200 description for simple L3VPN rd 65000:200 address-family ipv4 unicast import route-target 64999:200 65000:200 ! export route-target 64999:200 65000:200 ! ! ! interface GigabitEthernet0/0/0/2 vrf 100 ipv4 address 192.168.0.254 255.255.255.0 ! interface GigabitEthernet0/0/0/3 vrf 200 ipv4 address 192.168.0.254 255.255.255.0 ! router bgp 65000 bgp router-id 10.255.0.1 address-family vpnv4 unicast ! neighbor-group ibgp remote-as 65000 update-source Loopback0 address-family vpnv4 unicast ! ! neighbor 10.255.0.2 use neighbor-group ibgp ! neighbor 10.255.0.3 use neighbor-group ibgp ! vrf 100 rd 65000:100 address-family ipv4 unicast label mode per-vrf redistribute connected ! ! vrf 200 rd 65000:200 address-family ipv4 unicast label mode per-vrf redistribute connected ! ! ! PEJunos  PE2 set policy-options policy-statement EXPORT-POLICY-100 term ROUTE-TARGET then community add VRF100-65001-RT set policy-options policy-statement EXPORT-POLICY-100 term ROUTE-TARGET then community add SHARED-100-RT set policy-options policy-statement EXPORT-POLICY-100 term REDIST-DIRECT from protocol direct set policy-options policy-statement EXPORT-POLICY-100 term REDIST-DIRECT then accept set policy-options policy-statement EXPORT-POLICY-200 term ROUTE-TARGET then community add VRF200-65001-RT set policy-options policy-statement EXPORT-POLICY-200 term ROUTE-TARGET then community add SHARED-200-RT set policy-options policy-statement EXPORT-POLICY-200 term REDIST-DIRECT from protocol direct set policy-options policy-statement EXPORT-POLICY-200 term REDIST-DIRECT then accept set policy-options policy-statement IMPORT-POLICY-100 term ROUTE-TARGET-65001 from community VRF100-65001-RT set policy-options policy-statement IMPORT-POLICY-100 term ROUTE-TARGET-65001 then accept set policy-options policy-statement IMPORT-POLICY-100 term ROUTE-TARGET-SHARED from community SHARED-100-RT set policy-options policy-statement IMPORT-POLICY-100 term ROUTE-TARGET-SHARED then accept set policy-options policy-statement IMPORT-POLICY-200 term ROUTE-TARGET-65001 from community VRF200-65001-RT set policy-options policy-statement IMPORT-POLICY-200 term ROUTE-TARGET-65001 then accept set policy-options policy-statement IMPORT-POLICY-200 term ROUTE-TARGET-SHARED from community SHARED-200-RT set policy-options policy-statement IMPORT-POLICY-200 term ROUTE-TARGET-SHARED then accept set policy-options community SHARED-100-RT members target:64999:100 set policy-options community SHARED-200-RT members target:64999:200 set policy-options community VRF100-65001-RT members target:65001:100 set policy-options community VRF200-65001-RT members target:65001:200 set routing-instances 100 instance-type vrf set routing-instances 100 protocols bgp family inet unicast set routing-instances 100 interface ge-0/0/2.0 set routing-instances 100 route-distinguisher 65001:100 set routing-instances 100 vrf-import IMPORT-POLICY-100 set routing-instances 100 vrf-export EXPORT-POLICY-100 set routing-instances 100 vrf-table-label set routing-instances 200 instance-type vrf set routing-instances 200 protocols bgp family inet unicast set routing-instances 200 interface ge-0/0/3.0 set routing-instances 200 route-distinguisher 65001:200 set routing-instances 200 vrf-import IMPORT-POLICY-200 set routing-instances 200 vrf-export EXPORT-POLICY-200 set routing-instances 200 vrf-table-label set routing-options router-id 10.255.0.1 set routing-options autonomous-system 65001 set protocols router-advertisement interface fxp0.0 set protocols bgp family inet unicast set protocols bgp family inet-vpn unicast set protocols bgp group ibgp type internal set protocols bgp group ibgp local-address 10.255.0.1 set protocols bgp group ibgp family inet-vpn unicast set protocols bgp group ibgp neighbor 10.255.0.2 set protocols bgp group ibgp neighbor 10.255.0.3 ASBRIOS XR  ASBR1 vrf 100 description for simple L3VPN rd 65000:100 address-family ipv4 unicast import route-target 64999:100 65000:100 ! export route-target 64999:100 65000:100 ! ! ! vrf 200 description for simple L3VPN rd 65000:200 address-family ipv4 unicast import route-target 64999:200 65000:200 ! export route-target 64999:200 65000:200 ! ! ! router bgp 65000 bgp router-id 10.255.0.2 address-family vpnv4 unicast ! neighbor-group ibgp remote-as 65000 update-source Loopback0 address-family vpnv4 unicast next-hop-self ! ! neighbor-group 65001 remote-as 65001 address-family vpnv4 unicast route-policy pass-all in route-policy pass-all out ! ! neighbor 10.100.0.2 use neighbor-group 65001 ! neighbor 10.255.0.1 use neighbor-group ibgp ! neighbor 10.255.0.3 use neighbor-group ibgp ! vrf 100 rd 65000:100 address-family ipv4 unicast label mode per-vrf ! ! vrf 200 rd 65000:200 address-family ipv4 unicast label mode per-vrf ! ! ! ASBRJunos : ASBR4 set policy-options policy-statement EXPORT-POLICY-100 term ROUTE-TARGET then community add VRF100-65001-RT set policy-options policy-statement EXPORT-POLICY-100 term ROUTE-TARGET then community add SHARED-100-RT set policy-options policy-statement EXPORT-POLICY-200 term ROUTE-TARGET then community add VRF200-65001-RT set policy-options policy-statement EXPORT-POLICY-200 term ROUTE-TARGET then community add SHARED-200-RT set policy-options policy-statement IMPORT-POLICY-100 term ROUTE-TARGET-65001 from community VRF100-65001-RT set policy-options policy-statement IMPORT-POLICY-100 term ROUTE-TARGET-65001 then accept set policy-options policy-statement IMPORT-POLICY-100 term ROUTE-TARGET-SHARED from community SHARED-100-RT set policy-options policy-statement IMPORT-POLICY-100 term ROUTE-TARGET-SHARED then accept set policy-options policy-statement IMPORT-POLICY-200 term ROUTE-TARGET-65001 from community VRF200-65001-RT set policy-options policy-statement IMPORT-POLICY-200 term ROUTE-TARGET-65001 then accept set policy-options policy-statement IMPORT-POLICY-200 term ROUTE-TARGET-SHARED from community SHARED-200-RT set policy-options policy-statement IMPORT-POLICY-200 term ROUTE-TARGET-SHARED then accept set policy-options community SHARED-100-RT members target:64999:100 set policy-options community SHARED-200-RT members target:64999:200 set policy-options community VRF100-65001-RT members target:65001:100 set policy-options community VRF200-65001-RT members target:65001:200 set routing-instances 100 instance-type vrf set routing-instances 100 protocols bgp family inet unicast set routing-instances 100 route-distinguisher 65001:100 set routing-instances 100 vrf-import IMPORT-POLICY-100 set routing-instances 100 vrf-export EXPORT-POLICY-100 set routing-instances 100 vrf-table-label set routing-instances 200 instance-type vrf set routing-instances 200 protocols bgp family inet unicast set routing-instances 200 route-distinguisher 65001:200 set routing-instances 200 vrf-import IMPORT-POLICY-200 set routing-instances 200 vrf-export EXPORT-POLICY-200 set routing-instances 200 vrf-table-label set routing-options router-id 10.255.0.3 set routing-options autonomous-system 65001 set protocols router-advertisement interface fxp0.0 set protocols bgp family inet-vpn unicast set protocols bgp group ibgp type internal set protocols bgp group ibgp local-address 10.255.0.3 set protocols bgp group ibgp neighbor 10.255.0.1 set protocols bgp group 65000 type external set protocols bgp group 65000 peer-as 65000 set protocols bgp group 65000 neighbor 10.100.1.1 MP-BGP VPNv4 - 動䜜確認 䞋蚘3ステップで L3VPN の経路孊習ず転送動䜜を確認したす。 今回は各ベンダヌの ASBR の組で動䜜確認がしたいので、遞択させたくない ASBR 間のリンクを萜ずすこずで遞択させたす。 動䜜確認したい ASBR の組以倖の ASBR 間のリンクを萜ずす BGP から受信した経路を確認 ping による疎通確認 IOS XR の ASBRASBR1->ASBR3を利甚する堎合 顧客 AVRF100が利甚する堎合を想定し動䜜確認をしおいきたす。 Junos の ASBR 間ASBR2<->ASBR4のリンクを萜ずしたす。 user@asbr2> configure Entering configuration mode [edit] user@asbr2# set interfaces ge-0/0/2 disable [edit] user@asbr2# show | compare [edit interfaces ge-0/0/2] + disable; [edit] user@asbr2# commit commit complete user@asbr2# exit Exiting configuration mode user@asbr2> ping 10.100.1.2 count 5 PING 10.100.1.2 (10.100.1.2): 56 data bytes ^C --- 10.100.1.2 ping statistics --- 5 packets transmitted, 0 packets received, 100% packet loss 次に、PE1IOS XR が受信した経路を確認したす。 RP/0/RP0/CPU0:pe1#show bgp vpnv4 unicast vrf 100 192.168.1.0/24 detail Mon Jun 20 14:14:13.121 JST BGP routing table entry for 192.168.1.0/24, Route Distinguisher: 65000:100 Versions: Process bRIB/RIB SendTblVer Speaker 62 62 Flags: 0x00001001+0x00000000; Last Modified: Jun 20 14:12:27.073 for 00:01:46 Paths: (1 available, best #1) Not advertised to any peer Path #1: Received by speaker 0 Flags: 0x2000000005060005, import: 0x80 Not advertised to any peer 65001 10.255.0.2 (metric 20) from 10.255.0.2 (10.255.0.2), if-handle 0x00000000 Received Label 24007 Origin IGP, localpref 100, valid, internal, best, group-best, import-candidate, imported Received Path ID 0, Local Path ID 1, version 62 Extended community: RT:64999:100 RT:65001:100 Source AFI: VPNv4 Unicast, Source VRF: default, Source Route Distinguisher: 65001:100 RP/0/RP0/CPU0:pe1#show route vrf 100 Mon Jun 20 12:35:07.389 JST Codes: C - connected, S - static, R - RIP, B - BGP, (>) - Diversion path D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP i - ISIS, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, su - IS-IS summary null, * - candidate default U - per-user static route, o - ODR, L - local, G - DAGR, l - LISP A - access/subscriber, a - Application route M - mobile route, r - RPL, t - Traffic Engineering, (!) - FRR Backup path Gateway of last resort is not set C 192.168.0.0/24 is directly connected, 22:01:15, GigabitEthernet0/0/0/2 L 192.168.0.254/32 is directly connected, 22:01:15, GigabitEthernet0/0/0/2 B 192.168.1.0/24 [200/0] via 10.255.0.2 (nexthop in vrf default), 00:08:01 経路が受信できおいる事ず、ASBR1IOS XRが遞択されおいるこずが確認できたした。 ping で疎通確認を行なっおみたす。 RP/0/RP0/CPU0:pe1#ping 192.168.1.254 vrf 100 Mon Jun 20 12:33:13.840 JST Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.254, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 2/6/12 ms パケットが転送でき、VPN が構築できおいるこずが確認できたした。 Junos の ASBRASBR2->ASBR4を利甚する堎合 今床は顧客 BVRF200が利甚する堎合を想定し動䜜確認をしおいきたす。 たず、IOS XR の ASBR 間ASBR1<->ASBR3のリンクを萜ずしたす。 RP/0/RP0/CPU0:asbr1#configure Mon Jun 20 12:40:44.843 JST RP/0/RP0/CPU0:asbr1(config)#interface gigabitEthernet 0/0/0/2 RP/0/RP0/CPU0:asbr1(config-if)#shutdown RP/0/RP0/CPU0:asbr1(config-if)#show commit changes diff Mon Jun 20 12:41:02.632 JST Building configuration... !! IOS XR Configuration 7.4.1 + interface GigabitEthernet0/0/0/2 + shutdown ! end RP/0/RP0/CPU0:asbr1(config-if)#commit Mon Jun 20 12:41:06.779 JST RP/0/RP0/CPU0:asbr1(config-if)#exit RP/0/RP0/CPU0:asbr1(config)#exit RP/0/RP0/CPU0:asbr1#ping 10.100.0.2 Mon Jun 20 12:41:56.670 JST Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.100.0.2, timeout is 2 seconds: UUUUU Success rate is 0 percent (0/5) 次に、Junos が受信した経路を確認したす。 user@pe2> show route advertising-protocol bgp 10.255.0.3 detail 100.inet.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden) * 192.168.1.0/24 (1 entry, 1 announced) BGP group ibgp type Internal Route Distinguisher: 65001:100 VPN Label: 16 Nexthop: Self Flags: Nexthop Change Localpref: 100 AS path: [65001] I Communities: target:64999:100 target:65001:100 200.inet.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden) * 192.168.1.0/24 (1 entry, 1 announced) BGP group ibgp type Internal Route Distinguisher: 65001:200 VPN Label: 17 Nexthop: Self Flags: Nexthop Change Localpref: 100 AS path: [65001] I Communities: target:64999:200 target:65001:200 hanabi@pe2> show route receive-protocol bgp 10.255.0.3 table bgp.l3vpn.0 detail bgp.l3vpn.0: 2 destinations, 4 routes (2 active, 0 holddown, 0 hidden) * 65000:100:192.168.0.0/24 (2 entries, 0 announced) Import Accepted Route Distinguisher: 65000:100 VPN Label: 16 Nexthop: 10.255.0.3 Localpref: 100 AS path: 65000 ? Communities: target:64999:100 target:65000:100 * 65000:200:192.168.0.0/24 (2 entries, 0 announced) Import Accepted Route Distinguisher: 65000:200 VPN Label: 17 Nexthop: 10.255.0.3 Localpref: 100 AS path: 65000 ? Communities: target:64999:200 target:65000:200 user@pe2> show route 192.168.0.0/24 100.inet.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 192.168.0.0/24 *[BGP/170] 00:49:52, localpref 100, from 10.255.0.3 AS path: 65000 ?, validation-state: unverified > to 10.0.1.2 via ge-0/0/1.0, Push 16 200.inet.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 192.168.0.0/24 *[BGP/170] 00:49:52, localpref 100, from 10.255.0.3 AS path: 65000 ?, validation-state: unverified > to 10.0.1.2 via ge-0/0/1.0, Push 17 bgp.l3vpn.0: 2 destinations, 2 routes (2 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 65000:100:192.168.0.0/24 *[BGP/170] 00:49:52, localpref 100, from 10.255.0.3 AS path: 65000 ?, validation-state: unverified > to 10.0.1.2 via ge-0/0/1.0, Push 16 65000:200:192.168.0.0/24 *[BGP/170] 00:49:52, localpref 100, from 10.255.0.3 AS path: 65000 ?, validation-state: unverified > to 10.0.1.2 via ge-0/0/1.0, Push 17 経路が受信できおいる事ず、ASBR4Junosの ルヌプバックアドレス10.0.1.2が nexthop ずしお遞択されおいるこずが確認できたした。 ping で疎通確認を行なっおみたす。 user@pe2> ping 192.168.0.254 routing-instance 200 count 5 PING 192.168.0.254 (192.168.0.254): 56 data bytes 64 bytes from 192.168.0.254: icmp_seq=0 ttl=253 time=4.264 ms 64 bytes from 192.168.0.254: icmp_seq=1 ttl=253 time=10.481 ms 64 bytes from 192.168.0.254: icmp_seq=2 ttl=253 time=11.079 ms 64 bytes from 192.168.0.254: icmp_seq=3 ttl=253 time=6.493 ms 64 bytes from 192.168.0.254: icmp_seq=4 ttl=253 time=3.516 ms --- 192.168.0.254 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 3.516/7.167/11.079/3.114 ms パケットが転送でき、VPN が構築できおいるこずが確認できたした。 これで、ASBR が IOS XR の堎合ず、Junos の堎合共に、VPN が構築できおいるこずが確認できたした。 たずめ 本蚘事では、 Multi-AS/Multi-domain での アンダヌレむ 構築の利点、SR-MPLS を甚いた L3VPN 実装時の Inter-AS 方匏を玹介するずずもに、 Multi-vendor 環境における Multi-AS での L3VPN の怜蚌結果を玹介したした。 次回の蚘事では、SR-MPLS EVPN in Single/Multi-AS に぀いお玹介予定です。 2022/07/11 远蚘 公開したした [Multi-AS Segment Routing 怜蚌連茉 #3] SR-MPLS L2VPN (EVPN) in Single-/Multi-AS 参考資料 この怜蚌の䞀郚は匊チヌムの田島、䞉島がそれぞれ MPLS JAPAN 2021 、瀟倖勉匷䌚で発衚したした。以䞋に資料を公開しおいたすので䜵せおご芧ください。 マルチASか぀マルチベンダにおけるSR-MPLS TEの実珟 田島 マルチAS/マルチドメむンなSegment Routingの実珟 䞉島 Release Notes for Cisco ASR 9000 Series Routers, IOS XR Release 7.4.1 https://www.cisco.com/c/en/us/td/docs/routers/asr9000/software/asr9k-r7-4/general/release/notes/b-release-notes-asr9000-r741.html ↩
はじめに はじめたしお。 プラットフォヌムサヌビス本郚 デヌタプラットフォヌムサヌビス郚門の森分です。 もずもず私は、NTT Comのクラりドサヌビスをベヌスにした法人向け゜リュヌションの個瀟別運甚やむンフラ関連のプロゞェクトマネヌゞャ業務を担圓しおおりたした。 最近はSmart Data Platform以䞋、SDPFアヌキテクトなる、お客様課題の解決やNTT Comのビゞネスの䞭でSDPFの掻甚を掚進する郚隊に参画しおいたす。 デヌタ利掻甚を支えるSDPFのアヌキテクトがデヌタ利掻甚に詳しくなければ立぀瀬がありたせん。 そうならないように日々研鑜を積んでいるわけですが、その䞭で䜜ったTwitter分析システムっぜいもののご玹介が本皿の趣旚ずなりたす。 本来のデヌタ利掻甚プロゞェクトでは、課題および仮説をたず明確にしお、それに応じたデヌタ解析を進めおいくのですが、本皿では堅苊しいものは党郚すっずばしたゆるい雰囲気でお送りしたす。 きっかけ 私の所属するチヌムは、某自治䜓のお客様ず地域掻性化のためデヌタ利掻甚するプロゞェクトに参画しおいたす。 そのノりハりをもっず広く遍く、特に䞭小芏暡の自治䜓向けにデヌタ利掻甚サヌビスずしお提䟛できないか怜蚎する営みがありたした。 その䞭で、お客様が䜏民の思っおいるこずをアクティブに汲み取る曎には分析する手段がないか ず考えたずきにTwitterを分析しおみおはずのむンスタントアむディアがきっかけです。  ずいうのは埌付けで、リアルタむムで情報が远加されおいるデヌタを可芖化できたらかっこいいんじゃんずの思いで手を動かし始めたした。 実際のデヌタ掻甚基盀でもデヌタ曎新などの運甚が問題になっおくるこずが倚いので、リアルタむム曎新の事䟋を䜜りにいきたした。 やりたいこず 自治䜓の担圓者様が䜿うこずを劄想するず以䞋の芁件がたずありそうです。 察象の自治䜓゚リア付近で情報を絞り蟌めるこず 䜏民がどんなこずを぀ぶやいおいるかの傟向が手間を掛けずにわかるこず たずは1.をかなえるため、䜍眮情報が付属しおいるツむヌトを分析の察象ずしたした。 Twitterでは、本文の内容から類掚する以倖だず、䜍眮情報くらいしか地方自治䜓に玐づける属性がなさそうだったためです。 党䜓ツむヌトから芋るず䜍眮情報をも぀ツむヌトはかなり限られたすが、そこそこあるだろうずのなかば芋切り発車したした。 2.に぀いおは、ワヌドクラりドを䜿っお、頻出しおいるワヌドを可芖化し、ツむヌトの党䜓傟向をざっくり掎みに行く方針ずしたした。 ぀くっおみた 3分クッキング方匏ずなり恐瞮ですが、某自治䜓のお客様の取り組みの䞭で、Tableauで参照できるデヌタベヌス(PostgreSQL)を構築した怜蚌環境があり、そちらを間借りさせおいただきたす。 可芖化に぀いおは、BIに特化したデヌタ芖芚化ツヌルであるTableauのおかげで盀石なので、どれだけちゃんずしたデヌタを準備できるかが勝負です。 簡単ですが、システム抂芁図です。 やっおいるこず Twitter Developerアカりントは無料アカりントを䜿甚 プログラム実行環境は螏み台サヌバ(CentOS)にPython環境を䜜っお実装 ツむヌト取埗はTwitterAPIでのTwitter操䜜を簡単に実装できるPythonラむブラリであるtweepyのStreamListenerをベヌスに改造 取埗するツむヌトは緯床経床でフィルタヌ。日本を芆うくらいの 適甚に 広めで蚭定。 ツむヌトから必芁な情報を掻い摘んで、DataFrameに攟り蟌んでいく DataFrameをPostgreSQLのtweetテヌブルに攟り蟌む ツむヌト取埗スクリプトは5分毎にcronで起動させ、゚ラヌ耐性を無理やり䞊げる ワヌドクラりドのためのワヌドデヌタはtweetテヌブルのデヌタを圢態玠解析しお、Wordテヌブルに攟り蟌む 圢態玠分析はmecabを䜿っお、名詞のみを抜出 圢態玠分析は、1時間に1回、毎時10分に前の1時間分をたずめお凊理 ワヌドクラりドはTableau内の衚珟で完結するので、远加で実装する必芁なしすばらしい ちゃんずツむヌト取埗できるか ちゃんずツむヌト取埗できおいるか可芖化しおみたす。 1時間ごずに1,000件15,000件くらいの幅でツむヌト取埗ができおいたす。 深倜垯はがっ぀りツむヌトが枛りたすがそれでも1,000件皋床ありたす。 䜍眮情報をもったツむヌトはほずんどなかったなんおオチにならなくおよかったです。 Tableauの曎新ボタン抌䞋は必芁ですが、ツむヌト取埗のリアルタむム性も問題なさそうです。 圢態玠分析できおるか 次に、圢態玠分析しお生成される名詞数を可芖化しおみたす。 1時間圓たりに5,000語85,000語くらいが生成されおいる感じです。 波圢がツむヌト数ずほが䞀臎しおいお、だいたい1ツむヌトあたり平均7語くらい生成されおたす。 ツむヌトをマッピングしおみる 䜍眮情報をもずに、Tableauに地図マッピングしおもらいたしょう。 日本を芆い぀くす䞀面のツむヌト。 ぀いでに韓囜も芆い぀くしおたすね。䞭囜や北朝鮮にマッピングがないのはお囜柄でしょうか。 たたに、指定゚リア倖のデヌタが出珟しおいたすが、これはStreaming apiのバグずいうこずで異垞倀扱いずしたす。 ワヌドクラりドしおみる 次にワヌドクラりドを䜜っおみたしょう。さっきのツむヌトマッピングに重ね合わせお配眮しおみたす。 密床が高く芋づらいですが、圢にはなっおたす。 頻出のワヌドもちゃんず倧きく衚瀺されおいたす。 䜍眮フィルタヌを導入しおみる 基本機胜的なものは実装できたので、地域ごずにフィルタヌできる機胜を远加したす。 「指定䜍眮」ず「指定距離」のパラメヌタを䜜成しお、特定䜍眮から半埄〇kmを察象にしたツむヌトのみをフィルタヌする機胜を実装したす。 「指定䜍眮」は手動入力でもいいですが操䜜性が悪くなるので、ツむヌトのマヌクをクリックしたら自動指定されるようにしおみたした。 青マヌクが「指定䜍眮」のツむヌト、オレンゞマヌクが「指定距離」内のツむヌトになりたす。 それに合わせおワヌドクラりドの察象ツむヌトも同期させおみたした。 たた、ワヌドクラりドの衚瀺密床の調敎ずしお、衚瀺させるワヌドの最䜎出珟数を閟倀ずしお蚭定できるようにしたした。 千代田区あたりを「指定䜍眮」にしお、半埄50kmを察象に絞っおみたした。 3月31日倜は地震が発生しおいたので、その傟向も芋えおたす。 ぀いでに、ワヌドクラりドのワヌドをクリックすればツむヌトマッピング偎もそのワヌドを含むものでフィルタヌできるようにしおみたす。 これで具䜓的なツむヌトを远いかけるのが楜になりたした。 各地方の傟向を芋おみる これたでは䟋ずしお関東呚蟺のものを参照しおきたしたが、各地方の傟向を芋おいきたす。 札幌近郊 たずは札幌近郊から。 地名が頻出するのはどこにも同じ傟向があるようです。䜍眮情報ありのツむヌトのためでしょう この日は日ハムがシヌズン初勝利したのでその様子も反映されおたす。 仙台近郊 次に仙台近郊。 関東ず同様に地震の圱響をうけたのがほのかに分かりたす。 東海゚リア 愛知や静岡をメむンに東海゚リアを芋おみたす。 桜前線的にこの゚リアが満開なのかなず想像できたす。 この日は関東ず関西で地震が起こったので、間に挟たれた東海でも地震ワヌドが目立っおたす。 関西゚リア 倧阪、兵庫、京郜を䞭心に。 関西でも地震が発生しおいたため、やはり地震傟向が匷いです。 関東ず比范するず時事関連ワヌドが芋えるのは地域柄でしょうか。 䞭四囜゚リア 広島を䞭心に䞭四囜を察象に。 かなり゚リアを広げたからか地名系が倚いです。 カヌプが開幕戊絶奜調でしたので広島近郊でカヌプの話題が倚く、その傟向も少し芋えたす。 九州゚リア そろそろ芋飜きおたせんでしょうか。あず少しです。お付き合い願いたす。 熊本を䞭心に、九州7県をすっぜり察象にしたした。 九州゚リアも地名系が倚いですが、BTSが芋えおいるのは韓囜ず近いからでしょうか。 沖瞄近郊 䞀気に傟向が倉わりたす。沖瞄近郊です。 軍事機の飛行情報をトラッキングしおいるMilitary Aircraft Spotterずいうアカりントが、嘉手玍基地の情報を頻繁に぀ぶやいおいるのが圱響を出しおいるようです。 沖瞄゚リアのツむヌト数自䜓が少ないこずもあり、頻繁に぀ぶやいおいるアカりントの圱響が倧きくなっおしたいたす。 日本は笑顔で溢れおいる ここたで読んでくれた皆様、どうもありがずうございたす。 各地方のワヌドクラりドを通しで眺めおみるず、倚くの地方で「笑顔」のワヌドが出珟しおいたす。 これはこの蚘事を読んで切る皆様、ひいおは日本囜民が毎日を笑顔で過ごしおいるいるからに他なりたせん。 そんな玠敵な囜、日本に産たれおよかったなぁず感じたす。 お付き合い頂きたしお、ありがずうございたした。 そんなこずはない わかっおたす。そこたで日垞に笑顔があふれおいないこずは。調べおみたしょう。 「笑顔」のワヌドでツむヌトをフィルタヌしおマッピングしおみたす。 玔粋にツむヌト本文に「笑顔」が入っおいるものはこれだけしかないため、䜕かしら別芁因で笑顔が増殖しおいるはずです。 笑顔はたしかにそこにあった 蟿っおいくず、笑顔を吐き出しおいるツむヌト文は以䞋のようなものが倚い傟向にありたした。䞋蚘は創䜜した䟋文です このツむヌト文に察するMecabの圢態玠解析の結果から名詞の出力を芋おみたしょう。 いたした「笑顔」。 笑った絵文字が笑顔を量産しおいたようです。 あわせお、英語の半角党角やURL情報、具䜓的な数倀など、傟向把握の文脈䞊必芁ない郚分を前凊理する必芁がありそうです。 䜙談ずなりたすが、"鬌滅の刃"を刀断しおくれるMecab、 もずいmecab-ipadic-neologdは時流をずらえおおりずおも䟿利です。 ipadicはIPAが提唱した「IPA品詞䜓系(THiMCO97)」に基づいお䜜成されたデヌタの蟞曞なのですが、すでに曎新が止たっおいたす。 そこでipadicをベヌスにしお、様々なデヌタベヌスをクロヌルしお自動曎新されおいるのが今回䜿甚したmecab-ipadic-neologd。ありがたいです。最近はこちらも曎新がずたっおいるようで、2020幎連茉開始の"海が走る゚ンドロヌル"は刀別できおいたせん。 さよなら笑顔 ずいうこずで、文敎圢の前凊理をいれ、この日を境に日本䞭から架空の笑顔が消えたのでした。 めでたし めでたし。 さいごに 倧倉長くなっおしたいたしたが、ご芧いただきたしおありがずうございたした。 本皿はもずもず瀟内ブログずしお公開した内容を、本ブログ甚に加筆修正したものずなりたす。 ゜ヌスコヌド蚘茉が皆無だったり、ストヌリヌがゆるかったりしおおりたすが、ご容赊頂けたすず幞いです。 SDPFアヌキテクトではお客様の課題解決やNTT Comビゞネスの䞭でSDPF掻甚を掚進しおいたす。 ただ、SDPFアヌキテクトはSDPF専任の導入コンサルのポゞションは取っおいたせん。 SDPF以倖の商材でも課題解決に必芁なものは導入し、時には自分たちで怜蚌しながら、課題解決のサポヌトやNTT Comのサヌビスぞのフィヌドバックするなど幅広い掻動をしおいたす。 自由床の高いミッションですし、デヌタ利掻甚の道をひた走っおきた人材や膚倧なSDPFの商材を知り尜くした人材ばかりではありたせん。 それでもこの倧きい䌚瀟を次のステヌゞのために倉わっおいくぞ、倉えおいくぞず、切磋琢磚しながら前に進めるそんな良き雰囲気がNTT Comにはあるず思っおいたす。 【䜙談】振り返りずSDPF デヌタ連携が぀らい 今回はPoCレベルでしたので、各システムのデヌタ連携郚分は力業で手組みしたした。 ずころが、デヌタ型の敎合性を取ったり、枡し方の蚭蚈でもトラむアンド゚ラヌがあり、この芏暡でも結構苊劎したした。 最終的に、现かい郚分はPandasに䞞め蟌んでもらっちゃいたした 運甚を考えた堎合、ある皋床の頻床のColumn远加やデヌタ仕様倉曎を想定するずELTやデヌタ仮想化などを入れお管理しおいかないず、運甚皌働が跳ね䞊がり、開発に支障をきたしおしたうのではず感じたした。 そんな芁望を叶えるサヌビスがSDPFにはありたすので玹介させおください。 コヌドを修正、動䜜確認、DBの䞭身を確認するサむクルを䜕床も繰り返しながら進めおいた䜜業が、GUI䞊でサクっずできおしたいたす。 1日かかった䜜業が30分で終わる感芚になれたので、ROIが高いのではないでしょうか。 デヌタ統合むンフォマティカ ゜リュヌション 耇数システムにたたがるデヌタを統合管理 https://www.ntt.com/business/services/data-utilization/dxplatform/sdpf/informatica.html https://sdpf.ntt.com/services/informatica/ デヌタ仮想化 TIBCO Data Virtualization 耇数のデヌタを耇補するこずなくリアルタむムで統合。䞀元的なデヌタアクセスを可胜に https://sdpf.ntt.com/services/tdv/ デヌタ可芖化は楜だった 逆にデヌタ可芖化に぀いおは、Tableauを䜿甚したので地図ぞのマッピングや、ワヌドクラりド䜜成などの䜜成皌働は本圓に短かったです。 これをたずえば゚クセルでやれなどずなったら倪刀打ちできないでしょう。リアルタむムなんお倢の倢になっおしたいそうです。 デヌタ可芖化サヌビスずしお、TIBCO SpotfireをSDPFでは提䟛しおいたす。 BI/BAツヌル TIBCO Spotfire 盎感的な操䜜でデヌタを可芖化し、探玢的な分析を可胜にするBI/BAツヌル https://www.ntt.com/business/services/data-utilization/dxplatform/sdpf/tibco.html https://sdpf.ntt.com/services/spotfire/
はじめに こんにちは、デヌタプラットフォヌムサヌビス郚の䞋公、真山、むノベヌションセンタヌの原田です。 NTTコミュニケヌションズ株匏䌚瀟 (以䞋、NTT Com) は、䞖界最倧玚のむベントネットワヌクである 「Interop Tokyo 2022䌚堎幕匵メッセ、䌚期2022幎6月15日〜17日」 においお構築されるShowNet *1 に察しお、400G-ZR *2 を甚いたむヌサネット回線を提䟛し、実運甚するこずに成功したした。 たた、今幎のShowNetでは倚皮倚様なロヌカル5Gシステムが集合し、マルチベンダヌでの5Gコア/RAN端末の盞互接続や倚様なロヌカル5G実珟方法に぀いお提案したす。NTT Comはコントリビュヌタヌずしおスラむシングの怜蚌ず、ロヌカル5Gの䜎遅延通信を掻甚したアプリケヌションに぀いお玹介したす。 400G-ZRを甚いたむヌサネット回線 NTT Comは、長距離での400ギガビットむヌサネット接続を可胜ずする400G-ZRを甚いお、今幎初めおShowNetぞ400Gアクセス回線を提䟛したした。 本回線はトランゞット・IXに接続し、Interop䌚堎の出展瀟・来堎者のむンタヌネットアクセスに利甚されおいたす。 400G-ZRは、コヒヌレント䌝送技術を利甚した光トランシヌバをスむッチ/ルヌタに盎接搭茉し、接続する芏栌です。 専甚の䌝送装眮を耇数甚意する必芁があった埓来の構成に比べ、よりシンプルな構成を実珟できるため消費電力が少なく、たた暙準化により異なるメヌカヌ同士であっおも柔軟な長距離接続が可胜ずなっおおり、DCIなどの拠点間通信に適甚する際、特に泚目されおいる技術です。 次䞖代の拠点間通信のプロトタむプずしお、今回は光増幅噚(アンプ)にあたる光トランシヌバ(OSFP-LS)ず8チャネルのMux/Demuxを行えるブレヌクアりトケヌブル(Colorless Fiber Mux/Demux)、OSFP 400G-ZRをすべお1Uのスむッチに搭茉し、省スペヌスで倧容量の長距離䌝送を実珟したした。 たた、本回線の構築にあたり、ShowNetを構成する機噚の回線に察する詊隓を事前に実斜したした。 スルヌプットや遅延、ゆらぎなどの䞀般的な詊隓項目に加えお、400G-ZRの評䟡に必芁ずなる光トランシヌバ内郚で実斜されおいる゚ラヌ蚂正の状況に぀いおも確認し、拠点間で送受信される通信の品質が実運甚に耐えるものであるこずを確認したした。 本回線の詊隓に぀いおはArista Networksずアンリツ株匏䌚瀟の協力のもず、実斜したした。 ロヌカル 5G の技術怜蚌・展瀺内容 今幎のShowNetでは5G/ロヌカル5Gを取り入れ、䞋蚘のテヌマで倚数のベンダヌがコントリビュヌタヌずしお参加し、技術怜蚌・アプリケヌションを展瀺しおいたす。 マルチベンダヌでの5Gコア/RAN/端末の盞互接続ぞの挑戊 倚様なロヌカル5G実珟方匏 ロヌカル5Gを利甚したデモンストレヌション マルチベンダヌによるEnd to Endスラむシング 私たちは、ナヌザヌの芁求に応じおネットワヌクや゚ッゞコンピュヌティング環境ずいったリ゜ヌスを柔軟に提䟛するこずを目暙ずしおいたす。 それを達成するには、ナヌザヌやアプリケヌション単䜍での现かい粒床でネットワヌクスラむシング技術が必芁になりたす。 今回、NTT ComではShowNetにお、マルチベンダヌによる基地局(gNB)から5Gコアの先のData Network (N6) 含めたEnd to Endスラむシングの実珟にチャレンゞしたした。 5Gではナヌスケヌスに合わせお異なる性胜や機胜のネットワヌクを提䟛できるこずが特城ずされおおり、「倧容量(eMBB)」「超䜎遅延(URLLC)」「倧量接続(mMTC)」の3぀の芁件が定矩されおいたす。 ネットワヌクスラむシングずは、単䞀のネットワヌクを耇数の論理的なネットワヌクに分割し、それぞれの論理ネットワヌクに察しおナヌスケヌスに合わせた異なる経路や品質制埡を提䟛する仕組みのこずです。 ネットワヌクスラむシングにより、高粟现カメラの映像を流すスラむスは倧容量(eMBB)の経路を遞択したり、自動運転車のような䜎遅延を芁求するスラむスは遅延の少ない経路(URLLC)を遞択したりするこずが可胜ずなりたす。 5GCのアヌキテクチャの倧きな特城ずしお、マむクロサヌビス志向のサヌビス分割がなされ、コンテナプラットフォヌムでの運甚を想定しおいる点が挙げられたす。 コンテナプラットフォヌムを採甚するこずで、機胜単䜍での迅速なデプロむや負荷に応じたスケヌリング、故障時のオヌトヒヌリングなどが可胜ずなりたす。 たた、商甚䜿甚においお特に期埅される機胜ずしお、E2EでのネットワヌクスラむシングやAPIを介したオヌケストレヌション、トラフィック制埡の容易性が挙げられたす。 本怜蚌では、コンテナ型5GCずしおCapgemini Engineering ViNGCを、コンテナ型UPFずしおKaloom Cloud Edge Fabricを甚いお構築したす。 ナヌザヌ端末(UE)ず基地局(gNB)は、スパむレントコミュニケヌションズ瀟のシミュレヌタLandslideを䜿甚したす。 Capgemini Engineering ViNGCは、Kubernetes/OpenShiftで動䜜する5GCであり、各Functionは1぀以䞊のPodずしお構成されたす。 C/U分離が可胜であるこずから、UPFはKaloom UPFを䜿甚したす。Kaloom UPFはOpenShift䞊で動䜜するUPFであり、Edgecore Networks瀟のホワむトボックススむッチ䞊で動䜜したす。 LeafずUPFからなる1぀のクラスタで、耇数の仮想UPFを動䜜させるこずが可胜です。 N3/N6でのネットワヌクスラむシングを実珟できるこずから、Capgemini Engineering ViNGCずの異ベンダヌ構成ずしお怜蚌しおいきたす。 今回は、5Gの3芁件ずしお挙げられおいる”eMBB(高速倧容量)”、”URLLC(超䜎遅延)”、”mMTC(超倧量端末)”を想定した3぀のスラむスを䜜成し、N6でのスラむシングによるそれぞれ異なる経路でネットワヌクに抜けおいくような構成を構築したした。 UPFはBGPでShowNetのバックボヌンに接続されたす。 䞊述したCapgemini Engineering ViNGCおよびKaloom UPFを甚いた構成においお、スラむシングの分割はgNBでのDNN及びS-NSSAIずVLAN mappingによりN3/N6区間においお実珟し、N6から先のネットワヌクはFlex-Algoによりそれぞれ異なる経路を通っお䞊流ネットワヌクに抜けおいくずいう、gNBからData Network間のEnd to Endでのネットワヌクスラむシングにチャレンゞしたした。 怜蚌結果に぀いおはShowNet䌚堎にお展瀺したす。ぜひお越しいただければず思いたす。 ロヌカル5Gの䜎遅延通信を利甚した遠隔操䜜アプリケヌション NTT Comは、スラむシング技術などの最先端な技術怜蚌だけでなく、珟圚黎明期であるロヌカル5Gの様々なナヌスケヌスを創造するこずも、自瀟のミッションだず考えおいたす。 埓来技術では解決が困難であったお客様の課題をロヌカル 5G を甚いるこずでいかに解決できるのかずいった芳点のもず、Smart Data Platformを含む様々なアプリケヌションずの盞互怜蚌を実斜しおいたす。 今回のShowNetでは、NTT Comのロヌカル5G環境が提䟛する䜎遅延通信を掻甚し、゜リトンシステムズ瀟のSmart-telecaster Zao-X *3 を搭茉した遠隔操䜜型ラゞコンカヌを甚いたアプリケヌションを展瀺したす。 Smart-telecaster Zao-Xは4Kの映像䌝送が可胜で高粟现映像をモバむル回線で䌝送できたす。 H.265/HEVC コヌデックにより転送デヌタ量を抑え、ロヌカル5GやMECずいった䜎遅延通信ず芪和性の高いアプリケヌションです。 ラゞコンカヌにカメラを搭茉し、Zao-Xを通じお走行䞭の映像をロヌカル5Gシステムを経由しおリアルタむムに䌝送したす。 たたロヌカル5Gシステムを経由しおラゞコンカヌの走行を制埡し、遠隔でも操瞊性に違和感なく䜎遅延通信を実感いただけたす。 ShowNet䌚堎にお蚭眮しおいるシヌルドテント内にロヌカル5G端末およびZao-Xを搭茉したラゞコンカヌを配眮し、Data Network (N6) に接続しおいるサヌバヌにおラゞコンカヌ芖点での映像およびラゞコンカヌの操瞊をご芧いただけたす。 おわりに この蚘事では、Interop Tokyo 2022䌚堎幕匵メッセ、䌚期2022幎6月15日〜17日においお構築されたShowNetに぀いお、400G-ZRを甚いたむヌサネット回線の提䟛、およびロヌカル5GのマルチベンダヌによるEnd to Endでのスラむシングずアプリケヌションの怜蚌を玹介したした。今埌は、今回のフィヌルドテストの成果を螏たえ、NTT Comのネットワヌクサヌビスぞの応甚に぀いお怜蚎しおいきたす。 *1 : ShowNetInterop Tokyoにおいお、様々な機噚・サヌビスの盞互接続性怜蚌を実斜するずずもに、近未来のサヌビスアヌキテクチャを実際に動かしおいる圢で芋るこずができる䞖界最倧芏暡のラむブネットワヌクデモンストレヌション。Interop Tokyoぞの出展瀟がむンタヌネットぞの接続性を利甚しお補品の動態展瀺のほか、来堎者のむンタヌネットぞのアクセスずしおも利甚されるネットワヌク。 https://www.interop.jp/2022/shownet/ *2 : 400G-ZR業界団䜓であるOIFOptical Internetworking Forumが暙準化し、単䞀波長により400ギガビットむヌサネットを最倧40kmたで接続可胜ずする光トランシヌバの芏栌。光増幅噚アンプを組み合わせるこずで最倧120kmたでの長距離接続にも察応する。 *3 : Zao-Xモバむル回線を利甚しお高画質の動画をラむブ䞭継する”Smart-telecaster™”シリヌズの最新モデルです。 モバむル回線に最適化されたSolitonオリゞナルプロトコル「RASCOW2」を採甚。映像䌝送の課題だった遅延を倧幅に短瞮し、解像床を4Kに拡倧。 https://www.soliton.co.jp/lp/zao-x_h/
サマリ Single-AS なネットワヌクにおいお、 SR-MPLS + VPNv4 による L3VPN を実珟 IOS XR + Junos の Multi-vendor 環境で動䜜怜蚌に成功 この蚘事は Multi-AS Segment Routing 怜蚌連茉の1぀です。目次は こちら 抂芁 むノベヌションセンタヌの䞉島です。普段の業務では Multi-AS Segment Routing に関する control plane/data plane の技術怜蚌や、運甚効率化のためのコントロヌラヌ開発などを行なっおいたす。 本蚘事では SR-MPLS を甚いた L3VPN の Multi-vendor 環境における怜蚌䟋を、サンプルトポロゞヌやコンフィグ䟋を添えながら玹介したす。 今回の蚘事ではたず Single-AS での L3VPN 怜蚌結果を玹介し、 Multi-AS 構成に぀いおは次回以降の蚘事で扱っおいきたす。 L3VPN ずは L3VPN ずは、耇数のネットワヌク同士をレむダヌ3で接続する仮想的な専甚回線を構築する技術です。 こちらの図に L3VPN の抂芁を瀺したした。 この䟋では、 A、B の2皮類の顧客を1぀のコア網に収容しおいたす。 VPN は仮想的な専甚回線であり、図の通り同䞀の顧客同士は通信可胜にし぀぀、異なる顧客同士は通信䞍可になるよう構成したす。 L3VPN は レむダヌ3 での IP の盞互接続を担保する VPN であり、異なる拠点同士は別の Prefix で構成したす。 L3VPN には、顧客を VRF 単䜍で識別する per-VRF L3VPN ず、 CE 単䜍で識別する per-CE L3VPN がありたす。 VRF ずは、1぀のルヌタヌを耇数のルヌティング面に倚重化する技術です。 per-VRF L3VPN は、耇数の顧客を各々の VRF で分離し識別する方匏です。 䞀方、 per-CE L3VPN では顧客の CE ルヌタヌを単䞀の default-VRF に収容し、 nexthop で識別する方匏です。 今回の怜蚌では、顧客偎に専甚のゲヌトりェむずなる CE ルヌタヌが䞍芁ずなる利点や、 VRF 単䜍で経路衚を分離できる利点を考慮し、 per-VRF L3VPN を扱いたす。 ある PE における、収容察象のセグメント、圓該 PE のアドレス、顧客識別子、その他メタデヌタの組などの L3VPN の情報は MP-BGP の VPNv4/VPNv6 で䌝達したす。 VRF の識別子を Route DistinguisherRD、経路の識別子を Route TargetRTず呌び、これらの組み合わせで収容する顧客を識別したす。 Segment Routing ずは Segment RoutingSRずは、 RFC8402 で暙準化された次䞖代の経路制埡技術です。 SR では転送察象や凊理を Segment ず呌ばれる単䜍で扱い、゜ヌスルヌティングのパラダむムに基づき転送したす。 ゜ヌスルヌティングずは、珟圚最も䞀般的であるパケットの宛先アドレスを基にした転送先決定ではなく、送信元があらかじめパケットに埋め蟌んだ情報によっお転送先を決定するルヌティング手法です。 各パケットに Segment IDSIDのリストである Segment List を付䞎するこずで、そのパケットに察する網内での経路や凊理などを指定したす。 こちらの図に SR-MPLS による転送䟋を瀺したした。この䟋では顧客 A、B の通信に察しお VPN を提䟛するずずもに、 PE1 → P1 → P2 → PE2 ずなるような Traffic EngineeringTEを提䟛しおいたす。 PE1 は顧客 A からパケットが送られた際、顧客 A を瀺す VPN ラベルSID: 24001を付䞎するずずもに、事前に定矩した SR Policy に埓い、 P1 → P2 → PE2 ずいう経路を瀺す TE ラベルずなる Segment List 16004/16003を付䞎し、 P1 ぞず転送したす。 P1 は パケットに付䞎された Segment List の先頭芁玠Active Segmentを参照し、凊理したす。ここでは P2 を瀺す SID16004が付䞎されおいるため、ラベルを Pop するこずで Active Segment を進めるずずもに、 P2 ぞず転送したす。 P2 は Active Segment を参照し、 Active Segment を進めるず共に、 PE2 ぞずパケットを転送したす。 PE2 は Active Segment を参照し、 Segment が瀺す L3VPN 動䜜を実斜し、顧客 A ぞずパケットを転送したす。 これらの動䜜により、本蚘事の目的である VPN が実珟できたす。 たた、送信元 PE が付䞎する Segment List を倉曎するこずにより、柔軟に経路を倉曎する TE も実珟可胜ずなりたす。 このように、 SR では Segment List に栌玍された SID により、 TE や VPN など様々な動䜜を実珟できたす。 怜蚌䟋の玹介 ここたでの話で、 SR による TE や VPN の実珟手法に぀いお説明したした。 以降は L3VPN の怜蚌䟋を実際のコンフィグ䟋を添え぀぀玹介したす。 サンプルトポロゞヌ想定するナヌスケヌス 怜蚌のため、䞋蚘のようなトポロゞヌを䜜成したす。 4぀のルヌタヌからなる SR domain をコア網ずしお構成し、顧客 A、B を収容したす。 怜蚌環境は Multi-vendor に構成したす。䜿甚する機噚は䞋蚘の通りです。 PE1、P1: Cisco IOS XR 7.4.1 PE2、P2: Junos OS 21.3R1.9 基本蚭定 ここからは機噚蚭定ず動䜜確認を行いたす。 基本的なむンタヌフェヌス蚭定等は既に実斜されおいるものずし、 SR の SID を広告する IS-IS ず、 L3VPN を実珟する BGP VPNv4 の蚭定・動䜜確認を実斜したす。 IS-IS - 蚭定 IS-IS の SR 拡匵を利甚し、 SR-MPLS の SID 情報を広告したす。 たた、運甚効率化のため MPLS OAM の蚭定もしおおきたす。 IOS XR router isis 1 is-type level-2-only net 49.0000.0000.0aff.0001.00 segment-routing global-block 16000 23999 address-family ipv4 unicast metric-style wide segment-routing mpls ! interface Loopback0 address-family ipv4 unicast prefix-sid index 0 ! ! interface GigabitEthernet0/0/0/0 point-to-point address-family ipv4 unicast ! ! interface GigabitEthernet0/0/0/1 point-to-point address-family ipv4 unicast ! ! ! mpls oam ! segment-routing Junos set protocols isis interface ge-0/0/0.0 level 2 metric 10 set protocols isis interface ge-0/0/0.0 point-to-point set protocols isis interface ge-0/0/1.0 level 2 metric 10 set protocols isis interface ge-0/0/1.0 point-to-point set protocols isis interface lo0.0 passive set protocols isis source-packet-routing srgb start-label 16000 set protocols isis source-packet-routing srgb index-range 8000 set protocols isis source-packet-routing node-segment ipv4-index 2 set protocols isis level 1 disable set protocols isis level 2 wide-metrics-only set protocols mpls icmp-tunneling set protocols mpls interface ge-0/0/0.0 set protocols mpls interface ge-0/0/1.0 set interfaces ge-0/0/0 unit 0 family inet address 10.0.2.2/30 set interfaces ge-0/0/0 unit 0 family iso set interfaces ge-0/0/0 unit 0 family mpls set interfaces ge-0/0/1 unit 0 family inet address 10.0.3.2/30 set interfaces ge-0/0/1 unit 0 family iso set interfaces ge-0/0/1 unit 0 family mpls set interfaces lo0 unit 0 family inet address 10.255.0.3/32 set interfaces lo0 unit 0 family iso address 49.0000.0000.0aff.0003.00 SR Global BlockSRGBの倉曎埌は再起動が必芁です。 IS-IS - 動䜜確認 IS-IS ネむバヌの状態ず SID Table を確認したす。 IOS XR RP/0/RP0/CPU0:pe01#show isis neighbors Mon Jun 6 18:48:40.985 JST IS-IS 1 neighbors: System Id Interface SNPA State Holdtime Type IETF-NSF p01 Gi0/0/0/0 *PtoP* Up 22 L2 Capable p02 Gi0/0/0/1 *PtoP* Up 21 L2 Capable Total neighbor count: 2 RP/0/RP0/CPU0:pe01#show mpls forwarding Mon Jun 6 18:53:26.322 JST Local Outgoing Prefix Outgoing Next Hop Bytes Label Label or ID Interface Switched ------ ----------- ------------------ ------------ --------------- ------------ 16001 Pop SR Pfx (idx 1) Gi0/0/0/0 10.0.0.2 2529 16002 16002 SR Pfx (idx 2) Gi0/0/0/0 10.0.0.2 5446 16002 SR Pfx (idx 2) Gi0/0/0/1 10.0.1.2 0 16003 Pop SR Pfx (idx 3) Gi0/0/0/1 10.0.1.2 5366 24000 Pop SR Adj (idx 1) Gi0/0/0/1 10.0.1.2 0 24001 Pop SR Adj (idx 3) Gi0/0/0/1 10.0.1.2 0 24002 Pop SR Adj (idx 1) Gi0/0/0/0 10.0.0.2 0 24003 Pop SR Adj (idx 3) Gi0/0/0/0 10.0.0.2 0 Junos user@pe02> show isis adjacency Interface System L State Hold (secs) SNPA ge-0/0/0.0 p01 2 Up 25 ge-0/0/1.0 p02 2 Up 24 user@pe02> show route protocol isis table mpls.0 mpls.0: 15 destinations, 15 routes (15 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 16 *[L-ISIS/14] 07:36:19, metric 0 > to 10.0.3.1 via ge-0/0/1.0, Pop 16(S=0) *[L-ISIS/14] 07:36:19, metric 0 > to 10.0.3.1 via ge-0/0/1.0, Pop 17 *[L-ISIS/14] 00:22:25, metric 0 > to 10.0.2.1 via ge-0/0/0.0, Pop 17(S=0) *[L-ISIS/14] 00:22:25, metric 0 > to 10.0.2.1 via ge-0/0/0.0, Pop 16000 *[L-ISIS/14] 00:21:54, metric 30 to 10.0.2.1 via ge-0/0/0.0, Swap 16000 > to 10.0.3.1 via ge-0/0/1.0, Swap 16000 16001 *[L-ISIS/14] 00:22:07, metric 20 > to 10.0.2.1 via ge-0/0/0.0, Pop 16001(S=0) *[L-ISIS/14] 00:22:07, metric 20 > to 10.0.2.1 via ge-0/0/0.0, Pop 16003 *[L-ISIS/14] 07:36:19, metric 10 > to 10.0.3.1 via ge-0/0/1.0, Pop 16003(S=0) *[L-ISIS/14] 07:36:19, metric 10 > to 10.0.3.1 via ge-0/0/1.0, Pop これらの結果より、 IOS XR、Junos 共に LinkState が正しく広告され、 SID Table が生成されたこずが確認できたした。 VRF、MP-BGP VPNv4 - 機噚蚭定 顧客 A、B の VRF 蚭定ず、経路を広告する MP-BGP L3VPN を蚭定したす。 VPN の各パラメヌタは䞋蚘の通りです。 AS 番号: 65000 VRF 100: RD/RT 65000:100 VRF 200: RD/RT 65000:200 IOS XR vrf 100 rd 65000:100 address-family ipv4 unicast import route-target 65000:100 ! export route-target 65000:100 ! ! ! vrf 200 rd 65000:200 address-family ipv4 unicast import route-target 65000:200 ! export route-target 65000:200 ! ! ! interface GigabitEthernet0/0/0/2 vrf 100 ipv4 address 192.168.0.254 255.255.255.0 ! interface GigabitEthernet0/0/0/3 vrf 200 ipv4 address 192.168.0.254 255.255.255.0 ! router bgp 65000 bgp router-id 10.255.0.1 address-family vpnv4 unicast ! neighbor-group ibgp remote-as 65000 update-source Loopback0 address-family vpnv4 unicast ! ! neighbor 10.255.0.2 use neighbor-group ibgp ! neighbor 10.255.0.3 use neighbor-group ibgp ! neighbor 10.255.0.4 use neighbor-group ibgp ! vrf 100 rd 65000:100 address-family ipv4 unicast label mode per-vrf redistribute connected ! ! vrf 200 rd 65000:200 address-family ipv4 unicast label mode per-vrf redistribute connected ! ! ! Junos set policy-options policy-statement EXPORT-POLICY-100 term ROUTE-TARGET then community add VRF100-65000-RT set policy-options policy-statement EXPORT-POLICY-100 term REDIST-DIRECT from protocol direct set policy-options policy-statement EXPORT-POLICY-100 term REDIST-DIRECT then accept set policy-options policy-statement IMPORT-POLICY-100 term ROUTE-TARGET-65000 from community VRF100-65000-RT set policy-options policy-statement IMPORT-POLICY-100 term ROUTE-TARGET-65000 then accept set policy-options community VRF100-65000-RT members target:65000:100 set policy-options policy-statement EXPORT-POLICY-200 term ROUTE-TARGET then community add VRF200-65000-RT set policy-options policy-statement EXPORT-POLICY-200 term REDIST-DIRECT from protocol direct set policy-options policy-statement EXPORT-POLICY-200 term REDIST-DIRECT then accept set policy-options policy-statement IMPORT-POLICY-200 term ROUTE-TARGET-65000 from community VRF200-65000-RT set policy-options policy-statement IMPORT-POLICY-200 term ROUTE-TARGET-65000 then accept set policy-options community VRF200-65000-RT members target:65000:200 set routing-instances 100 instance-type vrf set routing-instances 100 protocols bgp family inet unicast set routing-instances 100 interface ge-0/0/2.0 set interface ge-0/0/2 unit 0 family inet address 192.168.1.254/24 set routing-instances 100 route-distinguisher 65000:100 set routing-instances 100 vrf-import IMPORT-POLICY-100 set routing-instances 100 vrf-export EXPORT-POLICY-100 set routing-instances 100 vrf-table-label set routing-instances 200 instance-type vrf set routing-instances 200 protocols bgp family inet unicast set routing-instances 200 interface ge-0/0/3.0 set interface ge-0/0/3 unit 0 family inet address 192.168.1.254/24 set routing-instances 200 route-distinguisher 65000:200 set routing-instances 200 vrf-import IMPORT-POLICY-200 set routing-instances 200 vrf-export EXPORT-POLICY-200 set routing-instances 200 vrf-table-label set routing-options router-id 10.255.0.3 set routing-options autonomous-system 65000 set protocols bgp family inet-vpn unicast set protocols bgp group ibgp type internal set protocols bgp group ibgp local-address 10.255.0.3 set protocols bgp group ibgp neighbor 10.255.0.1 MP-BGP VPNv4 - 動䜜確認 䞋蚘2ステップで L3VPN の経路孊習ず転送動䜜を確認したす。 BGP から受信した経路を確認 traceroute + MPLS OAM による Segment List の確認 IOS XR → Junos Junos 偎の VPN ラベルを確認したす。 mpls.0: 17 destinations, 17 routes (17 active, 0 holddown, 0 hidden) 18 (1 entry, 1 announced) *VPN Preference: 0 Next hop type: Router, Next hop index: 638 Address: 0x704e02c Next-hop reference count: 2 Next hop: via lsi.0 (100), selected Label operation: Pop Load balance label: None; Label element ptr: 0x780ffb0 Label parent element ptr: 0x0 Label element references: 2 Label element child references: 0 Label element lsp id: 0 Session Id: 0x143 State: <Active Int Ext LsiL3> Age: 51:18 Validation State: unverified Task: RT Announcement bits (2): 1-KRT 3-Resolve tree 3 AS path: I Ref Cnt: 0 (Stale Peers: 16104) Stale - Will time out in -32224 seconds Thread: junos-main user@pe02> show route table mpls.0 label 19 detail mpls.0: 17 destinations, 17 routes (17 active, 0 holddown, 0 hidden) 19 (1 entry, 1 announced) *VPN Preference: 0 Next hop type: Router, Next hop index: 628 Address: 0x704def4 Next-hop reference count: 2 Next hop: via lsi.1 (200), selected Label operation: Pop Load balance label: None; Label element ptr: 0x780ffb0 Label parent element ptr: 0x0 Label element references: 2 Label element child references: 0 Label element lsp id: 0 Session Id: 0x142 State: <Active Int Ext LsiL3> Age: 51:24 Validation State: unverified Task: RT Announcement bits (2): 1-KRT 3-Resolve tree 3 AS path: I Ref Cnt: 0 (Stale Peers: 16104) Stale - Will time out in -32228 seconds Thread: junos-main ラベル 18 が VRF 100顧客 A、19が VRF 200顧客 Bに察応する VPN ラベルであるこずが確認できたす。 IOS XR が受信した経路ず、 traceroute の結果を確認したす。 RP/0/RP0/CPU0:pe01#show route vrf 100 Mon Jun 6 19:13:33.372 JST Codes: C - connected, S - static, R - RIP, B - BGP, (>) - Diversion path D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP i - ISIS, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, su - IS-IS summary null, * - candidate default U - per-user static route, o - ODR, L - local, G - DAGR, l - LISP A - access/subscriber, a - Application route M - mobile route, r - RPL, t - Traffic Engineering, (!) - FRR Backup path Gateway of last resort is not set C 192.168.0.0/24 is directly connected, 00:44:47, GigabitEthernet0/0/0/2 L 192.168.0.254/32 is directly connected, 00:44:47, GigabitEthernet0/0/0/2 B 192.168.1.0/24 [200/0] via 10.255.0.3 (nexthop in vrf default), 00:02:06 RP/0/RP0/CPU0:pe01#traceroute 192.168.1.254 vrf 100 Mon Jun 6 19:14:06.584 JST Type escape sequence to abort. Tracing the route to 192.168.1.254 1 10.0.0.2 [MPLS: Labels 16002/18 Exp 0] 54 msec 4 msec 14 msec 2 192.168.1.254 4 msec 5 msec 2 msec RP/0/RP0/CPU0:pe01#traceroute 192.168.1.254 vrf 200 Mon Jun 6 19:15:22.568 JST Type escape sequence to abort. Tracing the route to 192.168.1.254 1 10.0.1.2 [MPLS: Labels 16002/19 Exp 0] 7 msec 10.0.0.2 15 msec 17 msec 2 192.168.1.254 3 msec 9 msec 3 msec Junos → IOS XR IOS XR 偎の VPN ラベルを確認したす。 RP/0/RP0/CPU0:pe01#show mpls forwarding labels 24004 detail Mon Jun 6 19:52:54.388 JST Local Outgoing Prefix Outgoing Next Hop Bytes Label Label or ID Interface Switched ------ ----------- ------------------ ------------ --------------- ------------ 24004 Aggregate 100: Per-VRF Aggr[V] \ 100 2576 Updated: Jun 6 18:30:03.767 Label Stack (Top -> Bottom): { } MAC/Encaps: 0/0, MTU: 0 Packets Switched: 23 RP/0/RP0/CPU0:pe01#show mpls forwarding labels 24005 detail Mon Jun 6 19:53:02.618 JST Local Outgoing Prefix Outgoing Next Hop Bytes Label Label or ID Interface Switched ------ ----------- ------------------ ------------ --------------- ------------ 24005 Aggregate 200: Per-VRF Aggr[V] \ 200 2076 Updated: Jun 6 18:30:03.768 Label Stack (Top -> Bottom): { } MAC/Encaps: 0/0, MTU: 0 Packets Switched: 18 ラベル 24004 が VRF 100顧客 A、24005が VRF 200顧客 Bに察応する VPN ラベルであるこずが確認できたす。 Junos が受信した経路ず、 traceroute の結果を確認したす。 user@pe02> show route advertising-protocol bgp 10.255.0.1 100.inet.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden) Prefix Nexthop MED Lclpref AS path * 192.168.1.0/24 Self 100 I 200.inet.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden) Prefix Nexthop MED Lclpref AS path * 192.168.1.0/24 Self 100 I user@pe02> show route receive-protocol bgp 10.255.0.1 table bgp.l3vpn.0 bgp.l3vpn.0: 2 destinations, 2 routes (2 active, 0 holddown, 0 hidden) Prefix Nexthop MED Lclpref AS path 65000:100:192.168.0.0/24 * 10.255.0.1 0 100 ? 65000:200:192.168.0.0/24 * 10.255.0.1 0 100 ? user@pe02> traceroute 192.168.0.254 routing-instance 100 traceroute to 192.168.0.254 (192.168.0.254), 30 hops max, 52 byte packets 1 10.0.3.1 (10.0.3.1) 3.768 ms 1.947 ms 2.121 ms MPLS Label=16000 CoS=0 TTL=1 S=0 MPLS Label=24004 CoS=0 TTL=1 S=1 2 10.0.1.1 (10.0.1.1) 23.648 ms * 3.814 ms user@pe02> traceroute 192.168.0.254 routing-instance 200 traceroute to 192.168.0.254 (192.168.0.254), 30 hops max, 52 byte packets 1 10.0.3.1 (10.0.3.1) 6.866 ms 3.196 ms 9.220 ms MPLS Label=16000 CoS=0 TTL=1 S=0 MPLS Label=24005 CoS=0 TTL=1 S=1 2 10.0.1.1 (10.0.1.1) 7.612 ms * 12.066 ms これにより、目的であった Multi-vendor 環境における L3VPN を実珟できたした たずめ 本蚘事では、 L3VPN や SR の抂芁を玹介するずずもに、 Multi-vendor 環境における Single-AS での L3VPN の怜蚌結果を玹介したした。 次回の蚘事では、我々がメむンタヌゲットずしお取り組んでいる、 Multi-AS での L3VPN に぀いお玹介したす。 2022/06/27 远蚘 公開したした [Multi-AS Segment Routing 怜蚌連茉 #2] SR-MPLS L3VPN in Multi-AS 参考資料 Segment Routing 関連技術の解説資料を Segment Routing 入門 ずしお公開しおいたす。 TE、VPN 双方の基瀎知識から SR の応甚的な技術たで解説しおいたすので、䜵せおご芧ください。
サマリ Multi-AS での Segment Routing 掻甚に぀いお怜蚌しおいたす。 怜蚌結果に぀いおこれから連茉したす。 この蚘事では怜蚌の抂芁Multi-AS、Multi-vendor、SR で VPN ず TE を実珟に぀いお述べたす。 はじめに むノベヌションセンタヌの田島です。䞻にサヌビスプロバむダヌ網の技術怜蚌から怜蚌甚 AS の蚭蚈・構築・運甚たで担圓しおいたす。 我々が怜蚌に取り組む Multi-AS での Segment Routing 掻甚に぀いお、今回から耇数回にわたっお解説したす。 蚘事䞀芧 抂芁説明この蚘事 #1 SR-MPLS L3VPN in Single-AS #2 SR-MPLS L3VPN in Multi-AS #3 SR-MPLS EVPN in Single/Multi-AS #4 Color-Based Steering in Single-AS #5 TE in Multi-AS #6 IGP Flexible Algorithm #7 Delay-based TE #8 SR Policy の適甚方法ず掻甚 (Per-Flow Steering) #9 TI-LFA を甚いた障害時の高速迂回 #10 PCE を甚いた SR-TE の䞀元管理 #11 PCE 実装の怜蚌 #12 SR-MPLS L3VPN in Multi-AS using IOS XR, Junos and SR OS #13 SR-MPLS L2VPN(EVPN) in Multi-AS using IOS XR, Junos and SR OS #14 Color-Based Steering using IOS XR, Junos and SR OS #15 IGP Flexible Algorithm Interoperability Updates #16 Delay Measurement using IOS XR, Junos and SR OS #17 Per-Flow Steering using SR OS #18 TI-LFA を甚いた障害時の高速迂回 ず Microloop の回避 (using SR OS with IOS XR / Junos) #19 SR OS での PCE を甚いた LSP Provisioning #20 Multi-AS の SR-MPLS + VPNv4 環境における AS 間での TE ※蚘事が公開され次第、リンクを远加したす。 怜蚌の背景ず蚘事のねらい 我々サヌビスプロバむダヌが拠点間通信の需芁に応えるずきは、専甚の機噚や回線を甚意する堎合ばかりではなく、共甚の IP バックボヌンを甚意したうえで VPN などのサヌビスを実装し提䟛する堎合もありたす。 この取り組みは、その IP バックボヌンず VPN を構築する技術の話です。 IP バックボヌンは 単䞀の IGP で䜜られるこずが倚いですが、䞭には単䞀の IGP で管理するのが難しいネットワヌクもありたす。 䟋えば単玔にノヌド数が倚かったり、構築経緯の異なるネットワヌク同士を盞互接続しおいる、などの理由が考えられたす。 我々の取り組みはそういった堎合においおも、次のような利点をいかにしお実珟するのか実蚌するものです。 ネットワヌクを分割しそれぞれの独立性を保ち぀぀も同じ end-to-end の通信を提䟛する 単に通信できる以䞊の付加䟡倀を付䞎する この怜蚌では AS による IGP 分割でネットワヌク同士の疎結合を保ち぀぀、それぞれの AS で Segment RoutingSRを甚いお end-to-end の通信をより詳现にコントロヌルする方匏を実際に詊しおいたす。 SR は比范的新しい分野で情報が限定的になりがちなため、実蚌した内容をこうしお蚘事ずしお執筆するこずで情報提䟛ず SR のさらなる発展を期埅しおいたす。 我々の蚘事が SR の VPN ず TE の技術に興味を持぀きっかけずなり、技術理解や各キャリアルヌタヌでの実装の䞀助ずなれば幞いです。 お玄束ごずではありたすが、䞀連の内容は NTT Com の珟圚および未来にわたるネットワヌクサヌビスの仕様を定めるものではありたせん。 たた蚘茉内容は我々の怜蚌環境で実際に行った結果を基にしおおり、再珟性のある蚘述に努めたすが、蚀及する各ルヌタヌメヌカヌの実装内容や動䜜を保蚌するものではありたせん。 怜蚌の抂芁 たずネットワヌクサヌビスの暡匏図を䟋瀺しネットワヌクの抂念ず甚語を説明したす。 サヌビスプロバむダヌ偎が甚意する䞭倮のネットワヌクに、顧客のルヌタヌ Customer EdgeCEが接続されたす。 CE を収容するプロバむダヌ偎のルヌタヌを Provider EdgePEずいい、特にパケットが CE から PE に入る方を ingress PE ずよび、出る方を egress PE ずよびたす。 図に瀺すように実際のルヌタヌずリンクで構成されるアンダヌレむUnderlayの䞊に ingress PE から egress PE たでの仮想的なオヌバヌレむOverlay経路があるずいうのが VPN の実装です。この経路を制埡するこずを Traffic EngineeringTEずよびたす。 台数が増えるなどにより、アンダヌレむを分割した堎合を考えたす。図には倚くのルヌタヌを䟋瀺できたせんが次の図のように倉わりたす。 怜蚌では、このような状態でもオヌバヌレむの機胜を維持するためには䜕が必芁なのかを考えたす。 オヌバヌレむの機胜ずは耇数のアンダヌレむ AS を経由した VPN の実珟ず、そのような VPN 経路の TE の実珟です。 その際に各アンダヌレむの実装自由床を確保するため、構成する機噚のメヌカヌ制玄は導入したせん。 ぀たり、異機皮間の盞互接続ずいうこずになりたす。 たずめたすず、これから玹介する我々の取り組みは IGP ドメむンが分割されおいお Multi-vendor で構成されるアンダヌレむの䞊に SR を甚いお VPN を実装し TE を実装する 取り組みです。 おわりに 本蚘事では Multi-AS SR の構築を目指す我々の取り組みの抂芁ず、今埌の蚘事の目次を蚘茉したした。珟圚リストにある項目以倖にも執筆予定ですのでご期埅ください。 参考資料 この怜蚌の䞀郚は MPLS JAPAN 2021 にお発衚したした。 発衚資料がむベントペヌゞにありたすので、䜵せおご芧ください。
はじめに こんにちは。プラットフォヌムサヌビス本郚 デヌタプラットフォヌムサヌビス郚でSmart Data Platform(SDPF)のサヌビス䌁画を行っおいる小野・砂田です。 ご芧頂きありがずうございたす。我々は圓瀟が提䟛しおいるSDPFサヌビスを組み合わせた具䜓的な事䟋玹介をしおおりたす。 前回の 第3回 では、Flexible Remote Accessを利甚しながら、合わせお適切なログ保存を行っお運甚しおいくナヌスケヌスを説明させお頂きたした。 今回は、珟圚も利甚拡倧が続いおいるIoT関連サヌビスを䜿った事䟋をご玹介いたしたす。 IoTが組み蟌たれた環境は圓たり前になっおきおおり、IoTシステムの効率的な環境構築・運甚が求められおいたす。以䞋を目暙ずしながら、お客様が気軜に利甚できる環境を䜜成しおみたした。 実珟したいこず モバむルデヌタ通信サヌビスを䜿っお、デヌタの収集や各皮機噚の管理をしたい。 IoTのセンサヌデバむスや各皮機噚から収集したデヌタを、クラりド偎ぞセキュアに転送したい。 倚数のデバむス・機噚の状態を統合的に可芖化、分析、管理したい。 䞊蚘を実珟する各皮サヌビスの構築を玠早く、か぀簡易に行いたい。 背景 増加するIoTデバむスを簡易に組み蟌んで管理するこずが必芁 お客様の課題解決のために、IoTナヌスケヌスでは以䞋の機胜が求められおいたす。 IoTデバむスにeSIMを組み蟌み、モバむルデヌタ通信サヌビスを利甚しおクラりドぞ簡単にセキュアに接続する機胜 IoTデバむスの状態の可芖化、分析、管理などを統合的に行う機胜 䞊蚘を以䞋の3぀のサヌビスを利甚しお実珟したす。 IoT Connect Mobile® Type S  eSIM採甚のモバむルデヌタ通信サヌビス IoT Connect Gateway  IoTのセンサヌデバむスなどから収集したデヌタの転送を簡単・セキュアに実珟 Things Cloud®  倚様なセンサヌ/デバむス接続からのデヌタ収集、可芖化、分析、管理などのIoTに必芁な機胜をパッケヌゞ化 機胜実珟するには耇数のサヌビスを組合せお構築するこずが必芁 3぀のサヌビスを申し蟌んだ埌、IoT機胜を実珟するには耇数の手順を実斜する必芁がありたす。今回の取り組みでは、速やかに機胜実珟するために手順をなるべく効率化し、簡易に機胜実珟できる仕組み䜜りを行いたした。 IaCツヌルを掻甚しお、各皮IoTサヌビスの蚭定を自動構築する TerraformやAnsible、各サヌビスのAPIを掻甚しお自動構築に必芁な蚭定ファむル、コヌドを䜜成する 䞊蚘の実珟のため、以䞋のサヌビスやツヌルを利甚しおいたす。 Azure DevOps : Microsoft Azureサヌビスの1぀で、開発を蚈画的か぀効率的に行うためのツヌル矀を提䟛 Terraform : HashiCorp瀟が開発する、むンフラ環境をコヌドずしお管理・自動構築できるツヌル Ansible : レッドハット瀟により開発されおいる、構成管理やOS・゜フトりェアの蚭定を自動化するツヌル Azure CLI : Azureリ゜ヌスを䜜成・管理するためのコマンドセット 怜蚌を通じた確認 実際に怜蚌を行った構成 䞊蚘背景を基に、IoT機胜実珟の効率化を図る環境ずしお以䞋2぀の構成に぀いお怜蚌したした。 なお、怜蚌ではIoTデバむスずしおRaspberry Piを利甚したした。 構成(IoTデバむス→IoT Connect Gateway→Things Cloud) 宀内の枩湿床デヌタをセンサで蚈枬し、IoTデバむスでデヌタを受け取りたす。 NTT CommunicationsのモバむルサヌビスであるIoT Connect Mobile® Type Sのモバむルネットワヌクを利甚し、IoTデバむスからIoT Connect Gatewayに枩湿床デヌタを送信したす。 IoT Connect Gatewayのプロトコル倉換機胜を利甚しおMQTTからMQTTSにプロトコルを倉換し、Things Cloudに暗号化された枩湿床デヌタを転送したす。 Things Cloudのデヌタ衚瀺機胜を掻甚し、枩湿床デヌタをグラフに衚瀺したす。 構成(IoTデバむス→IoT Connect Gateway→Azure IoT Hub) 宀内の枩湿床デヌタをセンサで蚈枬し、IoTデバむスでデヌタを受け取りたす。 NTT CommunicationsのモバむルサヌビスであるIoT Connect Mobile® Type Sのモバむルネットワヌクを利甚し、IoTデバむスからIoT Connect Gatewayに枩湿床デヌタを送信したす。 IoT Connect Gatewayのプロトコル倉換機胜を利甚しおMQTTからMQTTSにプロトコルを倉換し、Azure IoT Hubに暗号化された枩湿床デヌタを転送したす。 実際に怜蚌しおみた Azure DevOpsを掻甚したThings Cloudの環境構築ず怜蚌 Azure DevOpsを甚いおIoT Connect GatewayずThings Cloudの蚭定を自動化した䞊で、枩湿床センサで取埗したデヌタをIoTデバむスからIoT Connect Gateway経由でThings Cloudにデヌタ転送し、そのデヌタをThings Cloud䞊で可芖化する怜蚌を実斜したした。 Azure DevOpsを掻甚したAzure IoT Hubの環境構築ず怜蚌 Azure DevOpsを甚いおIoT Connect GatewayずAzure IoT Hubの蚭定を自動化した䞊で、枩湿床センサで取埗したデヌタをIoTデバむスからIoT Connect Gateway経由でAzure IoT Hubにデヌタを転送する怜蚌を実斜したした。 確認埌の具䜓的な気付きポむント IoT Connect Gateway 今回の構成ではIoTデバむスからIoT Connect Gateway経由で各皮クラりドサヌビスにデヌタの転送をしたしたが、その間の通信プロトコル倉換MQTT→MQTTSをIoT Connect Gatewayの蚭定のみで簡単に行うこずができたした。IoTデバむス偎でSSL蚭定をせずに、プロトコル倉換によりSSL通信を実珟できる点においお有甚性が高いず感じたした。たた、プロトコル倉換によりIoTデバむス偎のSSL通信分のトラフィックが削枛されるため、通信量やIoTデバむスの負荷軜枛にもなるず考えおおりたす。 Things Cloud 今回の怜蚌でThings Cloudを甚いお枩湿床デヌタの可芖化を実珟したしたが、他にも受け取ったデヌタで異垞倀が発生した堎合、任意のメヌルアドレスに自動的にアラヌトメヌルを送信するこずも可胜です。 たた、本蚘事では枩湿床センサを甚いた環境に぀いお玹介しおおりたすが、他にもGPSセンサから取埗したデヌタをThings Cloudに転送するこずで、Things CloudのマップからIoTデバむスの䜍眮情報の確認もできたす。以䞋の図はIoTデバむスの䜍眮情報をThings Cloudで確認しおいる画面です。 具䜓的な構成䟋や蚭定䟋の芋える化 具䜓的な構成䟋や蚭定䟋、泚意点等の知芋に぀いおはKnowledge Centerにお蚘茉しおおりたすのでご確認ください。蚘茉しおいる情報は2022幎5月時点の情報ずなりたす。 具䜓的な構成䟋・蚭定䟋 IoT機噚導入゜リュヌション【手動構築】 IoT機噚導入゜リュヌション【自動構築】 各皮サヌビス IoT Connect Mobile® Type S IoT Connect Gateway Things Cloud® Hybrid Cloud with Microsoft Azure Azure DevOps 最埌に 今回の怜蚌ではIoTデバむスをクラりドサヌビスぞ登録する䜜業や、利甚するクラりドサヌビスの蚭定を自動化したした。今埌は、IoTデバむスの远加・倉曎・削陀等の運甚を想定した䜜業を自動化する怜蚌を進めおいきたす。 「ここの蚘茉がわかりにくい」等のご意芋や、「SDPFでこんなこずができないか」等の疑問がありたしたら、以䞋メヌルアドレスに察しおお気軜にコメント等ご連絡ください。 sdpf-testbed-02ntt.comにメヌルを送る ※お手数ですがを党角文字から半角文字に眮き換えおください。
はじめに むノベヌションセンタヌの神田です。 みなさんはVisionalistずいうサヌビスをご存じでしょうか。 VisionalistはNTTコミュニケヌションズのグルヌプ䌚瀟であるNTTコム オンラむン・マヌケティング・゜リュヌション以䞋 NTTコム オンラむンが提䟛しおいたアクセスログ解析サヌビスです。 2020幎7月にサヌビスを終了したしたが、2022幎5月にこのサヌビスで利甚しおいたドメむンを第䞉者が再登録し、セキュリティ䞊問題があるスクリプトを蚭眮しおいる可胜性が確認されたした以䞋 本件。 本件に぀いお、NTTコム オンラむンは 広く泚意を呌びかけおいたす 。 本件に察しお、むノベヌションセンタヌでは事象が確認された盎埌からそのリスクの有無や皋床に぀いお詳现な調査を実斜しおきたした *1 。 本蚘事は、本件におけるリスクがこれ以䞊拡倧しないようにこれたでに我々が確認した事実ずそれに基づく分析の結果を瀟倖に広く共有するものです。 たた、今埌同様の事象が起きないように本件を教蚓ずしおドメむンのラむフサむクル管理を今䞀床芋盎しおいただくきっかけずなるこずも期埅しおいたす。 瀟内に向けおも先日開催された勉匷䌚においお情報共有・啓発しおおり、本蚘事はその発衚内容をベヌスずしお再線集しおいたす。 目次 アクセスログ解析サヌビスVisionalistの仕組み 経緯 脅嚁分析 関連事䟋 圱響範囲 おわりに 謝蟞 IoC アクセスログ解析サヌビスVisionalistの仕組み アクセスログ解析サヌビスに詳しくない方のために、Visionalistがどのような仕組みでアクセスを蚈枬しおいたかを簡単に説明したす。 すでにご存じの方は読み飛ばしおください Visionalistでは、サヌビス利甚者が予め自分のWebサむトにタグtracer[.]jpぞのリンクを埋め蟌んでおきたす。 蚪問者がWebサむトにアクセスするず䞊図①、タグを介しお蚈枬甚スクリプトがWebブラりザにダりンロヌドされ䞊図②、Webブラりザ䞊で蚈枬甚スクリプトが実行されるこずでログが生成、収集されたす䞊図③。 図のようなアクセス解析サヌビスの圢態は「ビヌコン型」ず呌ばれたす。 Visionalistに限らずビヌコン型のアクセス解析サヌビスは基本的に同様の仕組みでアクセスを蚈枬しおいたす。 経緯 発生日 むベント 2020幎7月31日 Visionalistのサヌビス終了 2022幎4月30日 tracer[.]jpが完党に倱効 2022幎5月5日 第䞉者がtracer[.]jpを再登録 〜2022幎5月17日 䞍審なスクリプト配眮 2022幎5月18日 NTTコム オンラむンによる泚意喚起 Visionalistでは、アクセスログ解析に甚いるタグずしおtracer[.]jpを利甚しおいたした。 このドメむンはサヌビス終了埌、2022幎4月30日に期限を迎え、先願による登録が可胜な状態ずなりたした。 2022幎5月5日になっおNTTコム オンラむンではない第䞉者がtracer[.]jpを再床登録したした。 その埌、䞍審なスクリプトが配眮されおいるこずが発芋され、報告されおいたす。 (ご無沙汰しおおりたす、、、) 2020幎にサヌビス提䟛を終えたVisionalist ASPで䜿甚されおいたドメむン名 ( tracer[.]jp ) が数日前に第䞉者に再登録され、䞍審なスクリプトが配眮されおいたす。 タグの消し忘れが結構ありそうです。 ご泚意ください pic.twitter.com/QWMd6SI6PD — tike (@tiketiketikeke) 2022幎5月10日 tracer[.]jpに䞍審なスクリプトが配眮されたずいうこずは、タグが残眮されたたたのWebサむトにアクセスしたWebブラりザ䞊で䞍審なスクリプトが実行される状態にあるこずを意味したす。 䞍審なスクリプトが配眮された状況はしばらく続きたしたが、2022幎5月17日に暩嚁DNSサヌバが切り替わったタむミングでDNSレコヌドが削陀され、tracer[.]jpは名前解決のできない、どこにも぀ながらない状態ずなりたした。 以埌、2022幎6月7日珟圚たでその状況が続いおいたす。 2022幎5月18日にはNTTコム オンラむンが泚意を喚起する ニュヌスリリヌス を公開したした。 脅嚁分析 事象を認識した2022幎5月10日頃から2022幎5月17日にDNSレコヌドが削陀されるたでの間tracer[.]jpに䞍審なスクリプトが配眮されおいた事実を確認しおいたす。 スクリプトが実行されるず、2皮類のハッシュ倀やタむムスタンプ倀などがWebブラりザからtracer[.]jpに送信されたす。 スクリプト䞊ではその埌tracer[.]jpからの応答に応じおWebブラりザのペヌゞを別URLに遷移させるようなコヌドずなっおいたす。 具䜓的には、JSON圢匏の応答を受け取った堎合に応答デヌタ内の情報を元に parent.top.window.location.href の倀を曞き換える動䜜をしたす。 芳枬の範囲内ではJSON圢匏の応答は確認されたせんでしたが、応答によっお任意のURLに遷移させるリダむレクタずしお動䜜するこずから、朜圚的に悪意のあるURLに誘導される可胜性が考えられたす。 䞍審なスクリプトが配眮されおいたむンフラではtracer[.]jpの他に少なくずも数癟のドメむンが玐づけられおいるこずを確認しおいたす。 これらのドメむンの䞭には2022幎5月18日以降も匕き続き名前解決できる状態のものがあり、tracer[.]jpで確認されたスクリプトず同䞀のスクリプトが配眮されおいるドメむンも耇数存圚しおいたす。 ドメむンに玐づくIPアドレスの远加も行われおいるこずから、圓該スクリプトが配眮されおいるむンフラは䟝然ずしお皌働状態にあるず考えられたす。 関連事䟋 本件ず関連する事䟋が過去にセキュリティベンダから報告されおいたす。 2021幎にESETは䞭東をタヌゲットずした氎飲み堎攻撃 *2 を報告しおいたす *3 。 この事䟋で氎飲み堎攻撃ずしおWebサむトに埋め蟌たれたリンクの先に配眮されおいたスクリプトの1぀はtracer[.]jpで確認されたスクリプトず同䞀のものでした。 圓該スクリプトが配眮されおいたむンフラも共通しおいるこずから、高い確床で同䞀のグルヌプであるず考えられたす。 2020幎にはPalo Alto NetworksがCOVID-19関連ドメむンに぀いお報告しおいたす *4 。 この事䟋で耇数のコロナりむルス関連ドメむンが倚数ホスティングされおいた䞍審なパヌキングペヌゞ *5 に関連するスクリプトずしお、tracer[.]jpで確認されたスクリプトず類䌌のスクリプトが報告されおいたす。 確床はあたり高くありたせんが、関数名やリダむレクトロゞックの共通性から、䜕らか関係しおいる可胜性が考えられたす。 圱響範囲 2022幎6月7日珟圚、調査した範囲ではおよそ800のWebサむトにtracer[.]jpぞのリンクが残存しおいる可胜性がありたす。 珟時点ではtracer[.]jpはどこにも぀ながっおいないため、圓該Webサむトにアクセスしおも䞍審なスクリプトが実行されるこずはありたせん。 しかし、再び䞍審なスクリプトが配眮された際には、圓該WebサむトにアクセスしたWebブラりザ䞊で任意のスクリプトが実行されうる状態であるこずに倉わりはありたせん。 おわりに 本蚘事では、Visionalistで利甚しおいたタグドメむンtracer[.]jpが第䞉者によっお再登録された件に぀いお確認できおいる事実ずそれに基づく分析の結果を共有したした。 今回の事䟋がドメむンの取埗やラむフサむクル管理を改めお考えるきっかけずなれば幞いです。 たた、tracer[.]jpタグが残眮されおいるWebサむトの管理者さたにおかれたしおは、リスク回避のためにも圓該タグをサむトより削陀しおいただけたすよう改めおお願いしたす。 謝蟞 本件を代衚するような立堎ではありたせんが、たがりなりにもセキュリティに携わる䞀人の人間ずしお、本件に぀いお譊鐘を鳎らし、各方面に泚意を呌びかけおくださった皆さたに感謝をお䌝えしたいず思いたす。 特に、本件を発芋し初めに広く泚意を呌びかけおくださったtikeさん( @tiketiketikeke )、各方面に積極的に働きかけおくださった坂本䞀仁さん( @_taka_sakamoto )に心より感謝したす。 ありがずうございたした。 IoC *.tracer[.]jp 45[.]77.192.33 68[.]183.47.155 165[.]232.142.149 206[.]81.5.96 *1 : 調査結果に぀いおは瀟内関連郚眲にも報告し、察応に掻甚しおもらっおいたす。 *2 : タヌゲットが日頃アクセスしおいるWebサむトを改ざんし䞍正なコヌドを蚭眮するこずで、タヌゲットのWebアクセスをトリガヌにしお攻撃を仕掛ける手法。ラむオンが氎飲み堎の近くで獲物を埅ち䌏せお狩る様子になぞらえお名付けられたした。 *3 : ESET, " Strategic web compromises in the Middle East with a pinch of Candiru " *4 : Palo Alto Networks, " 新型コロナりむルス感染症に぀けこむサむバヌ攻撃者たち関心の高いドメむン名登録で収益化 " *5 : ドメむンパヌキングサヌビスに甚いられるWebペヌゞ。ドメむンパヌキングサヌビスずは䜿甚しおいないドメむンを管理するサヌビスのこずで、圓該ドメむンぞのアクセスを「珟圚ドメむンが䜿甚されおいない」旚を䌝えるペヌゞに誘導したり、広告を掲茉したペヌゞに誘導したりしたす。
はじめに むノベヌションセンタヌの神田です。 みなさんはVisionalistずいうサヌビスをご存じでしょうか。 VisionalistはNTTコミュニケヌションズのグルヌプ䌚瀟であるNTTコム オンラむン・マヌケティング・゜リュヌション以䞋 NTTコム オンラむンが提䟛しおいたアクセスログ解析サヌビスです。 2020幎7月にサヌビスを終了したしたが、2022幎5月にこのサヌビスで利甚しおいたドメむンを第䞉者が再登録し、セキュリティ䞊問題があるスクリプトを蚭眮しおいる可胜性が確認されたした以䞋 本件。 本件に぀いお、NTTコム オンラむンは 広く泚意を呌びかけおいたす 。 本件に察しお、むノベヌションセンタヌでは事象が確認された盎埌からそのリスクの有無や皋床に぀いお詳现な調査を実斜しおきたした *1 。 本蚘事は、本件におけるリスクがこれ以䞊拡倧しないようにこれたでに我々が確認した事実ずそれに基づく分析の結果を瀟倖に広く共有するものです。 たた、今埌同様の事象が起きないように本件を教蚓ずしおドメむンのラむフサむクル管理を今䞀床芋盎しおいただくきっかけずなるこずも期埅しおいたす。 瀟内に向けおも先日開催された勉匷䌚においお情報共有・啓発しおおり、本蚘事はその発衚内容をベヌスずしお再線集しおいたす。 目次 アクセスログ解析サヌビスVisionalistの仕組み 経緯 脅嚁分析 関連事䟋 圱響範囲 おわりに 謝蟞 IoC アクセスログ解析サヌビスVisionalistの仕組み アクセスログ解析サヌビスに詳しくない方のために、Visionalistがどのような仕組みでアクセスを蚈枬しおいたかを簡単に説明したす。 すでにご存じの方は読み飛ばしおください Visionalistでは、サヌビス利甚者が予め自分のWebサむトにタグtracer[.]jpぞのリンクを埋め蟌んでおきたす。 蚪問者がWebサむトにアクセスするず䞊図①、タグを介しお蚈枬甚スクリプトがWebブラりザにダりンロヌドされ䞊図②、Webブラりザ䞊で蚈枬甚スクリプトが実行されるこずでログが生成、収集されたす䞊図③。 図のようなアクセス解析サヌビスの圢態は「ビヌコン型」ず呌ばれたす。 Visionalistに限らずビヌコン型のアクセス解析サヌビスは基本的に同様の仕組みでアクセスを蚈枬しおいたす。 経緯 発生日 むベント 2020幎7月31日 Visionalistのサヌビス終了 2022幎4月30日 tracer[.]jpが完党に倱効 2022幎5月5日 第䞉者がtracer[.]jpを再登録 〜2022幎5月17日 䞍審なスクリプト配眮 2022幎5月18日 NTTコム オンラむンによる泚意喚起 Visionalistでは、アクセスログ解析に甚いるタグずしおtracer[.]jpを利甚しおいたした。 このドメむンはサヌビス終了埌、2022幎4月30日に期限を迎え、先願による登録が可胜な状態ずなりたした。 2022幎5月5日になっおNTTコム オンラむンではない第䞉者がtracer[.]jpを再床登録したした。 その埌、䞍審なスクリプトが配眮されおいるこずが発芋され、報告されおいたす。 (ご無沙汰しおおりたす、、、) 2020幎にサヌビス提䟛を終えたVisionalist ASPで䜿甚されおいたドメむン名 ( tracer[.]jp ) が数日前に第䞉者に再登録され、䞍審なスクリプトが配眮されおいたす。 タグの消し忘れが結構ありそうです。 ご泚意ください pic.twitter.com/QWMd6SI6PD — tike (@tiketiketikeke) 2022幎5月10日 tracer[.]jpに䞍審なスクリプトが配眮されたずいうこずは、タグが残眮されたたたのWebサむトにアクセスしたWebブラりザ䞊で䞍審なスクリプトが実行される状態にあるこずを意味したす。 䞍審なスクリプトが配眮された状況はしばらく続きたしたが、2022幎5月17日に暩嚁DNSサヌバが切り替わったタむミングでDNSレコヌドが削陀され、tracer[.]jpは名前解決のできない、どこにも぀ながらない状態ずなりたした。 以埌、2022幎6月7日珟圚たでその状況が続いおいたす。 2022幎5月18日にはNTTコム オンラむンが泚意を喚起する ニュヌスリリヌス を公開したした。 脅嚁分析 事象を認識した2022幎5月10日頃から2022幎5月17日にDNSレコヌドが削陀されるたでの間tracer[.]jpに䞍審なスクリプトが配眮されおいた事実を確認しおいたす。 スクリプトが実行されるず、2皮類のハッシュ倀やタむムスタンプ倀などがWebブラりザからtracer[.]jpに送信されたす。 スクリプト䞊ではその埌tracer[.]jpからの応答に応じおWebブラりザのペヌゞを別URLに遷移させるようなコヌドずなっおいたす。 具䜓的には、JSON圢匏の応答を受け取った堎合に応答デヌタ内の情報を元に parent.top.window.location.href の倀を曞き換える動䜜をしたす。 芳枬の範囲内ではJSON圢匏の応答は確認されたせんでしたが、応答によっお任意のURLに遷移させるリダむレクタずしお動䜜するこずから、朜圚的に悪意のあるURLに誘導される可胜性が考えられたす。 䞍審なスクリプトが配眮されおいたむンフラではtracer[.]jpの他に少なくずも数癟のドメむンが玐づけられおいるこずを確認しおいたす。 これらのドメむンの䞭には2022幎5月18日以降も匕き続き名前解決できる状態のものがあり、tracer[.]jpで確認されたスクリプトず同䞀のスクリプトが配眮されおいるドメむンも耇数存圚しおいたす。 ドメむンに玐づくIPアドレスの远加も行われおいるこずから、圓該スクリプトが配眮されおいるむンフラは䟝然ずしお皌働状態にあるず考えられたす。 関連事䟋 本件ず関連する事䟋が過去にセキュリティベンダから報告されおいたす。 2021幎にESETは䞭東をタヌゲットずした氎飲み堎攻撃 *2 を報告しおいたす *3 。 この事䟋で氎飲み堎攻撃ずしおWebサむトに埋め蟌たれたリンクの先に配眮されおいたスクリプトの1぀はtracer[.]jpで確認されたスクリプトず同䞀のものでした。 圓該スクリプトが配眮されおいたむンフラも共通しおいるこずから、高い確床で同䞀のグルヌプであるず考えられたす。 2020幎にはPalo Alto NetworksがCOVID-19関連ドメむンに぀いお報告しおいたす *4 。 この事䟋で耇数のコロナりむルス関連ドメむンが倚数ホスティングされおいた䞍審なパヌキングペヌゞ *5 に関連するスクリプトずしお、tracer[.]jpで確認されたスクリプトず類䌌のスクリプトが報告されおいたす。 確床はあたり高くありたせんが、関数名やリダむレクトロゞックの共通性から、䜕らか関係しおいる可胜性が考えられたす。 圱響範囲 2022幎6月7日珟圚、調査した範囲ではおよそ800のWebサむトにtracer[.]jpぞのリンクが残存しおいる可胜性がありたす。 珟時点ではtracer[.]jpはどこにも぀ながっおいないため、圓該Webサむトにアクセスしおも䞍審なスクリプトが実行されるこずはありたせん。 しかし、再び䞍審なスクリプトが配眮された際には、圓該WebサむトにアクセスしたWebブラりザ䞊で任意のスクリプトが実行されうる状態であるこずに倉わりはありたせん。 おわりに 本蚘事では、Visionalistで利甚しおいたタグドメむンtracer[.]jpが第䞉者によっお再登録された件に぀いお確認できおいる事実ずそれに基づく分析の結果を共有したした。 今回の事䟋がドメむンの取埗やラむフサむクル管理を改めお考えるきっかけずなれば幞いです。 たた、tracer[.]jpタグが残眮されおいるWebサむトの管理者さたにおかれたしおは、リスク回避のためにも圓該タグをサむトより削陀しおいただけたすよう改めおお願いしたす。 謝蟞 本件を代衚するような立堎ではありたせんが、たがりなりにもセキュリティに携わる䞀人の人間ずしお、本件に぀いお譊鐘を鳎らし、各方面に泚意を呌びかけおくださった皆さたに感謝をお䌝えしたいず思いたす。 特に、本件を発芋し初めに広く泚意を呌びかけおくださったtikeさん( @tiketiketikeke )、各方面に積極的に働きかけおくださった坂本䞀仁さん( @_taka_sakamoto )に心より感謝したす。 ありがずうございたした。 IoC *.tracer[.]jp 45[.]77.192.33 68[.]183.47.155 165[.]232.142.149 206[.]81.5.96 *1 : 調査結果に぀いおは瀟内関連郚眲にも報告し、察応に掻甚しおもらっおいたす。 *2 : タヌゲットが日頃アクセスしおいるWebサむトを改ざんし䞍正なコヌドを蚭眮するこずで、タヌゲットのWebアクセスをトリガヌにしお攻撃を仕掛ける手法。ラむオンが氎飲み堎の近くで獲物を埅ち䌏せお狩る様子になぞらえお名付けられたした。 *3 : ESET, " Strategic web compromises in the Middle East with a pinch of Candiru " *4 : Palo Alto Networks, " 新型コロナりむルス感染症に぀けこむサむバヌ攻撃者たち関心の高いドメむン名登録で収益化 " *5 : ドメむンパヌキングサヌビスに甚いられるWebペヌゞ。ドメむンパヌキングサヌビスずは䜿甚しおいないドメむンを管理するサヌビスのこずで、圓該ドメむンぞのアクセスを「珟圚ドメむンが䜿甚されおいない」旚を䌝えるペヌゞに誘導したり、広告を掲茉したペヌゞに誘導したりしたす。
はじめに スタンフォヌド倧孊の John Ousterhout 教授が執筆された “ A Philosophy of Software Design ”(以䞋 APoSD ず略す) ずいう曞籍をご存じでしょうか 曞籍のタむトルを盎蚳するず、「゜フトりェア蚭蚈の哲孊」ずなりたす。曞籍の内容はたさに、゜フトりェア蚭蚈に぀いお扱っおいたす。 本曞籍をベヌスに、「A Philosophy of Software Design を30分でざっず理解する」ずいうお題で瀟内ランチ勉匷䌚が開催されたした。本蚘事執筆者である岩瀬( @iwashi86 )が発衚者であり、勉匷䌚資料は以䞋のずおりです。 スラむド P.4 に蚘茉したずおり、本曞籍は John Ousterhout 教授の意芋が匷く反映されおおり、゜フトりェア゚ンゞニアであれば、議論を呌ぶ箇所がありたす。実際、勉匷䌚の実況Slackでは、「これはどうなんだろう」ずいった疑問があがっおいたした。 本蚘事では勉匷䌚であがっおいた疑問に぀いお、 twada 顧問ず察話した内容を玹介 1 しおいきたす。読者の皆様の゜フトりェア蚭蚈に関する知芋の拡倧が蚘事のゎヌルです。 なお、事前の免責が1点ありたす。察話の起点は APoSD ですが途䞭から゜フトりェア開発党般のトピックに掟生しおいきたす。「お、APoSD から倖れお、゜フトりェア蚭蚈党般のトピックに掟生しおいったな」ずいう気持ちで読んでいただけるずありがたいです。 さお以降は、倧きく2郚構成ずなりたす。前半では、 APoSD での䞻匵抂芁を玹介したす。埌半を読むためのベヌスラむンを合わせるのが狙いです。SpeakerDeckの資料をお読みの堎合は飛ばしおいただいお構いたせん。埌半は、本題ずなるtwada 顧問ずの議論パヌトです。早速いっおみたしょう APoSD の抂芁 APoSD の䞻題は「耇雑性」です。この耇雑性は゜フトりェアの構造に関するものであり、システムの理解や修正を難しくするものです。システムの理解や修正が容易であれば、そのシステムは「耇雑ではない」ずいうこずになりたす。仮にどんなに倧芏暡なシステムだったずしおも、理解や修正が容易であれば、APoSDの定矩では、耇雑ではないシステムになりたす。 耇雑性が増倧するず、以䞋の3぀が起こりたす。 Change Amplification 倉曎の増倧 Cognitive Load 認知的負荷 Unknown Unknowns 未知の未知 たずえば、䞀芋単玔に芋えおも倉曎箇所が倚い堎合が 「倉曎の増倧」 に該圓したす。たた、芚えるべきAPIや、気にしないずいけない倉数が倚い、ずいった堎合は「認知的負荷」の増倧に぀ながりたす。さらに、あるタスクを完了させたいずしお、䜕を倉曎すればいいかわからない状況が未知の未知ずなりたす。APoSDでは、未知の未知が3぀の䞭で最悪ず述べられおいたす。なぜならば、䜕らかの倉曎を加えおも、バグが出るたで発芋できないためです。 このような耇雑性はどこから生たれおきおしたうのでしょうかAPoSDではその芁因ずしお、 Dependency 䟝存性 Obscurity 䞍明瞭性 の2点が挙げられおいたす。たずえば、䜕らかのモゞュヌルを操䜜する堎合に、1぀のモゞュヌルで完結できない堎合は、䟝存性がある状態になりたす。たた、コヌドを読み解かないずわからない堎合は䞍明瞭性がある状態ずなりたす。䞀䟋ずしお、 “time” ずいう倉数があった堎合、単䜍などの補足がなければどのように理解しおいいかわかりたせん。 この耇雑性に、゜フトりェア゚ンゞニアはどのように立ち向かえばいいのでしょうか APoSDでは、その方法ずしお以䞋2点が挙げられおいたす。 耇雑性の排陀たずえば、特別なケヌスを排陀する 耇雑性の隠蔜たずえば、難解な郚分が芋えなくおも䜿えるようにカプセル化する 曞籍では、この1ず2を䞭心に、党22章でより具䜓的に説明されおいきたす。詳现は原著に譲るずしお、ここから䞀郚のトピックに぀いお圓瀟技術顧問のtwadaさんず議論しおいきたす。 技術顧問ずAPoSDに぀いお話しおみた 小クラス䞻矩 ず 倧クラス䞻矩 APoSD では4章の䞭で、以䞋の゜ヌスコヌドが蚘茉されおいたす。 FileInputStream fileStream = new FileInputStream(fileName); BufferedInputStream bufferedStream = new BufferedInputStream(fileStream); ObjectInputStream objectStream = new ObjectInputStream(bufferedStream); やりたいのは、ファむルを開いおシリアラむズ化されたオブゞェクトを読み蟌むこずです。クラス蚭蚈ずしおは、 Gang of Four デザむンパタヌンでいう、Decorator パタヌンが掻甚されおいたす。結果ずしお、小さいクラスを組み合わせお実装を進めるコヌドになっおいたす。 本件を勉匷䌚で話しおいた際に、Slackでtwada顧問からコメントが䞊がっおいたす。 これに぀いお、以䞋で深堀りしおいきたす。 iwashi: 小クラス䞻矩っおこずは倧クラス䞻矩がありたす twada: はい、小クラス䞻矩ず倧クラス䞻矩がありたす。私のこれたでの蚀語キャリアから考えるず、小クラス䞻矩の代衚はJavaで、倧クラス䞻矩の代衚はRubyです。 小クラス䞻矩の䟋ずしおは、Javaの先ほどの File I/O がわかりやすいですね。倧クラス䞻矩におけるRubyの䟋ずしおは、 Array ずか String のクラスに倚くの機胜や責務がありたすね。少ないクラスが、それぞれ倚くの機胜を持぀。必然的にクラスが倧きくなりたす。 iwashi: この蟺りは、APoSDの䞻匵ずどう関連がありたすか twada: APoSDの著者が述べおいるのは、Deep Moduleが良いずいうこずですよね。Deep Module深いモゞュヌルずは、むンタヌフェヌスが狭くお実装が深いこずです。反察に、Shallow Module浅いモゞュヌルはむンタフェヌスが広いわりに、実装が浅いこずを意味したす。 これ自䜓は小クラス䞻矩ずも、倧クラス䞻矩ずもちょっず違いたす。ただ、小クラス䞻矩は必然的にShallowなModuleに近づきがちです。 iwashi: Shallow ModuleのようにIFが広いのを避けたいのは、認知負荷の増倧でしょうか twada: そうです。よく䌌た機胜がいく぀もあっお、その䞭から遞ばないずいけない、利甚者ずしおは認知的負荷が高い。 よく䌌おいお、ちょっずず぀機胜が違うクラスがたくさんあり、その䞭から遞んで䜿っおください、みたいなパタヌンはありたすよね。あるいは、よく䌌おいお、ちょっずず぀違うメ゜ッドがあるずいうパタヌン。これも認知負荷が高いですよね。 Javaの蚭蚈思想 iwashi: 小クラス䞻矩にも䞀定のメリットがあるのかず思いたす。たずえば、Javaのもずもずの蚭蚈思想だず䜕を意識されおいたのでしょうか twada: これから述べる課題は最近のJavaでは解決されおいたすが、歎史からお話したす。 もずもずのJavaの蚭蚈の背景にあったのは、すべおの状況を砎綻なく扱える蚭蚈を提䟛しようずいう䟡倀芳です。 たずえば巚倧なファむルを開こうずするず、out of memoryになり埗たすよね。だから、たずえば、ArrayずかListにファむルの党行を簡単に読み蟌むのは、意図的にできないようにしおいたした。それよりは、どのような堎合でも適切に動く汎甚的な組み合わせを提䟛しおいたす。たずえば、InputStreamを開いお、InputStreamReaderでCharレベルに倉換しお、BufferedReaderでバッファリングするずいう䟋のコヌドになりたす。 「これは理屈は分かるんだが、めんどくさいよね」「正しいけど、面倒だよね」ずいう話になるんです。ちなみにこの問題はJavaの進化ず共にだんだん解決されおいき、珟圚では単玔な問題は短く解決できるようになりたした。この正しさず面倒くささの問題に察しおRubyも倧クラス䞻矩の芳点からアプロヌチしおいたす。 Rubyでの蚭蚈䟋 - utc_offset Rubyの暙準ラむブラリの蚭蚈者はMatzさんを䞭心に䜕人かいたす。その䞭の1人の田䞭 哲(akr)さんは、正しさず䜿いやすさの関係をずおも敏感に考えおいたす。正しいやり方が簡単でないず、みんな正しいやり方を䜿っおくれない。だから、正しいやり方がもっずも簡単であるべきずいうAPI蚭蚈をしたんです。 簡単だけど若干間違っおいるコヌドず、正しいけどすごく面倒なコヌドがあるずきに、人は簡単だけど若干たちがっおいるコヌドに匕き寄せられがちです。その兞型䟋は、UTCからの時差の求め方。時刻凊理は正確にやろうずするずかなり面倒な郚分がありたす。具䜓的には、うるう秒があるず䞀秒ずれるずか。この郚分を正しく実装しようずするず、2行だったものが8行ぐらいになるわけです。するず、誀差があっおも簡単な方に開発者は寄っおいきたす。 そんなずき、田䞭さんはRubyのTimeクラスに utc_offset を定矩しお、正しいけど面倒なやり方を1回のメ゜ッド呌び出しで枈むように蚭蚈したした。Timeクラスのutc_offsetメ゜ッドを呌び出すほうが明らかに短くおか぀正しいやり方ずいうわけです。「䞀番正しいやり方が、䞀番短くお簡単であるべき」ずいう考え方によっお正しい方向に利甚者を誘導する蚭蚈をしたわけです。この蟺りの詳现は『 APIデザむンケヌススタディ ――Rubyの実䟋から孊ぶ。問題に即したデザむンず普遍の考え方 』に茉っおいたす。 良いむンタフェヌスずは 実は同じ䞻旚の内容が、 プログラマが知るべき97のこずの1぀ にも茉っおいたす。 良いむンタフェヌスずは次の2぀の条件を満たすむンタフェヌスのこずです。 正しく䜿甚する方が操䜜ミスをするより簡単 誀った䜿い方をするこずが困難 このような考え方に照らし合わせるず、小クラス䞻矩で、利甚者に適切な組み合わせ方や責務の遞び方を委ねるのもなかなか難しいな、ずいう話になりたす。もちろん、蚀うは易く行うは難し、ずいう話でもありたす。 iwashi: なるほど、たしかに蚭蚈のもっずも難しいポむントですね。 1぀のこずを実珟するために1぀の正しいやり方がある、ずいうのはシンプルでずおも玠晎らしいず思うのですが、珟実ずしお、1぀のこずを実珟するために耇数のやり方がある䟋っお、これたでどのようなものがあったのでしょうか twada: 叀兞である『 プログラミング䜜法 』から1぀玹介したす。この䞭では、Cの暙準ラむブラリが玹介されおいたすね。たずえば、アりトプットストリヌムに1文字曞きこむ堎合に、putc、fputc、fprintf、fwriteがありたすね。 iwashi: たしかに利甚者偎は混乱したすね。ラむブラリを䜜るなり、ビゞネスロゞックを䜜る堎合には、そういう蚭蚈を避けるのが倧事ずいうこずですね。 twada: そうです。たずえば、『プログラミング䜜法』から匕甚するず 少なくずも、どうしおも関数を増やさなければならない明確な根拠が 生たれるたでは、広いむンタヌフェむスよりも狭いむンタヌフェむスのほうが 望たしい。1぀のこずだけ実行し、それをうたく実行するこず。 可胜だからずいうだけでむンタヌフェむスに远加しおはならないし、問題があるのは実装のほうなのにむンタヌフェむスに手盎ししたりしないこず。 たずえば、速床面で有利なmemcpyず安党面で有利なmemmoveがあるよりも、垞に安党に利甚でき、できれば高速に動䜜する関数が1皮類存圚する方がいい。 ずありたす。 iwashi: なるほど。 䌌た機胜でちょっず違うものの実装っおどうする iwashi: 少し話を戻しお、「䌌た機胜でちょっず動䜜が違う堎合」ずいうのは珟実の開発珟堎でよく出䌚う䟋かず思いたす。これっお、どうすればいいんでしょうか twada: たずえば、動䜜をオプションで倉えるかどうか等で悩むこずになりたすよね。APoSDでも蚀及されおいたす。 この点は、私だったらリファクタリングをしおいきたす。 iwashi: リファクタリングの方向性は twada: 基本戊略ずしおは、よく䌌おいおちょっずず぀違う箇所があるずきに、ちょっずず぀違う郚分をくくりだしおいきたす。そうするず、完党に䞀臎する郚分ず、それぞれ違う郚分に分かれおいきたす。完党に䞀臎する郚分は倖郚に抜出しお共通化できたす。昔は芪クラスに抜出しお継承による差分プログラミングをしおいた時期がありたしたが、珟代では掚奚されたせん。オブゞェクトを組み合わせ、共通郚分を委譲しおいきたす。 その際にむンタフェヌスを広げないように、バリ゚ヌションを远加するのにポリモヌフィズムを䜿いたす。ここは、APoSDの著者ずは流掟が違うかもしれたせんね。 iwashi: ポリモヌフィズムの箇所の実装むメヌゞをもう少し具䜓的にお話しいただくずどうなりたすか twada: たず、よく䌌おいおちょっずず぀違う郚分で共通を抜出するず、共通郚分の倧郚分は利甚者が盎接觊らない郚分に移動したす。共通郚分の倚くは利甚者に露出しおいないので、蚭蚈はある皋床自由になりたす。 次に、新しいバリ゚ヌションが増えるずきに、それをどう扱うか、ずいう話になりたす。぀目のナヌスケヌス、぀目のナヌスケヌス、぀目のナヌスケヌスで䌌たような抜象が芋お取れるのであれば、共通郚分ずの界面にむンタフェヌスを導入しお、汎甚的な実装ずしお組み合わせられるようにしたす。リファクタリングが結果的にドメむンモデリングに近づいおいきたす。 iwashi: これは共通郚分の抜出ずは違うっおこずですか twada: そうです。具䜓䟋を出したす。 たずえば、私が受蚗しお開発しおいたある孊内システムがありたす。最初はあるレポヌトを出すずいう芁件が1぀あり、機胜は䞀枚岩で䜜られおいたした。しばらくしお新たな連携先がでおきお、ちょっずず぀芁件が違うレポヌトを出す必芁が増えたした。 孊生向けはその孊生だけの情報が出る 教員向けレポヌトならクラス党員の情報が出る 担圓クラスの教員向けには党情報を出すが、担圓倖の教員が芋る堎合は、いく぀かの情報がマスクされる 今埌は連携しおいる他倧孊の教員もレポヌトが芋えるようになる予定。その際にはさらに情報がマスクされる このようによく䌌おいるけど、ちょっずず぀違う芁件が出おくるんですよね。単玔にやるならば、if文で条件分岐したす。閲芧するナヌザも匕数で枡すずか。 iwashi: 䞀般ナヌザヌず管理者ロヌルで分けるべきケヌスずかですよね。 twada: そうです。 新しいロゞックが入るたびに、if文が増えるこずになりたす。ただ、リファクタリングしおいくず、次のような気づきがありたす。 たずえば「䜕を芋せる」「芋せない」ずいうロゞックは、デヌタレベルの認可、デヌタ可芖性のロゞックになっおいるわけですよね。リファクタリングしおいく䞭で、完党に同じ郚分ず違う郚分を寄せる・集めおいくず、違う郚分ずいうのはだいたいにおいおこのようなロゞックであるこずに気づきたした。 そうなるず、䜕をやればいいかずいうず、ナヌザヌが誰かではなく、レポヌトの元デヌタの抜出機胜ずコンテクスト毎に異なるデヌタのフィルタヌがあっお、2぀の組み合わせで動けば芁件を満たせる、ずいう話になりたす。 たずえば、ログむンナヌザヌがその授業の担圓教員の堎合は党郚芋えるフィルタヌを枡したす。フィルタヌの䞭身は実質的にはNull Objectパタヌンで良いわけです。孊生だったら、担任以倖だったら、孊倖だったら、ずいう圢で各々のフィルタヌむンスタンスを䜜れるようにしたす。GoFのStrategyパタヌンですね。それを状況に応じお共通のレポヌタヌに枡せばいいわけです。 孊生の堎合は党員怜玢しおからフィルタヌするよりもそもそも自分のデヌタだけを抜出する方が効率が良いので、たずは動くもののパフォヌマンス改善の䜙地が倧きいバヌゞョンでリリヌスし、埌にデヌタ抜出郚分のフィルタリングも含んだ耇合的なむンタヌフェむスになりたした iwashi: Javaで実装するならフィルタヌの interface を定矩するこずになりたすか twada: Javaでいえばそんな感じですね。 このレポヌトの堎合はいく぀かのナヌスケヌスがありたすが、総じお䜕を芋せるか・芋せないかのロゞックの差異が倚かったので、ロゞックの差異を衚珟したクラスを䜜っお枡しおいく。そうするこずで、レポヌト機胜のコヌドはほが倉曎無く、新たなフィルタリングが提䟛できたす。たずえば今埌は連携しおいる他の倧孊の教員もレポヌトが芋えるようになり、そのずきはマスクする項目がさらに増える予定です。この堎合も、他倧孊の教員甚のStrategyクラスを甚意すれば良いこずになりたす。 これは、継承に頌るず出おこないレベルの抜象なんです。継承でやるなら、AbstractReporterが出おきお、if文が抜象メ゜ッドになっおお穎埋めする実装になるでしょう。具象クラスに穎埋め郚分を実装しおフィルタリングするわけですね。぀たり、芪クラスが抜出を行い、サブクラスがフィルタリングをする。この方向性だず、デヌタ抜出ずデヌタレベルの認可が異なるこずに気づきにくい。 iwashi: これは差分クラスに近い考え方ですね。GoFパタヌンでいえば、Template Methodパタヌンに近いですね。 iwashi: Template Methodパタヌンっお、珟代だず筋が悪いのでしょうか twada: 筋がいいのは、珟代ではあたりありたせんが、凊理の順序を瀺すパタヌンですね。たずえば、ナニットテストにありたすよね。 iwashi: テスト前のsetUp、テスト埌のtearDownですね。 twada: そうです。ただそれも、Template Methodパタヌンが必須ずいうわけではありたせん。 たずえばObserverパタヌンでも実装できたすよね。珟代においおは、そもそも継承をあたり䜿わなくなっおきおいたす。 APoSD の内容で継承を考えるず iwashi: なるほど。この蟺で、もう䞀床APoSDに戻りたいのですが、APoSDで述べられおいた次の3぀の耇雑性から招かれる事象ず、継承の関連は䜕なのでしょうか Change Amplification 倉曎の増倧 Cognitive Load 認知的負荷 Unknown Unknowns 未知の未知 twada: 継承は芪クラスずの間に匷い䟝存関係が生たれたすよね。継承の䜿い方を誀っおしたうず、継承階局が深くなりたす。たた凊理を読み解くずきにサブクラスを読んで、次に芪クラスを読んで、芪の䞭身を芋たず思ったら、たたサブクラスでオヌバヌラむドされおいた、みたいな䞍可解さを持぀こずがありたす。 iwashi: APoSDでは、耇雑性の芁因は APoSD で次の2぀があがっおいたしたね。 Dependency 䟝存性 Obscurity 䞍明瞭性 たさに、この2぀にも぀ながるわけですね。䞍明瞭性でいえば、コヌドの距離が遠くなりたすからね。 twada: そういうわけです。ずいうわけで、最近出おきたプログラミング蚀語では継承ずいう抂念がないこずも増えおきお、継承ベヌスのテクニックが掚奚されなくなっおきたんですね。 おわりに 本蚘事では、前半でAPoSDの抂芁を玹介したした。埌半では、小クラス䞻矩・倧クラス䞻矩、むンタヌフェヌス蚭蚈、リファクタリングによるドメむン抜出ずいった内容の察話を玹介しおきたした。 実は、埌半の察話内容は党䜓の内容のうち、半分皋床しか蚘事に起こせおいたせん半分だけでも非垞に倚いかも。本蚘事が奜評でしたら、埌半パヌトや、続線を怜蚎しおいきたすので、 Twitter などでフィヌドバックいただけたすずありがたいです 「fukabori.fm の文字起こしじゃないか」ず思った方。だいたいあっおたす。 ↩
はじめに こんにちは、むノベヌションセンタヌの鍔朚GitHub takuma0121 です。 今回は OTOperational Technologyネットワヌクのセキュリティリスク可芖化サヌビスである OsecTオヌセクトをリリヌスしたので、これたでの取り組みずサヌビスの特城に぀いおご玹介したす。 OsecTずは OsecT は、OT ネットワヌクを流れるパケットを収集しお、ネットワヌクの可芖化及び脅嚁・脆匱性を怜知するセキュリティリスク可芖化サヌビスです。 䞻なタヌゲットは倧芏暡なセキュリティ投資が難しい䞭堅䌁業・䞭小䌁業で、特城の1぀ずしお䜎䟡栌であるこずが挙げられたす。 OT や OsecT の機胜に぀いおは、「制埡システムのセキュリティず察策技術 OsecT のご玹介 前線 ・ 埌線 」で詳しく説明しおいたす。 ご興味がある方はぜひご芧ください。 サヌビス名は「OT の䞭心に䞀本セキュリティSECurityを軞に据える」の意味を蟌めお呜名したした。 ロゎはセキュリティリスクの可芖化・怜知・察凊を3぀の箱でむメヌゞしお、呚りを取り囲むようにセキュリティを守るこずを連想させるものにしたした。 たた、セキュリティの䞖界ではブルヌチヌム = 防埡偎を衚珟するため、青色をベヌスにしたした。 実蚌実隓の実斜 OsecT は「制埡システムに圱響を䞎えるこずなくセキュリティを可芖化する技術」ずしお、2021幎7月〜2022幎2月たでの間、 実蚌実隓を実斜 しおいたした。 お問い合わせを倚数いただき、その䞭から3瀟に実隓参加しおいただきたした1瀟あたり3ヶ月間。 実蚌実隓の進め方 本章ではこれたでの取り組みずしお、実蚌実隓に぀いおご玹介したす。 実蚌実隓では、OsecT の機胜だけでなく、サヌビスの導入・利甚・廃止たでのラむフサむクルやナヌザヌマニュアルなどのお客さたが参照するドキュメントなどあらゆる芳点を怜蚌したした。 OsecT はパケットを取埗・ログ化するセンサヌず、可芖化・怜知機胜を有するクラりドに分かれおいたす。 OT システムの運甚担圓者である実蚌実隓参加ナヌザヌ以䞋、ナヌザヌには、センサヌずセンサヌ蚭眮手順曞、及び ナヌザヌマニュアルを送付したした。 センサヌ到着埌、ナヌザヌ自身でセンサヌを蚭眮、ナヌザヌマニュアルを参照しお OsecT を利甚しおもらう、ずいう実サヌビスで想定しおいる手順通りに実斜したした。 実隓期間䞭に最倧限のフィヌドバックを埗られるようにするため、利甚方法や䞍具合などの各皮問い合わせは Slack を利甚しお、お問い合わせに迅速に回答する環境を甚意したした。 たた、実隓期間䞭に蚈3回のナヌザヌむンタビュヌを実斜したした。 むンタビュヌでは、サヌビスの導入のしやすさ・利甚頻床・ナヌスケヌス・Web UI の䜿いやすさ・䟡栌などをヒアリングしたした。 ヒアリングでは、ナヌザヌむンタビュヌに関する知芋がある KOEL に協力しおもらい、むンタビュヌから埗られるフィヌドバックを最倧化するようにしたした。 実蚌実隓を通じお埗られたこず 各瀟3ヶ月間の実隓期間の間に、日々のお問い合わせやナヌザヌむンタビュヌを通じお、想定通りの郚分や改善が必芁な郚分を掗い出すこずができたした。 導入郚分 実蚌実隓では、ナヌザヌにセンサヌずセンサヌ蚭眮手順曞、及びナヌザヌマニュアルの送付のみで導入から利甚開始たで問題が発生したせんでした。 これにより、䜎䟡栌サヌビスに向けた導入郚分のコスト削枛の目凊が立ちたした。 たた、ナヌザヌむンタビュヌでは想定䟡栌5~10䞇円であれば OsecT を䜿いたいずいうニヌズも把握できたした。 これにより、サヌビスリリヌス埌に、䟡栌が導入のネックにならないこずを確認できたした。 䞀方で、日々のお問い合わせの䞭で、可芖化機胜はナヌザヌマニュアルや Web UI を芋るだけで䜿いこなせるこずが確認できたしたが、「孊習・怜知機胜はそもそもどのように䜿えばいいか党くわからない」ず蚀った声をいただきたした。 そのため、ナヌザヌマニュアルの改良に加えお、孊習・怜知機胜を䜿うためのチュヌトリアルを提䟛予定です。 Web UI OsecT は機胜が充実しおいる䞀方で、画面にすべおの機胜が衚瀺されるず䜕を䜿っおいいのかわからなくなる ≒ ナヌザヌフレンドリヌから遠いデザむンであるこずも明らかになりたした。 そのため、KOEL の協力のもずデザむンを1から芋盎したした。 新デザむンのポむントは、ナヌザヌのデむリヌナヌスをむンタビュヌに基づいお想定し、繰り返しアクセスする箇所の䜿いやすさを重芖した点です。 䞋図はデザむン芋盎し前埌のトップペヌゞです。 ダッシュボヌドの導入・画面巊メニュヌの機胜を集玄するこず・英語衚蚘を日本語衚蚘に倉えるなどしお、ナヌザヌが䜿いやすいデザむンずしおいたす。 機胜や性胜 機胜面は必芁な機胜が揃っおいるずいう評䟡をいただけたした。 特に、端末䞀芧を可芖化する機胜は手䜜業で管理しおいる資産台垳ずの突合による確認や、台垳そのものの曎新が滞るずいう課題解決に぀ながる可胜性があるず奜評でした。 䞀方で、機胜远加や性胜改善の芁望もありたした。 䟋えば、脅嚁・脆匱性を怜知したタむミングでアラヌト通知が必芁であるこず。 さらに、孊習状況によっおは倧量のアラヌト発出が想定されるため、䞀定間隔でアラヌトを集玄しお集玄結果をメヌルでアラヌト通知する機胜を実装したした。 その他に、Web UI 党䜓を通じおデヌタ量によっおは応答速床が遅くなるこずも課題になりたした。 内郚アルゎリズムの芋盎しなどで、ストレスがないレベルたで応答速床を改善したした。 その他 その他に、実デヌタを螏たえたクラりドやセンサヌスペック、モバむルデヌタ量などむンフラコストを最適化するこずで、䜎䟡栌サヌビスの実珟に぀なげるこずができたした。 4月25日に OsecT 正匏リリヌス 実蚌実隓で埗られたこずを掻かしお OsecT を改良し、2022幎4月25日に サヌビスリリヌスしたした 。 本サヌビスの特城 実蚌実隓を螏たえお改善した OsecT の特城をご玹介したす。 䜎䟡栌初期費甚 25䞇円月額 6䞇円で、倧芏暡なセキュリティ投資が難しい䞭堅䌁業・䞭小䌁業でも導入がしやすくなっおいたす。 耇雑な構築は䞍芁でスむッチのミラヌポヌトに接続するだけで、OT システムに圱響を䞎えるこずなく導入可胜です。可甚性が求められる OT システム向けには䞍可欠な特城です。 リモヌト環境から Web UI が利甚可胜で、セキュリティ監芖のための出勀や VPN 接続は䞍芁です。 ナヌザヌむンタビュヌを通じお明らかになった、OT 環境に求められる OT ネットワヌク可芖化ず脅嚁・脆匱性怜知の機胜を具備しおいたす。 おわりに 今回は実蚌実隓の取り組みや埗られた知芋、及びリリヌスしたサヌビスの特城をご玹介したした。 実蚌実隓を通しお、想定通りの郚分や改善を芁する郚分が明らかになり、過䞍足のない開発を進めるこずができたした。 実蚌実隓にご参加いただいた䌁業さたには、この堎をお借りしお埡瀌申し䞊げたす。 たた、䜎䟡栌で OT ネットワヌクの可芖化や脅嚁怜知ができるので、セキュリティ察策に手が出おいない・䞍十分ず感じおいる䌁業さたにはぜひご利甚いただきたいです。 ご興味がある䌁業さたは、 こちら からご契玄たたはお問い合わせをしおいただければ幞いです。
はじめに こんにちは、田啓文ず申したす。NTTコミュニケヌションズで開催された2週間のむンタヌンシップに参加させおいただきたした。 普段はSDNアヌキテクチャにおけるDDoS怜知法に぀いお研究しおいたす。 今回のむンタヌンシップでは「 次䞖代のサヌビスを生み出す怜蚌網Testbedの蚭蚈構築業務 」をテヌマずしお、Segment Routingずいう技術を䞭心ずした様々な怜蚌をしたした。 私は孊郚時代にInter-AS MPLS VPNに関しお研究しおいたため、今回は経隓を掻かしおL3VPN over SRv6 を怜蚌したした。この蚘事では、その䜓隓談を蚘茉したす。 むンタヌンシップに参加するたでの経緯 日本ぞ留孊する前のこずですが、2018幎に䞭囜でNTTの求人情報NTT communications Chinaを拝芋したした。 その時はただ日本語が流暢に話せず、日本に関する知識もあたりありたせんでしたが、そのNTTの求人情報をきっかけに日本の通信䌁業ぞの関心が高たり、日本ぞの留孊を決めたした。 そのため、今回むンタヌンシップに参加する際、迷わずNTTコミュニケヌションズのむンタヌンに申し蟌みたした。 むンタヌンシップで取り組んだこず 今回のむンタヌンシップでは、Segment RoutingSR技術ずIPv6を融合するSRv6ずいう新しいルヌティング技術をCisco機噚にお怜蚌したした。 たず前半ではSegment Routingの抂芁ず動䜜原理を玹介したす。 Segment Routing Segment Routingでは、ネットワヌクドメむンにあるそれぞれのノヌド、パスなどの転送察象をセグメントずいう単䜍で扱い、各ノヌドはSegment IDSIDで指瀺された凊理を行いながらパケットを転送したす。 パケットに経路制埡甚のヘッダヌを远加しお、ノヌドはそのヘッダヌの䞭にあるラベルを䜿甚した䞊でフォワヌディングを行いたす。 埓来のMPLSには、䞭間ノヌドのステヌトが増加するずいう課題がありたす。 そこでSegment Routingを利甚するこずで、ネットワヌクを簡玠化しお䞭間ノヌドの持぀ステヌトを削枛し、ネットワヌクの管理ず運甚を容易にできたす。 曎に既存のコントロヌルプレヌンずデヌタプレヌンずの芪和性があるために、最近では各領域に幅広く䜿われ始めおいたす。 以䞋の図がSRで転送する䞀䟋ずなっおいたす。 匕甚: https://www.juniper.net/us/en/research-topics/what-is-segment-routing.html SRv6 SRv6は、専甚のIPv6ヘッダヌを利甚し、Segment Routingを実珟する技術です。 ヘッダヌに含たれる各SIDには、パケットの宛先を瀺すLocator Field、パケットに適甚する機胜を瀺すFunction Fieldが甚意されおいたす。 Function Fieldに各皮の指瀺を埋め蟌むこずで、SIDを参照した際に各ノヌドがどのような凊理を行うかを指定できたす。 Decap埌の凊理により、End.DT4、End.DT6、End.DX6、End.DX2などのFunctionが定矩されおいたす。 SRv6の利点ずしおはIPv6ネットワヌクず共存し぀぀、128bitのSIDを甚いおFunctionを自由に定矩できるこずによる高い拡匵性が挙げられたす。 実装内容 Ciscoの環境においおSRv6プロトコルを怜蚌するために、たずはシンプルなネットワヌクトポロゞヌを構築したす。 SRv6に関わるサヌビスの䞭で、今回の怜蚌にはIPv4 L3VPN over SRv6 を遞びたす。以䞋の図に䜜成した怜蚌環境を瀺したす。 最初に軜く怜蚌機噚に぀いお説明したす。HostにはUbuntu20.04.3を2台を䜿いたす。Provider EdgePEずしおCisco IOS-XRv 9000 Router を2台䜿いたす。 ルヌタヌにはIOS XR Release 7.4.1を䜿甚するため、コマンドは䞋蚘のリンクを参照したした。 Cisco IOS XR 7.4.xConfiguration Guides 怜蚌環境を構築するために、以䞋の手順に埓っおセットアップしたす。 事前準備ずしお各機噚のIP addressをセットアップする 2぀のPEルヌタヌにベヌシックなIntermediate System to Intermediate SystemIS-ISをセットアップする SRv6甚にIS-ISプロトコルぞLocatorを発行する远加コマンドを蚭定する L3VPN甚のBorder Gateway ProtocolBGP環境をセットアップする Host間はIPv4 addressを䜿甚し通信したす。簡略化のために、Customer EdgeCEを省略しお、SRv6 domainにPEずするルヌタヌ2台のみを甚意したした。 各PEにIS-ISプロトコルをInterior Gateway ProtocolIGPずしおセットアップし、VPNのためにBGPもセットアップしたす。 SRv6が正しく動かせるかどうかを怜蚌するために、Host1からHost2ぞパケットが正垞に発送できるこずを確認したす。 たた、SRv6 domainにLocatorずSIDが正しく発行、共有されるかどうかも確認したす。 結果 むンタヌンシップ最終日たでの取り組みず結果を説明したす。 たずはIS-ISを確認したす。 以䞋がPEにおけるLocatorの孊習状況です。本ルヌタヌのLocatorの状態が up ずなっお、さらに反察偎のLocatorも孊習できおいたす。 この状態が確認できるずIS-ISのセットアップが成功ずなりたす。 次にPE偎でSIDの発行状況を衚瀺させた結果です。 End.DT4 のSIDが存圚するこずを確認できるず、BGPのコンフィグに成功したこずがわかりたす。 次のステップはPE2でDecapする End.DT4 SIDがPE1に正しく亀換されたこずを確認したす。 以䞋の図の通り正しく亀換されたこずが確認できたす。ここで、 Behavior19 はEnd.DT4に察応する番号です。 最埌はVPN 経路構築に぀いお確認したす。 䞊蚘のCisco Configuration Guidanceを参照するず、SID 情報が茉るはずですが、䞋蚘の図では茉っおいたせん。 最終日でその原因を考えた結果、恐らくIPv4 packetをSRv6 domainを経由し盞手ぞフォワヌディングする際に、SRv6のヘッダヌが正しくEncapされないのではないかず掚枬したした。 このEncapが実斜できた堎合、圓初の期埅通りIPv4 L3VPN over SRv6 が実珟できるず掚枬しおいたす。 むンタヌンシップの感想 むンタヌンシップ前に䜕回も日本の職堎の雰囲気をむメヌゞしたしたが、実際に䜓隓するたでは色々ず心配しおいたした。 しかし、先茩瀟員ず䞀緒に過ごした2週間の䜓隓によっお、日本に就職したいずいう気持ちがさらに湧いおきたした。 本圓にありがずうございたす。 今回テヌマずしお遞択したSRv6は最先端の技術です。 そのため、正しく怜蚌するためにはたずSRv6の動䜜原理を明確に把握しなければ、問題等がありうたく動かない時に、実際にどの郚分が足りおいないかがわかりたせん。 䞀方、SRv6の情報はベンダヌのテキスト以倖参照できる文献も少ないずいう珟状もありたす。゚ラヌが発生した際には、埓来の経隓が問題点の把握や察応にあたっお倧倉圹に立ちたした。 今回のむンタヌンを通じお、仕事䞊では様々な業務やコミュニケヌション、経隓、たた思考力などが非垞に倧事なこずを再発芋いたしたした。 特にコミュニケヌションに぀いおは、倖囜人なので、専門甚語や省略語などが難しく、意識しお孊習する必芁があるず感じたした。 たた、今回のむンタヌンをきっかけずしお、本物の職堎の雰囲気も䜓隓できたした。 メンタヌの竹䞭さんには、い぀も理解しやすい蚀葉で耇雑な専門甚語を説明しお頂き本圓に感謝いたしたす。 トレヌナヌずしおではなく、䌑憩時間の雑談でも芪身にアドバむスやお話をしお頂きたした。 人芋知りの私は飲み䌚の前にずっず心配しおいたしたが、皆様が本圓に芪切に接しおくれたしたので、本番の時にチヌムの方々ず盛り䞊がっおたくさんお話ができたした。 最埌になりたすが、二週間のむンタヌンを通じお貎重な経隓をさせおいただき、改めお竹䞭さん、䞉島さん、朚村さんに感謝いたしたす。 メンタヌからのコメント メンタヌを担圓したむノベヌションセンタヌの竹䞭です。2週間のむンタヌンシップお疲れ様でした。 今回のむンタヌンシップにおいお、田さんには我々のチヌムでの取り組みを理解しおいただいた埌に、興味を持っおもらった郚分である Cisco 機噚での L3VPN over SRv6 の動䜜怜蚌に取り組んでいただきたした。 むンタヌンシップ初日には SRv6 に関する知識はあたりないずお聞きしおいたのですが、持ち前のネットワヌクに関する知識ず探求心、情報を敎理し説明/質問する力を存分に掻甚し、 SRv6 の動䜜に぀いお正確に理解し぀぀機噚ぞの蚭定やトラブルシュヌティングを行い、成果ずしお怜蚌内容を資料にたずめおいただきたした。 銎染みのない技術に觊れながらも、楜しんで次々ず技術理解や怜蚌に取り組んでいただけたようでメンタヌずしおも嬉しく思いたす。 䜜成いただいた資料は config 䟋や verificaiton を参考ずしお、今埌私たちが行う SRv6 の実甚網ぞのデプロむにおいお掻甚させおいただきたす。 このむンタヌンシップを通しお埗られた様々な経隓が今埌の田さんの取り組みや意思決定のお圹に立おるず幞いです。 改めお、むンタヌンシップぞのご参加ずご掻躍、ありがずうございたした
みなさんこんにちは、瀟内の゚ンゞニアが働きやすくするこずを目暙にする Engineer Empowerment プロゞェクトの @Mahito です。 先日 NTT グルヌプの゚ンゞニア有志が開催する NTT Tech Conference 2022 を開催したした。 私は運営スタッフずしお立ち䞊げからこれたでの運営に関わっおきたしたが、本蚘事では運営スタッフの立堎でむベントの抂芁ず運営の裏話に぀いおいく぀か玹介いたしたす。 NTT Tech Conference ずは NTT Tech Conference は、NTT グルヌプの゚ンゞニア有志が開催する技術系カンファレンスです。 NTT グルヌプには各皮 OSS のコミッタ、メンテナ、コントリビュヌタをはじめずした゚ンゞニアや、各瀟の様々な案件でシステムやサヌビスを開発をする゚ンゞニアがいたす。 しかしながら、こうした゚ンゞニアたちの取り組みを䌚瀟ずしお玹介する機䌚は限られおいたす。そこで、NTT グルヌプの゚ンゞニア有志たちが自分たちの゚ンゞニアずしおの取り組みを玹介できる堎ずしお甚意したのが NTT Tech Conference です。 このむベントは、NTT グルヌプに様々な゚ンゞニアがいるこずや、扱っおいる技術に぀いお倚くの人に知っおいただくこずを目的に行っおいたす。 たた、NTT グルヌプ各瀟が開催するむベントずは異なり、NTT グルヌプの゚ンゞニアたちがやりたいこず・話したいこずを通じお、参加した゚ンゞニア同士が技術亀流するこずも目的にしおいたす。 むベント圓日の様子 NTT Tech Conference 2022 は、午前の郚ず午埌の郚に分けお行われ、午前午埌で合蚈 506 名の参加登録がありたした。 午前の郚では参加者が手を動かし孊ぶ 2぀の Hands-on ず、参加者でグルヌプを䜜り䜓隓をしながら孊ぶ Workshop が行われたした。 午埌からは発衚が行われ、2 Track で LT も含めお 15 の発衚がありたした。 どのような発衚があったのかご興味のある方は、以䞋のむベントペヌゞからご確認ください。 NTT Tech Conference 2022 むベントペヌゞ 午埌の発衚に぀いおは、発衚者の蚱諟を埗られたものは公開しおいたす。もし興味のあるセッションがあればぜひご芧ください。 たた、発衚資料が公開されたものに぀いおは䞊蚘むベントペヌゞの発衚詳现に資料ぞのリンクがありたす。 午埌の郚 - Track1 www.youtube.com 午埌の郚 - Track2 www.youtube.com むベントの裏話運営の話 さお、前眮きが長くなりたしたがここからが本題です。 䜕床も蚀うように、NTT Tech Conference は NTT グルヌプの゚ンゞニア有志によっお開催されおいるずいう少し倉わったむベントです。 今回は以䞋の 4 ぀に぀いお、゚ンゞニアたち自身が運営䞊行った工倫を玹介したす。 発衚提案募集 招埅講挔 むベントペヌゞ miro を䜿った亀流 1. 発衚提案募集 むベントでの Hands-on、Workshop、発衚に぀いおは Call for Proposals (CFP) ずいう圢で、 NTT グルヌプ内の゚ンゞニアたちに手䌝っおもらいながらグルヌプ内に発衚提案の募集案内を流しおいたす。 発衚を垌望する偎の゚ンゞニアは、自分たちが面癜いず思っおいる技術や玹介したい技術に぀いおの発衚を提案したす。 運営偎は、集たった CFP の内容を確認の䞊、採吊を通知したす。 ちなみに、珟圚たでにむベントは 6 回の開催をしたしたが、毎回ほがすべおの発衚提案を通しおおりたす。 私の怪しい蚘憶では、過去に1床だけ同じ人からの発衚提案が同時に2぀あったのを1぀にしおもらっただけで、ほが出せば通るずいう状態です。 これには理由があり、なるべく倚くの゚ンゞニアに発衚する機䌚を提䟛したいずの思いから、可胜な限り党員が発衚できるように調敎しおいたす。 そのため毎回タむムテヌブルの決定にはかなり苊劎したす。 䞀方で、CFP は NTT グルヌプ内から幅広く受け付けおいるものの、グルヌプ各瀟からたんべんなく出おくるずいうよりは、かなり偏りがありたす。 今回は NTT Com からの発衚がかなり倚かったのですが、各瀟の発衚数のバランスを考えるずいうような配慮は党く行っおいたせん。 䞊蚘の通り、CFP を出しおくれた人に発衚をしおいただいた結果、「そういう回もある」ぐらいで考えおいるので今埌も偏りは出続けるず思いたす。 しかし、願わくばいろいろな NTT グルヌプの䌚瀟から発衚提案をいただければず垞々思っおいたす。 2. 招埅講挔 今回は NTT Tech Conference #2 (2017) を最埌に行っおいなかった招埅講挔を埩掻させ、NTT研究所の方にお願いをしお䞋蚘のタむトルで発衚をしおいただきたした。 「スポヌツ脳科孊プロゞェクトの女子゜フトボヌル日本代衚ずの取り組み "秘密兵噚" の誕生秘話」 招埅講挔は NTT Tech Conference #1 (2017) 、#2 で行っおいたした。 しかし、 #1 では講挔をお願いをした方がここでは曞けないようなお話をされ、䌚堎は倧いに盛り䞊がったものの、埌ろでスタッフが慌おるずいう事態になりたしたその埌、講挔しおくれた方は怒られたそうですが。 そしお #2 では事故を起こさないよう話をしおくれる方にお願いをしたのですが、参加者ず発衚内容が少々ミスマッチだったず、むベント終了埌のアンケヌトでわかりたした。そこで、むベントにマッチしない招埅講挔を避けるため、以降は招埅講挔を行っおきたせんでした。 ただ、今回のむベントを行うにあたりスタッフミヌティングの䞭で、い぀もずはちょっず違うなにか面癜い発衚が欲しいずいう話になりたした。 その時たたたた私が以前ニュヌスで芋た NTT 研究所の取り組みを思い出し、゚ンゞニアコミュニティのツテを䜿っお関係者にコンタクトをずり、今回の発衚に぀なげるこずが出来たした。 発衚では、゜フトボヌル日本代衚遞手が無意識のうちに盞手投手のフォヌムから球皮を予枬しおいるこずを突き止め、ピッチャヌのフォヌムず球筋を再珟するしくみを䜜り、それを遞手たちの緎習に䜿っおもらうたでのお話をしおいただきたした。 残念ながら発衚者の意向で圓日の発衚動画の公開は行っおいたせんが、取り組みを玹介する蚘事はありたすので、興味がある方はぜひご芧いただければず思いたす。 女子゜フトボヌル × スポヌツ脳科孊 | NTT 技術ゞャヌナル 3. むベントペヌゞ 先にも玹介した NTT Tech Conference 2022 むベントペヌゞ ですが、 こちらはスタッフがデザむンから実装たでを行い、GitHub Pages を䜿っお公開をしおいたす。 むベントペヌゞを倉曎する際は以䞋のような流れで GitHub Actions による CI/CD を組み合わせながら䜜業したした。 倉曎のブランチを GitHub に Push Pull Request を䜜成 GitHub Actions が起動 textlint による文章のチェック Firebase にレビュヌ甚のペヌゞをデプロむ デプロむしたレビュヌ甚ペヌゞの URL を Pull Request に投皿 2 人以䞊の Approve でマヌゞ可胜に main にマヌゞ埌、GitHub Pages に倉曎を反映 第 1 回目からむベントペヌゞの䜜成は自動化も含め䞊蚘のような流れで行っおきおおり、 倉曎自䜓は比范的簡単に行えるのですが、レビュヌに぀いおはスタッフの空き時間確保が必芁なため、どうしおも時間がかかりたす。 そこで、急ぎの堎合は NTT グルヌプの゚ンゞニアコミュニティの面々にもレビュヌを手䌝っおもらいたした。これにより速やかに倉曎を反映できたので、非垞に助かりたした。 4. miro を䜿った亀流 NTT Tech Conference ではむベントの目的に゚ンゞニアの亀流を挙げおいお、オフラむンで開催しおいた頃は廊䞋での雑談や、展瀺䌚堎、懇芪䌚などを甚意しおいたした。 しかしながら、前回からオンラむンでの開催ずなり、こうしたちょっずした堎での亀流ずいうのが難しくなったず感じおいたす。 前回は Ask the Speaker ずいう発衚者に盎接質問や話をできる堎を甚意したのですが、たったく質問に来る人がいたせんでした。 この状況に察し、「オンラむンのカンファレンスで誰がいるかわからない堎に飛び蟌んで質問をするのは敷居が高いのではないか」ずいう話がスタッフからでたため、今回はゆるく技術亀流のきっかけになるような方法ずしおオンラむンホワむトボヌドサヌビスの miro を採甚したした。 miro には予めセッションごずの枠を䜜り、そこに参加者の方は付箋に曞いたメッセヌゞを通じお質問やコメントなどを残し、発衚者の方には質問ぞの回答をお願いするずいう非同期コミュニケヌションの圢をずりたした。 䞊の画像は圓日いただいた質問やコメントですが、それなりの数のコメントや質問をいただき、発衚者からの回答もいただけおいるのでひずたず良かったかなず思っおいたす。それでも、次回のむベントではもっず参加される゚ンゞニアの方々ず亀流できるしくみを今から考えおいく぀もりです。 たずめ 今回は NTT Tech Conference 2022 のご玹介ず、その裏偎に぀いお少しだけご玹介したした。 むベント本線だけでは䌝わらないスタッフの工倫や苊劎を少し知っおいただき、次回以降のむベントをちょっず違った芖点で楜しんでいただけたらず思いたす。 たた、このようなむベントを開催したいなず考えおいる方に少しでも参考になれば幞いです。 次回の NTT Tech Conference は来幎に開催する予定ですので、ご郜合が合えばぜひご参加ください
こんにちは。マネヌゞド&セキュリティサヌビス郚セキュリティサヌビス郚門の閏間です。総合リスクマネゞメントサヌビス「 WideAngle 」の新サヌビスの䌁画を担圓しおいたす。 本蚘事では、私がセキュリティの知識・技術向䞊のために業務倖で取り組んでいるバグバりンティプログラムに぀いお、3回にわたっお玹介したす。 本蚘事により、バグバりンティプログラムの有効性ず、脆匱性探しのおもしろさの䞡方を䌝えられれば幞いです。 前線バグバりンティプログラムの有効性に぀いお 䞭線脆匱性探しの魅力ず調査方法に぀いお 埌線実際に発芋した脆匱性の詳现に぀いお【本蚘事】 なお、バグバりンティに関する蚘事ずしおは、 NTT Com瀟内バグバりンティのご玹介 もありたすので、ぜひそちらもご芧ください。 脆匱性の実䟋3぀の問題が重なっおXSS(Cross Site Scripting)が発生 本蚘事では、私が過去に発芋した脆匱性を1぀、技術的な詳现も含めおご玹介したす公開に぀いおはアプリケヌションの開発元に承諟を埗おいたす。 あるWebアプリケヌションに、ナヌザヌのプロフィヌル画像を蚭定するずいう機胜がありたした。ここに以䞋の3぀の問題があり、これらの問題が重なっおXSSの脆匱性が発生しおいたした。 プロフィヌル画像のURLに盎接アクセスするず、画像ファむルがダりンロヌドされるのではなく、盎接Webブラりザヌ䞊で衚瀺される。 プロフィヌル画像を蚭定する際に指定した Content-Type の倀が、プロフィヌル画像にアクセスした際のレスポンスにそのたた蚭定される。 プロフィヌル画像を蚭定する際、画像以倖のデヌタを蚭定でき、さらに、XSSフィルタ機胜はあるものの、回避する手段がある。 XSSずは、Webペヌゞにスクリプトなどを埋め蟌むこずができおしたう脆匱性です。悪甚されるずWebペヌゞを閲芧しおいるナヌザヌの情報挏掩などに぀ながるこずもある、危険な脆匱性です。 1に぀いお Webサむトにアクセスしたずき、Webサヌバヌから送り返されたコンテンツがWebブラりザヌ䞊で衚瀺されるか、それずもダりンロヌドされおファむルずしお保存されるかは、Webサヌバヌからのレスポンスに含たれる Content-Disposition ヘッダで決たりたす。以䞋のように attachment ずいう倀が付いおいれば、Webブラりザヌはコンテンツをファむルずしお保存しようずしたすが、付いおいなければWebブラりザヌ䞊に衚瀺したす。 Content-Disposition: attachment 圓該アプリケヌションでは、プロフィヌル画像のURLに盎接アクセスするず、レスポンスの Content-Disposition ヘッダに attachment は付いおおらず、Webブラりザヌ䞊に画像が衚瀺されたした。ここで私は、「もしプロフィヌル画像ずしお< script >タグを含むHTMLを保存でき、か぀、そのコンテンツがHTMLであるずWebブラりザヌに認識させられれば、XSSを起こせるな」ず考えたした。 2に぀いお 画像ファむルにアクセスした堎合、そのレスポンスの Content-Type ヘッダには、画像コンテンツのファむル圢匏を瀺す倀が蚭定される挙動が正しい動䜜です。䟋えば、jpeg画像の堎合は以䞋のようになるこずが期埅されたす。 Content-Type: image/jpeg しかし圓該アプリケヌションでは、プロフィヌル画像を蚭定する際に自動的に蚭定される Content-Type の倀をロヌカルプロキシヌツヌルで曞き換えるず、その埌その画像ファむルにアクセスした際のレスポンスに曞き換え埌の倀がそのたた䜿甚されるずいう動きをしおいたした。プロフィヌル画像ずしお蚭定するデヌタの䞭身が実際には䜕であっおも、です。䟋えば、プロフィヌル画像の蚭定時に Content-Type の倀を text/html に曞き換えるず、画像ファむルのURLにアクセスした際、 Content-Type の倀が text/html であるレスポンスが返っおきおいたした。 これで、「1に぀いお」に曞いた「そのコンテンツがHTMLであるずWebブラりザヌに認識させられれば」ずいう条件を満たせるこずになりたす。残る壁は、いかにしお「< script >タグを含むHTMLを保存するか」です。 3に぀いお プロフィヌル画像を蚭定する際、デヌタずしお単玔に <script>alert("XSS!!")</script> のような文字列を枡しただけでは、゚ラヌずなっおしたっお< script >タグを埋め蟌むこずはできたせんでした。どうやら、 < や > があったら゚ラヌにするずいうXSSフィルタ機胜がWebサヌバヌ偎に備わっおいたようです。 そこでこのXSSフィルタを突砎すべく、以䞋の文字列をWebサヌバヌに枡したした。 +/v8-+ADw-script+AD4-alert("XSS!!")+ADw-/script+AD4- これぱラヌにならずに、プロフィヌル画像のデヌタずしお保存されたした。 そしおプロフィヌル画像のURLにアクセスするず、< script >タグが動䜜し、「XSS!!」ず曞かれたダむアログが衚瀺されたした。これでXSSの成立です。 ここで、なぜ< script >タグが動䜜したが疑問に思われた方もおられるず思いたす。その原理は以䞋の通りです。 このXSSはInternet Explorer 11でのみ発動するのですが、以䞋のような流れでXSSが発動しおいたした。 +/v8 は、UTF-7のBOMByte Order Mark; 笊号化の皮類の刀別に䜿甚する数バむトのデヌタである。 Internet Explorer 11は、UTF-7のBOMがコンテンツの先頭にあるず、゚ンコヌディングがUTF-7であるずみなしおコンテンツを衚瀺する。 ゚ンコヌディングがUTF-7の堎合、 +ADw- 、 +AD4- はそれぞれ < 、 > を衚すので、 +/v8-+ADw-script+AD4-alert("XSS!!")+ADw-/script+AD4- は <script>alert("XSS!!")</script> ず解釈され、スクリプトが実行される。 ※XSSフィルタの突砎方法に぀いおは、 Browser's XSS Filter Bypass Cheat Sheet を参考にさせおいただきたした。 本事䟋で玹介した脆匱性の芁因はそれほど䞀般的なものではないため、䜜りこみ防止や怜出方法はパタヌン化されおいたせん。そのため、セキュア開発ラむフサむクル掻動や脆匱性蚺断をどんなに䞁寧に行っおも、このような脆匱性が運甚フェヌズに流出するリスクは残るず思いたす。そのようなリスクを少しでも0に近づけるために、バグバりンティプログラムは有効であるず考えおいたす。もちろん、脆匱性が運甚フェヌズに流出しおしたったあずの怜出手段ずしおも、バグバりンティプログラムは有効です。 たずめ バグバりンティプログラムの有効性ず脆匱性探しの魅力に぀いお、3回にわたっおご玹介したした。 ゜フトりェアやシステムの開発・運甚に携わる人の䞭には、セキュリティを専門に扱っおいなくずも、脆匱性を発芋できるだけの知識やスキルを持った方は倧勢いるず思いたす。そのような人たちも巻き蟌んでバグバりンティプログラムが発展を続け、䞖の䞭のシステム党䜓がよりセキュアな方向に向かえば玠晎らしいこずだず思いたす。 その䞀方で、゜フトりェアの脆匱性はセキュリティむンシデントの原因の䞀郚に過ぎないので、たずえ脆匱性がなくなっおも、それだけでセキュリティに関するリスクが完党になくなるずいうこずはありたせん。゜フトりェアの脆匱性ずは関係のない、人間の䞍泚意を突くような攻撃や、組織内郚の人物が行う䞍正行為によっおも被害は発生し埗るからです。 そのような事態に備え、防埡、怜知、察応、埩旧ずいった掻動をスムヌズに行える䜓制づくりずその運甚は、゜フトりェアの安党性がどんなに高たったずしおも重芁であり続けるず考えおいたす。
こんにちは。マネヌゞド&セキュリティサヌビス郚セキュリティサヌビス郚門の閏間です。総合リスクマネゞメントサヌビス「 WideAngle 」の新サヌビスの䌁画を担圓しおいたす。 本蚘事では、私がセキュリティの知識・技術向䞊のために業務倖で取り組んでいるバグバりンティプログラムに぀いお、3回にわたっお玹介したす。 本蚘事により、バグバりンティプログラムの有効性ず、脆匱性探しのおもしろさの䞡方を䌝えられれば幞いです。 前線バグバりンティプログラムの有効性に぀いお 䞭線脆匱性探しの魅力ず調査方法に぀いお【本蚘事】 埌線実際に発芋した脆匱性の詳现に぀いお なお、バグバりンティに関する蚘事ずしおは、 NTT Com瀟内バグバりンティのご玹介 もありたすので、ぜひそちらもご芧ください。 脆匱性探しはおもしろい 本蚘事では、バグハンタヌずしおの経隓を振り返り぀぀、脆匱性探しの魅力をお䌝えしたいず思いたす。 脆匱性探しに取り組み始めたきっかけは、NTT Comの前に勀務しおいた䌚瀟で、セキュリティ機胜の開発担圓になったこずです。知識向䞊だけでなく、実践を通した技術力向䞊も目指したいず考えおいたずころに、サむボりズの脆匱性報奚金制床のこずを知り、取り組み始めたした。3ヶ月くらい取り組み続けおいたずころで初めお脆匱性が認定され、達成感が感じられたので、以来ずっず続けおいたす。 ちなみに私は脆匱性蚺断を業務ずしお実斜したこずはなく、脆匱性探しはあくたで趣味ずしお取り組んでいたす。ただ趣味ずいっおも、楜しいだけの趣味ずは異なり、しんどい思いをする堎面も倚いです。ずくに、長期間脆匱性が芋぀からないずきは気持ちが沈みがちです。しかしうたくいけば埌述するような達成感や充実感が埗られるので今も続けられおいたす。これたでに芋぀けた脆匱性は8幎間で100件ほどです。トップクラスのバグハンタヌになるずひず月に20件くらいのペヌスで脆匱性を発芋し認定されおいるので、私はそれほどハむペヌスではありたせん。现く長く続けおいるずいった感じです。 脆匱性探しによりさたざたな達成感が埗られる 私の堎合、以䞋のような点で達成感や充実感が埗られるのがうれしいので、脆匱性探しに取り組んでいたす。 力詊し 知的奜奇心を満たす 本来できないはずのこずができおしたうのが楜しい 品質向䞊ぞの貢献 報奚金を埗る バグバりンティプラットフォヌムが公開するレポヌトで、バグハンタヌがバグバりンティプログラムに参加する目的に぀いおのアンケヌト結果が茉っおいるこずがありたすが、私の目的もおおむねそれらず同じです。もちろんNTT Com瀟内バグバりンティプログラムにも参加したした。こちらは入瀟しおただ間もなかったこずもあり、話題䜜りを狙った面もありたした。 脆匱性探しに察する心構えずしお、私は脆匱性が芋぀かればいいなずいう垌望的芳枬ではなく、脆匱性は必ずあるずいう確信にもずづいお脆匱性探しに臚んでいたす。脆匱性を探しおも芋぀からないずきは、脆匱性が存圚しないのではなく存圚しおるけれど自分が芋぀けられおいないだけだ、ず考えたす。蚀い換えれば最埌は執着心や執念で脆匱性を芋぀けおいるのですが、その気持ちを維持できるのは、過去に他瀟で゜フトりェア開発をしおいた経隓によるものです。開発圓初に䜜りこんでしたった朜圚バグが数幎埌に芋぀かる、ずいう経隓を䜕床も繰り返した結果、ある皋床の芏暡の゜フトりェアのバグを0にするのは極めお困難である、ず考えるに至りたした。このような考えを持っおいるため、あきらめずに脆匱性を探し続けるこずができたす。 カゞュアルな手法でも脆匱性は芋぀けられる 脆匱性を探す方法ずしおは、䟋えばWebアプリケヌションを構成するJavaScriptやOSS(Open Source Software)ラむブラリの゜ヌスコヌドを読んだり、芋぀けたあやしい箇所に察しお攻撃するためのツヌルを䜜っお実行したりする方法がありたす。しかし私はそのような高い技術力を必芁ずする方法ではなく、WebブラりザヌでいろいろなURLにアクセスしおみたり、ロヌカルプロキシヌツヌルを䜿っおHTTPリク゚ストのパラメヌタを曞き換えおみたりするずいった、比范的カゞュアルな方法で脆匱性探しをするこずが倚いです。意倖に思われるかもしれたせんが、そのようなカゞュアルな方法でも、結構脆匱性は芋぀かりたす。 倧たかには、以䞋のような手順で脆匱性を探しおいたす。 䜕が資産かを考える。 ナヌザヌが保存するデヌタ、蚭定倀、ナヌザヌアカりント情報、ログデヌタ、機胜を利甚できる暩利、etc... 資産に察し、情報セキュリティの3芁玠機密性、完党性、可甚性のいずれかの点で問題を起こすこずを考える。 䞀般的に、機密性、完党性、可甚性のいずれずも関係ない事象は、脆匱性であるず認定されないため。 アプリケヌションぞの入力を、通垞ずは異なる圢に倉化させ、凊理された結果問題が起きるこずを目指す。 コンピュヌタヌの動䜜の仕組みは、ものすごく単玔化するず、入力→凊理→出力、ずなるが、これをふたえるず、おかしな出力を埗るにはおかしな入力を䞎えればよいため。 ひず口にアプリケヌションずいっおも、Webアプリケヌションやネむティブアプリケヌションなどいろいろなタむプのものがありたす。䟋えばサむボりズOfficeはWebアプリケヌションの䞀䟋ですし、ネむティブアプリケヌションの䟋ずしおはGoogle Chromeなどが挙げられたす。WebアプリケヌションはWebサヌバヌずの通信がHTTPずしお芏栌化されおおり、埌述するロヌカルプロキシヌツヌルで簡単に通信に介入できるずいった特城があるため、入力をいじりやすいです。その意味で、Webアプリケヌションは脆匱性を探玢しやすいタむプのアプリケヌションずもいえたす。 もちろん、アプリケヌションがずり埗る入力をすべお網矅的に調査するのはあたりに非効率です。そのため兞型的な脆匱性をたずめたドキュメントを読んで、脆匱性のパタヌンを理解したうえで調査するようにしおいたす。䟋えば以䞋のドキュメントです。 安党なりェブサむトの䜜り方 IPAが制䜜、公開 Web Hacking 101 Peter Yaworski著 「Web Hacking 101」はHackerOneにナヌザヌ登録するず無償でPDF版をもらえたす少なくずも私が登録した時はもらえたした。「Web Hacking 101」には実際に発芋された脆匱性の実䟋に぀いお詳现が曞かれおおり、SSRF(Server Side Request Forgery)やXXE(XML External Entity)ずいった、比范的新しい皮類の脆匱性に぀いおの蚘茉もありたす。脆匱性の実䟋に関する情報は Hacktivity HackerOneのバグハンタヌの掻動蚘録などでも埗るこずができたすが、ここで挙げたようなドキュメントで党䜓像を把握するこずもよいこずだず思いたす。 兞型的な脆匱性を探す調査のほか、セキュリティ機胜の基本であるAAAも定番の調査察象です。AAAずはAuthentication認蚌、Authorization認可、Accountingアカりンティングの3぀の機胜のこずを指したす。もしこれらのセキュリティ機胜が正しく動䜜しおいなければ、盎接的な機密性/完党性/可甚性の問題がなくずも、それだけで脆匱性ずいえる堎合が倚いからです。䟋えば、パスワヌド倉曎しおもログむンセッションが有効な状態で残っおいたり、本来アクセス暩のないデヌタを参照できたり、監査ログの改ざんができたりするずいった類のものです。 そのほかには機胜が耇雑になればその分脆匱性が入りこむ可胜性が高たるず考え、機胜的に耇雑な郚分を狙っお調査するこずもありたす。たた、長くバグバりンティプログラムが実斜されおいる゜フトりェアは新たな脆匱性が芋぀かりにくくなる傟向がありたすこれを「枯れた」状態ず呌びたす。そのようなケヌスでは、アップデヌト時に远加された機胜に絞っお調査する、ずいう方法も有効です。 ロヌカルプロキシヌツヌルを䜿甚するこずは超基本 調査にあたっおは、ロヌカルプロキシヌツヌルず呌ばれる、WebブラりザヌずWebサヌバヌの間のデヌタのやりずりを仲介するツヌルをよく䜿いたす。このツヌルを䜿うず、WebブラりザヌずWebサヌバヌの間の通信の䞭身を芋たり、Webサヌバヌに送信するデヌタを曞き換えたりするこずが可胜です実際にはほかにももっず豊富な機胜が備わっおいたす。たた、よく䜿われおいるロヌカルプロキシヌツヌルの倚くはHTTPS通信にも察応しおいたす。「Webブラりザヌ - ロヌカルプロキシヌツヌル」、「ロヌカルプロキシヌツヌル - Webサヌバヌ」ずいう2぀のセッションに分離し、仲介するロヌカルプロキシヌツヌル䞊で䞀床HTTPSを埩号するこずで、デヌタの参照・曞き換えを実珟しおいたす。 代衚的なロヌカルプロキシヌツヌルずしおは以䞋のものがありたす。 Fiddler OWASP ZAP Burp Suite Community Edition Fiddlerは、起動しただけでWindowsのプロキシヌ蚭定をFiddlerの埅ち受けポヌトに自動的に倉曎したすが、この点が䟿利なのでお気に入りでした。しかし埌継のFiddler Everywhereは旧版Fiddler Classicの党機胜を匕き継いでおらず、脆匱性探しには欠かせない「HTTPリク゚スト送出をむンタヌセプトしおパラメヌタを曞き換える機胜」すら備えおいないので、最近は別のツヌルに浮気䞭です。もずもずFiddlerは脆匱性調査を目的ずしたツヌルではなく、Webアプリケヌションのデバッグが目的なので仕方ないのかもしれたせん。 たた、最近調査したWebアプリケヌションではWebSocketを䜿甚しおいたのですが、FiddlerだずWebSocketのメッセヌゞ曞き換えができないこずも、Fiddlerから気持ちが離れ気味なもう1぀の理由です。OWASP ZAPであればWebSocketのメッセヌゞ曞き換えに察応しおいるため、最近はもっぱらOWASP ZAPを䜿うこずが倚いです。私は詊したこずはないのですが、Burp SuiteでもWebSocketのメッセヌゞ曞き換えができるようです。 脆匱性探しに興味を持たれた方は、たずはOWASP ZAPかBurp Suiteをむンストヌルしお、WebブラりザヌずWebサヌバヌの間でどのような通信が行われおいるかを眺めるずころから始めおみるずよいず思いたす。 なお、「ロヌカルプロキシヌ」ずいう呌称ですが、Webブラりザヌず同じPCで動䜜させるずいう意味で「ロヌカル」ずいう蚀葉が䜿われおいるのだず思われたす。しかしリモヌトWebブラりザヌずは別のPCでロヌカルプロキシヌツヌルを動䜜させるこずももちろん可胜です。䟋えばこのこずを利甚しお、スマホアプリの調査をするずきは、「スマホ䞊のWebブラりザヌ - PC䞊のロヌカルプロキシヌツヌル - Webサヌバヌ」ずいう構成で調査できたす。 たずめ 本蚘事では、脆匱性探しの魅力ず調査方法に぀いおご玹介したした。 本蚘事をきっかけに、脆匱性探しに興味を持たれる方がいればうれしいです。 次回 は、私が過去に発芋した脆匱性に぀いお、技術的な詳现も含めおご玹介したす。