RPKI監視 roamon を試してみた

はじめに

IXなどで稼働するBGPは昔から度々BGPハイジャックが問題になっていて、悪意あるなし関係なく、大規模被害が発生していました。

www.atmarkit.co.jp

そこで生まれたのが RPKI (資源公開鍵基盤)ですが、これにより、不正なOrigin ASとIP Prefix(経路)の組み合わせを受け取らないようにできます。 RPKIで取得するAS番号とIP Prefixの組み合わせをROV(ロア)といいます

www.nic.ad.jp

しかしRPKIで管理するROAは重点的に監視していないと、ROAが実際のBGP経路と異なってしまうことにより、ネットワークの到達生が失われてしまう事故が発生してしまいます。 事例もいくつか報告されているようです。 そこで考えられたのが roamon と呼ばれるROA用監視システムです。

blog.nic.ad.jp

roamonについて

roamonは三つのコンポーネントに分かれており、それぞれ以下のような役割を持ちます。

roamon-verify: ROVの結果をIPアドレスプレフィックスやAS番号を指定してみることができるコマンドラインツールです。 RoutinatorからROAを検証した結果であるVRP(Validated ROA Payloads)を取得し、オレゴン大学のBGP経路のアーカイブと比較しています。

roamon-alert: 予めAS番号を指定しておいて、そのASから経路広告されているBGP経路が異なった場合にメールかSlackで通知を投げるツールです。 メール送信サービスのsmtp server、メールや通知などデータを格納しておくPostgreSQLが含まれます。

roamon-web: alert の通知先を管理するユーザ・インターフェースを提供します。

roamon 環境構築手順

意外と手順につまずいてしまったので手順をメモしておく

ホストOS :Debian 10 実行ユーザ:root 注意事項として3コンポーネントは全て同じホストで構築してください

roamon-verify 構築

# pip3は前もってインストールしておくこと
pip3 install netaddr pyfiglet tqdm pyasn beautifulsoup4 requests

# Clone
git clone https://github.com/taiji-k/roamon-verify.git
cd roamon-verify

# Build
sudo docker build -t roamon ./docker

# Run コンテナログイン
sudo docker run --rm -it roamon /bin/bash
cd /roamon-verify

ROAデータの取得

# ROA 全データ取得
python3 roamon_verify_controller.py get --all

# ROA BGPデータ取得
python3 roamon_verify_controller.py get --bgp

# ROA 検証済みデータ取得
python3 roamon_verify_controller.py get --roa

VRP(検証済ROAペイロード)とBGPルートを比較してROVを生成

python3 roamon_verify_controller.py rov [--asn <AS番号>| --ip <IP Prefix>]

64511    192.168.1.0/24 VALID
64511    172.16.0.0/16 VALID
64510    10.0.0.0/8 INVALID

roamon-alert 構築

# Clone
git clone https://github.com/taiji-k/roamon-alert.git
cd roamon-alert

# SMTP Server、PostgreSQLの起動
# alert状況を表示し続けるためこれ以降は別Termを開く必要がある
sudo docker-compose -f ./docker/docker-compose.yml up

実行例

root@buster:~/roamon-alert/docker# sudo docker-compose -f ./docker-compose.yml up
Starting docker_smtp-test-server_1 ...
Starting docker_smtp-test-server_1 ... done
Starting roamon-alert              ... done
Attaching to postgresql, docker_smtp-test-server_1, roamon-alert
smtp-test-server_1  | 2020/07/31 14:17:08 Using in-memory storage
smtp-test-server_1  | 2020/07/31 14:17:08 [SMTP] Binding to address: 0.0.0.0:1025
smtp-test-server_1  | [HTTP] Binding to address: 0.0.0.0:8025
smtp-test-server_1  | Creating API v1 with WebPath:
smtp-test-server_1  | Creating API v2 with WebPath:
smtp-test-server_1  | 2020/07/31 14:17:08 Serving under http://0.0.0.0:8025/
postgresql          | The files belonging to this database system will be owned by user "postgres".
postgresql          | This user must also own the server process.
postgresql          |
postgresql          | The database cluster will be initialized with locale "en_US.utf8".
postgresql          | The default text search configuration will be set to "english".

(snip)

smtp-test-server_1  | [APIv1] KEEPALIVE /api/v1/events
smtp-test-server_1  | [APIv1] KEEPALIVE /api/v1/events
smtp-test-server_1  | [APIv1] KEEPALIVE /api/v1/events
smtp-test-server_1  | [APIv1] KEEPALIVE /api/v1/events
smtp-test-server_1  | [APIv1] KEEPALIVE /api/v1/events

roamon-alertデーモンの起動

sudo docker exec -it roamon-alert  /bin/bash
># pipenv install
># pipenv shell
(roamon-alert) ># python3 roamon_alert_controller.py daemon --start
# 連絡先追加
sudo python3 roamon_alert_controller.py add --asn 3333 --type email --dest example3333@example.com

