ddddddO / packemon

Packet monster (っ‘-’)╮=͟͟͞͞◒ ヽ( '-'ヽ) TUI tool for sending packets of arbitrary input and monitoring packets on any network interfaces (default: eth0).
BSD 2-Clause "Simplified" License
92 stars 0 forks source link

ルーティングプロトコルを実装したい #68

Open ddddddO opened 1 month ago

ddddddO commented 1 month ago
ddddddO commented 1 month ago

いやどうやって実装進めよう ホストとゲストのコンテナで packemon のディレクトリマウントすればいけるか あとeBPF プログラムがコンテナで実行できるかどうか


以下は、ホスト側 WSL2 の ubuntu で実行

$ tmux      (セッションは縦に分割した方がいいかも)

$ docker run -it -v /home/ddddddo/github.com/ddddddO:/home/ddddddO --privileged sphalerite1313/frr /bin/bash
$ curl -OL https://go.dev/dl/go1.23.2.linux-amd64.tar.gz
$ rm -rf /usr/local/go && tar -C /usr/local -xzf go1.23.2.linux-amd64.tar.gz
$ echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
$ source ~/.bashrc
$ cd /home/ddddddO/packemon
$ go run cmd/packemon/*.go         # packemon の Monitor 起動

# 別ターミナル(セッション)で
$ docker ps
$ docker exec -it <起動中の上のコンテナID> /bin/bash
$ nslookup github.com       # 上のコンテナの packemon(Monitor) に DNS のログが表示される
$ cd /home/ddddddO/packemon/
$ go run cmd/packemon/*.go --send       # packemon の Generator 起動で、適当なパケットとばすと、上のコンテナの Monitor にログ出る。なので、Monitor・Generator の実行は大丈夫そう

上の sphalerite1313/frr で、ホスト側で編集した packemon のコードが反映され実行できたので、すぐに挙動確認できるので、開発は楽に進められそう


BGP の設定 以下コマンドを、sphalerite1313/frr のコンテナ2台立ち上げて実施する(https://www.infraexpert.com/study/bgpz06.html の「BGPの設定例」を参考)

$ tcpdump -i eth0 -s 0 -w /home/ddddddO/packemon/cmd/debugging/bgp/bgp.pcap port 179

BGP ルータA(コンテナ)

$ ip address        # eth0 の ipアドレスを控えて、対向の neighbor コマンドで指定
$ sed -i.org 's/bgpd=no/bgpd=yes/' /etc/frr/daemons
$ /etc/init.d/frr start &
$ vtysh
# conf t
(config)#  router bgp 1       # 対向は、「router bgp 2」とかに変えて実行
(config-router)# neighbor 172.17.0.3 remote-as 2
(config-router)# do show ip bgp nei 172.17.0.3         # 以下実行しなくても、「BGP state = Established」になっていた
(config-router)# neighbor 172.17.0.3 ebgp-multihop 255

BGP ルータB(コンテナ)

$ ip address        # eth0 の ipアドレスを控えて、対向の neighbor コマンドで指定
$ sed -i.org 's/bgpd=no/bgpd=yes/' /etc/frr/daemons
$ /etc/init.d/frr start &
$ vtysh
# conf t
(config)#  router bgp 2 
(config-router)# neighbor 172.17.0.2 remote-as 1
(config-router)# do show ip bgp nei 172.17.0.2         # 以下実行しなくても、「BGP state = Established」になっていた
(config-router)# neighbor 172.17.0.2 ebgp-multihop 255

以下はローカルではなくインターネットの。メモ程度のもの IPアドレスからAS番号検索: https://develop.tools/ip-asn/ AS番号リスト: https://www.nic.ad.jp/ja/ip/as-numbers.txt

ddddddO commented 1 month ago

BGP の作業場 https://github.com/ddddddO/packemon/tree/main/cmd/debugging/bgp

frr bgp https://docs.frrouting.org/en/latest/bgp.html

ddddddO commented 1 month ago

BGP 試せる環境を tinet で構築できるようにするメモ

また、Docker DesktopのWSL Integrationが有効化されたインスタンスには対応していません。無効にしたインスタンスで実行するようにしてください。

とのこと。ref: https://www.sbcr.jp/support/4815617814/ WSL2 の ubuntu の環境は、docker 落としてきたもの使うようにする

docker install

$ curl -fsSL https://get.docker.com | sh
ddddddO commented 1 month ago

BGP なコマンド以下の記事に載ってるのが、デバッグに使えそう https://zenn.dev/microsoft/articles/azure-route-server-frrouting

ddddddO commented 1 month ago

Monitor は、各ルーティングプロトコルのパースができればいい ただ、Generator をどうするか?ルーティングプロトコルは大体1パケットと言うよりか、一連のやり取りができた方が面白そう(BGP なら、open/keepalive/updateのフロー)

以下2パターン出来る感じにしたい