ブロードバンドタワー國武です。
今回は、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 を列挙することで取り込むことができます。その他、詳細については
を参照してください。
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をお使いの方は、一度試してみるのもいいかもしれません。
本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。