# 通知連絡先リスト表示
$ sudo python3 roamon_alert_controller.py list
1       email   example1@example.com                         None            1899    
2       email   example2@example.com                         147.162.0.0/15  None    
2       email   example2@example.com                         192.168.30.0/24 None         
2       email   example2@example.com                         None            137
3       email   example3@example.com                         None            327687  
4       slack   https://hooks.slack.com/services/TBZC4xxxx   147.162.0.0/15  None  

roamon-web 構築

# yarnのインストール
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn

# Clone
git clone https://github.com/taiji-k/roamon-web.git
cd roamon-web

# package-lock.jsonを元に yarnによるwebインストール
yarn install

# web起動
yarn dev

実行例

root@buster:~/roamon-web# yarn dev
yarn run v1.22.4
$ cross-env NODE_ENV=development nodemon server/index.js --watch server
[nodemon] 1.19.4
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): server/**/*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node server/index.js`
ℹ Preparing project for development                                                                                                                                                                                                 14:18:08
ℹ Initial build may take a while                                                                                                                                                                                                    14:18:08
✔ Builder initialized                                                                                                                                                                                                               14:18:08
✔ Nuxt files generated                                                                                                                                                                                                              14:18:08

✔ Client
  Compiled successfully in 21.71s

✔ Server
  Compiled successfully in 17.80s

ℹ Waiting for file changes                                                                                                                                                                                                          14:18:34

 READY  Server listening on http://localhost:3000

http://localhost:3000ブラウザーでアクセス f:id:thelarklife1021:20200801024937p:plain

通知内容の確認や、作成が可能 f:id:thelarklife1021:20200801024750p:plain

今日は一旦ここまで 以上

SRv6 概要とデモ

はじめに

ネットワーク分野で盛り上がっているSRv6 についての自分の理解やデモについてご紹介します。

SRv6 概要

Segment Routing over IPv6 (SRv6)は、これまでのDst(行き先)でパケット転送を制御するのではなく、
セグメントというホップを決めてパケットを1ホップずつIPv6で転送するルーティング方式です。

自由なルーティングパスを生成できるため、以下のようにコンテンツ内容でルーティングパスを生成することもできます。

f:id:thelarklife1021:20200623235031p:plain

SRv6 特徴

以下の特徴があります。

ソースルーティング:経由するノード一つ一つを送信元で制御するルーティング方式

TI-LFA:あらゆるトポロジに対して100%バックアップ経路を用意することが出来る方式

IPv6ルーティング:IPv6のDstを見て次のセグメントをまでパケット転送しているため、SRv6非対応のIPv6対応スイッチがそのまま使えます

SRH

Segment Routing Header は以下のようになっており、IPv6拡張ヘッダーを利用して実現しています。 Segment List にSegment IDというSegmentを識別するための情報を、経由するSegmentノード分入れることになります。

f:id:thelarklife1021:20200624001240p:plain

Basic Funnction

SRv6では特定のノードで以下のようなFunctionを実行してパケットをDecapしたりルーティングさせたり、様々な制御が可能になっています。

f:id:thelarklife1021:20200624004213p:plain

SRv6 Demo

2020/06 現在、以下の方法でDemoは可能です。 今回は手軽そうなiproute2とNetwork Namespaceを使用したいと思います。

  • iproute2
  • VPP

  • Zebra2.0

  • FRR

以下でデモ用vagrantを作成しましたのでREADME通りにVM上に環境を作れます。 4タイプのルーティングパスのデモが可能で自由に試せます。

github.com

f:id:thelarklife1021:20200624012444p:plain

任意の場所でtcpdumpを実行すれば以下の通りSRHが確認できます。

f:id:thelarklife1021:20200624011945p:plain

TungstenFabric&Openstack&Kubernetes構築 on Ubuntu18.04/16.04構築

仕事柄SDNについて扱うことがあり、今回はTungstenFabricについてまとめておきたいと思います。

https://github.com/Juniper/contrail-ansible-deployer

去年から活発に更新されていますが、改めて構築してみます。 今回はUbuntu18.04で挑戦してみます。  

※ multi-nodeで実施する場合VirtualBoxでは内部ネットワーク使ったり、natネットワーク使ったり、CentOSのバージョン変えたりと色々試しましたが、ansibleが通っても、ネットワークとても不安定なので、all-in-oneで構築しない限りAWSGCP使うのが賢明かも。アダプタの割り当てとか意外と神経使いますよね。  

Ubuntu18.04

(All node) sudo su -
(All node) apt update
(Controller Node) apt install python-pip git -y
(vRouter Node) apt install python -y
(Controller Node) pip install ansible==2.4.2.0 requests

(Controller Node) ssh-keygen
(Controller Node) cd .ssh/
(Controller Node) cat id_rsa.pub >> authorized_keys
(vRouter Node) vi .ssh/authorized_keys  #Controller Nodeの .ssh/id_rsa.pubを追記してください
(Controller Node) git clone -b R5.1 http://github.com/Juniper/contrail-ansible-deployer
(Controller Node) cd contrail-ansible-deployer

cat < 'EOF' > config/instances.yaml
provider_config:
  bms:
   ssh_user: root
   ssh_public_key: /root/.ssh/id_rsa.pub
   ssh_private_key: /root/.ssh/id_rsa
   domainsuffix: local
   ntpserver: ntp.nict.jp
instances:
  bms1:
    provider: bms
    ip: 172.31.28.202 # Controller Node IP
    roles:
      config_database:
      config:
      control:
      analytics:
      analytics_database:
      webui:
      k8s_master:
      kubemanager:
      openstack:
  bms11:
    provider: bms
    ip: 172.31.7.229  # vRouter Node IP
    roles:
      vrouter:
      k8s_node:
      openstack_compute:   
contrail_configuration:
  RABBITMQ_NODE_PORT: 5673
  AUTH_MODE: keystone
  KEYSTONE_AUTH_URL_VERSION: /v3
  CONTRAIL_CONTAINER_TAG: r5.1
  KUBERNETES_CLUSTER_PROJECT: {}
  JVM_EXTRA_OPTS: "-Xms128m -Xmx1g"
  CONFIG_DATABASE_NODEMGR__DEFAULTS__minimum_diskGB: "2"
  DATABASE_NODEMGR__DEFAULTS__minimum_diskGB: "2"
kolla_config:
  kolla_globals:
    kolla_internal_vip_address: 172.31.28.202  # Controller Node IP
    enable_ironic: no
    enable_haproxy: no
    enable_swift: no
  kolla_passwords:
    keystone_admin_password: contrail123
global_configuration:
  CONTAINER_REGISTRY: tungstenfabric
EOF
time ansible-playbook -i inventory/ playbooks/configure_instances.yml -vvvv
time ansible-playbook -i inventory/ playbooks/install_openstack.yml -vvvv
time ansible-playbook -i inventory/ playbooks/install_k8s.yml -vvvv
time ansible-playbook -i inventory/ playbooks/install_contrail.yml -vvvv
KubernetesのAnsibleで以下のようなエラーになった場合はall nodeでkubernetes-cni=0.6.0-00をインストールしてください
kubelet : Depends: kubernetes-cni (= 0.6.0) but 0.7.5-00 is to be installed 

sudo apt install kubernetes-cni=0.6.0-00

Playbookは正常に回りましたが、Contrail Configのapiでエラーが・・・

# contrail-status

== Contrail control ==
control: active
nodemgr: active
named: active
dns: active

== Contrail config-database ==
nodemgr: active
zookeeper: active
rabbitmq: active
cassandra: active

== Contrail kubernetes ==
kube-manager: active

== Contrail database ==
nodemgr: active
query-engine: active
cassandra: active

== Contrail analytics ==
nodemgr: active
api: active
collector: active

== Contrail webui ==
web: active
job: active

== Contrail device-manager ==

== Contrail config ==
svc-monitor: active
nodemgr: active
device-manager: active
api: initializing (Generic Connection:Keystone[] connection down)
schema: active

 

docker exec -it config_api_1 tail -n100 /var/log/contrail/contrail-api.log
~snip~
06/17/2019 07:54:35 AM [contrail-api] [ERROR]: Failed to resync: Unable to establish connection to http://127.0.0.1:35357/v3/auth/tokens
~snip~

色々不具合が重なって、Keystoneにアクセスできなくなってるのかな・・・

どうやらAnsible がUbuntu18.04から導入されたnetplanに対応していないため、結果なっているように見える。 次記事で詳細を記載したいと思います。 試しに16.04インストールしてみました。 手順は全く同じでやりました。  

# contrail-status

== Contrail control ==
control: active
nodemgr: active
named: active
dns: active

== Contrail config-database ==
nodemgr: active
zookeeper: active
rabbitmq: active
cassandra: active

== Contrail kubernetes ==
kube-manager: active

== Contrail database ==
nodemgr: active
query-engine: active
cassandra: active

== Contrail analytics ==
nodemgr: active
api: active
collector: active

== Contrail webui ==
web: active
job: active

== Contrail device-manager ==

== Contrail config ==
svc-monitor: active
nodemgr: active
device-manager: active
api: active
schema: active

#

なるほどnetplanが導入以前なので Ubuntu16.04だとうまくいくみたいですね。

 

Hello World !! ブログ始めました

Hello !!

ITを仕事に、音楽を趣味でやっている30のものです。

 

技術中心に様々なことを発信していきたいと思います。

並行してQiitaやGithubもあげて行きます。

 

なぜブログを始めたかと申しますと、ざっくり以下5つです。

  1. エンジニアとしての成果、実績を見える化していきたかったから
  2. ブログ投稿をきっかけにすれば、いろいろ活動的になのでは???
  3. ブログから繋がり持てたら良いな・・と思ったから
  4. なかなか発信できない内容を発信したかったから
  5. 尊敬する先輩方はみんなしているから

 

 4.については詳細を後日お話ししていたいと思います!

 

近日あげる予定の内容

・ITクラウド(SDN/SV/NW/etc)周りのお話し

・DB

OSS

・近況とか日常の出来事

 

ではでは、また次回