2019年7月12日

ブロードバンドタワー國武です。

今回は、IRRd  について取り上げたいと思います。

IRRd は、Internet Routing Registory のデータベースの実装の1つです。

https://github.com/irrdnet/irrd

これを見ると、数年前から開発が止まっているなーと思っていたんですが、どうやら最近 IRRd version 4を開発していたようです。

https://github.com/irrdnet/irrd4

Python + PostgreSQL を使って、フルスクラッチで書き直しされています。ドキュメントも充実していて、Sphinx で書かれています。

上記ドキュメントを見れば、セットアップも容易ではあるのですが、若干手間取ったところもあったので、整理する意味も込めて今回のブログを書いてみました。なお新旧のIRRd を区別するため、下記では、古い実装の方を旧IRRd と記載します。特に言及がない場合は、今回取り上げる IRRd version 4の新しい実装を指しています。

セットアップ  

今回ベースとするのは、CentOS7です。また、irrdユーザで作業する前提なので、お気をつけください。

関連パッケージのインストール  

$ sudo yum install epel-release
$ sudo yum install python-virtualenv python36 gcc python36-devel

IRRd は Python 3系で動きます。また、pip で関連ライブラリをインストールする際に、gcc や python36-devel が必要となるのでこの時点で入れておきましょう。

PostgreSQLのインストール  

IRRd では、psycopg2の gen_random_uuid() を利用しています。これは PostgreSQL9.4 からのサポートなので、 CentOS7の標準パッケージだとPostgreSQL9.2 なので動きません。またドキュメントにもIRRd version 4は 、9.6 や 10.5 でテストされているとの記述もありましたので、ここでは PostgreSQL9.6 をインストールします。

$ sudo yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
$ yum install postgresql96-server postgresql96-contrib

ここで postgresql96-contrib をインストールしているのは psycopg2を利用するためです。これがないと動作しません。

PostgreSQL初期化および起動  

次に、DBの初期化と起動を実施します。

# /usr/pgsql-9.6/bin/postgresql96-setup initdb
# systemctl start postgresql-9.6

irrdユーザではなく別のユーザ権限で動かす場合は、この時点で pg_hba.conf の修正をしておくといいかもしれません。

PostgreSQL に DBを作成  

# su - postgres
$ psql
postgres=# create database irrd;
CREATE DATABASE
postgres=# CREATE ROLE irrd WITH LOGIN ENCRYPTED PASSWORD 'irrd';
CREATE ROLE
postgres=# GRANT ALL PRIVILEGES ON DATABASE irrd TO irrd;
GRANT
postgres=# \c irrd
You are now connected to database "irrd" as user "postgres".
irrd=# CREATE EXTENSION IF NOT EXISTS pgcrypto;
irrd=#\q

irrd用のDBを作成します。もし、postgresql96-contrib をインストールし忘れていたら

irrd=# CREATE EXTENSION IF NOT EXISTS pgcrypto;

を実行する際に

ERROR:  could not open extension control file "/usr/pgsql-9.6/share/extension/pgcrypto.control": No such file or directory

とエラーが表示されます。

virtualenvでのセットアップ  

$ virtualenv -p python3 /home/irrd/irrd-venv
$ source irrd-venv/bin/activate
(irrd-venv) $ pip3 install irrd

この時、irrd=4.0.1 のように version を指定することも可能なようですが、素直に最新版をインストールしておきます。

irrd.yaml の用意  

IRRd のときは独自設定ファイルでしたが、IRRd version 4では yaml 形式で設定を書きます。

---
irrd:
    database_url: 'postgresql://irrd:irrd@localhost:5432/irrd'

    access_lists:
        http_database_status:
            - '::/32'
            - '127.0.0.1'
            - '192.168.33.0/24'
            - '192.168.34.0/24'

    server:
        http:
            access_list: http_database_status
            interface: '::0'
            port: 8080
        whois:
            interface: '::0'
            max_connections: 50
            port: 8043

    auth:
        gnupg_keyring: /home/irrd/gnupg-keyring/
        override_password: {hash}

    email:
        footer: 'email footer'
        from: kokunitake@example.com
        smtp: localhost
        notification_header: |
            This is to notify you of changes in the {sources_str} database
            or object authorisation failures.

            You may receive this message because you are listed in
            the notify attribute on the changed object(s), or because
            you are listed in the mnt-nfy or upd-to attribute on a maintainer
            of the object(s).
    log:
        logfile_path: /home/irrd/irrd.log
        level: DEBUG

    sources_default:
        - RADB

    sources:
        RADB:
            authoritative: false
            keep_journal: true
            import_serial_source: 'ftp://ftp.example.com/radb/dbase/RADB.CURRENTSERIAL'
            import_source: 'ftp://ftp.example.com/radb/dbase/radb.db.gz'
            nrtm_host: whois.example.com
            nrtm_port: 43
            object_class_filter:
                - as-set
                - aut-num
                - filter-set
                - inet-rtr
                - key-cert
                - mntner
                - peering-set
                - route
                - route6
                - route-set
                - rtr-set

{ftp|whois}.example.com、nrtm_port などは、ミラーしたいサイトの情報を記載します。

また、object_class_filterは、ここに書いたやつが落とされる、というわけではなくて、ミラーしてほしい Object を列挙することで取り込むことができます。その他、詳細については

Configuration

を参照してください。

DBのセットアップ  

初期テーブルなどを作成します。このときに前述した設定ファイルが必要となります。

$ /home/irrd/irrd-venv/bin/irrd_database_upgrade --config /home/irrd/irrd.yaml

もし

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedFunction) function gen_random_uuid() does not exist
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

なんてエラー吐いてたら CentOS7 標準の PostgreSQL 9.2 で起動しているかも?再度確認しなおしてみてください。

IRRd の起動  

次のように起動できます。

$ /home/irrd/irrd-venv/bin/twistd --uid=irrd --pidfile=/home/irrd/irrd.pid irrd --config /home/irrd/irrd.yaml

Systemd configuration

には、systemctl を使った起動例も記載があります。

動作を眺める  

上記の設定サンプルだと、DEBUGモードで動いているので、

$ tail -f /home/irrd/irrd.log

のように眺めていると、ミラーファイルのダウンロード、取り込み開始、whoisクエリのリクエストなども眺められて、なかなか楽しいです。

ここが良くなったかも!

ミラーの初期設定中は従来と同じく、負荷が高いです。これは以前の IRRd も一緒なのでしかたないですね。しかし、旧IRRd では、起動中だと負荷が高くても whois の応答もできなかったんですが、IRRd version 4は、データがなければないなりに応答を返すことできますね。また、WebUI もついてるので、今後さらなる利便性の向上なども期待できそうです。

ただ当たり前ではありますが、実際の運用となると reseed が必要になる場面ではどうするのか、ミラーの状態を確認する方法は?など、ノウハウの蓄積が必要ですね。

 IRRd を手元で動かしたいという要望を持った現場は、あまりない気もしますが、旧IRRdをお使いの方は、一度試してみるのもいいかもしれません。

 

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

アバター

投稿者: Koichi KUNITAKE

最近は Ansible やら Sphinx 触ってます。IPv6 はボチボチ……