#rpsl #routes #bgp #irr #routing #parser #db

route_verification_bgp

Parse RPSL in the IRR to verify observed BGP routes

5 releases (breaking)

new 0.5.0 Apr 19, 2024
0.4.0 Mar 27, 2024
0.3.0 Mar 10, 2024
0.2.0 Nov 25, 2023
0.1.0 Nov 6, 2023

#955 in Database interfaces

Download history 2/week @ 2024-02-16 12/week @ 2024-02-23 17/week @ 2024-03-01 190/week @ 2024-03-08 47/week @ 2024-03-15 127/week @ 2024-03-22 49/week @ 2024-03-29 5/week @ 2024-04-05

240 downloads per month
Used in 3 crates (via route_verification)

MIT license

230KB
5K SLoC

Parse RPSL Policy

WIP

TODO: update this README.

Debugging

  • Enable logging:

    export RUST_LOG=route_verification=trace
    
  • Enable backtrace in error messages:

    export RUST_BACKTRACE=1
    

Produce a parsed dump using both lexer and parser

  • Put the database file at data/ripe.db.

  • Make sure pypy3 is in the PATH.

  • Make sure you have rpsl-lexer installed and it can be found by pypy3 (e.g., in PYTHONPATH).

    python3 -m pip install rpsl-lexer
    
  • Run at route_verification/:

    cargo r --release -- parse ../data/ripe.db ../parsed
    

    The parsed dump will be distributed in parsed/.

Produce a spread parsed dump from both priority and backup registries

Obtain IRR data

Download from all FTP servers on IRR List of Routing Registries.

Download priority registries to data/irrs/priority/:

ftp://ftp.afrinic.net/pub/dbase/ ftp://ftp.altdb.net/pub/altdb/ ftp://ftp.apnic.net/pub/apnic/whois/ ftp://ftp.arin.net/pub/rr/ ftp://irr.bboi.net/ https://whois.canarie.ca/dbase/ ftp://irr-mirror.idnic.net/ ftp://ftp.nic.ad.jp/jpirr/ ftp://irr.lacnic.net/ ftp://ftp.nestegg.net/irr ftp://rr1.ntt.net/nttcomRR/ ftp://ftp.panix.com/pub/rrdb ftp://ftp.ripe.net/ripe/dbase/

Download backup registries to data/irrs/backup/:

ftp://ftp.radb.net/radb/dbase/

Decompress all files.

Run the parser with parse_priority

Run at route_verification/:

cargo r --release -- parse_priority ../data/irrs/priority/ ../data/irrs/backup/ ../parsed_all/

The above command parses all IRR DB files in data/irrs/priority/ and data/irrs/backup/, overrides any duplicated information with the version from the former, and writes the result to multiple JSON files in parsed_all/.

Produce a parsed IR dump using IRRs in ordered priorities

Run at route_verification/:

cargo r --release -- parse_ordered \
../data/irrs/priority/apnic.db.* ../data/irrs/priority/afrinic.db ../data/irrs/priority/arin.db ../data/irrs/priority/lacnic.db\
../data/irrs/priority/ripe.db ../data/irrs/backup/radb.db\
../data/irrs/backup/altdb.db ../data/irrs/backup/idnic.db ../data/irrs/backup/jpirr.db ../data/irrs/backup/level3.db ../data/irrs/backup/nttcom.db ../data/irrs/backup/reach.db ../data/irrs/backup/tc.db\
../parsed_all/

Running interactively in Jupyter Notebook

  • Finish the previous section. Your parsed dump should be cached in parsed/.
  • Install Evcxr Jupyter Kernel.
  • Open the notebook at ./, and try out parse_test.ipynb.

Produce a lexed dump using lexer

If the database file is at data/ripe.db, for example:

pypy3 -m rpsl_lexer.dump data/ripe.db > dump.json

In the command above, we use PyPy for faster performance, and pipe the dumped JSON to dump.json.

Test lexer

Run at ./:

pytest

Test lexer against ripe.db

To test against ripe.db using rpsl_lexer/tests/mp_import_w_db.py, put the database file at data/ripe.db:

python3 -m rpsl_lexer.tests.mp_import_w_db

Similarly, to test with rpsl_lexer/tests/mp_export_w_db.py, or one of the other lexers:

python3 -m rpsl_lexer.tests.mp_export_w_db
python3 -m rpsl_lexer.tests.mp_peering_w_db
python3 -m rpsl_lexer.tests.mp_filter_w_db
python3 -m rpsl_lexer.tests.action_w_db
python3 -m rpsl_lexer.tests.import_w_db
python3 -m rpsl_lexer.tests.export_w_db

Test parser and comparator

Run at route_verification/:

cargo t --workspace

Dependencies

~10–19MB
~243K SLoC