hiroportation

ITの話だったり、音楽の話、便利なガジェットの話題などを発信しています

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:h600

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

以上

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だとうまくいくみたいですね。