什么是 BIRD?什么是 Bird-lg?
BIRD 是 Linux 上常用的一款 BGP 路由软件。我主要在 DN42 网络内使用 Bird,与其它用户建立连接。
Bird-lg 是 GitHub 用户 sileht 开发的一款基于 Python 2 的程序。它提供了一个网页面板,可以显示各个服务器上的 BIRD 路由软件的状态,以及查询到指定 IP 的路由。
为什么我要用 Go 语言重写?
-
Bird-lg 基于 Python 2 以及 Flask,因此占用内存较大(20-30 MB)。
Bird-lgproxy 内存占用量也差不多 20 MB,并且每台服务器上都要运行一个。本站所在的 512 MB 内存的 VPS 已经出现过多次由于内存耗尽外加 SWAP 所在硬盘读写缓慢,导致 Docker、nginx、MySQL、PHP 轮流崩的情况,只能重启解决。
-
Go 重写版本只消耗 6 MB 内存。
-
Bird-lg 读取多个服务器的状态是按顺序进行的,而非并行进行。有时某台服务器网络状态不好,或者 ZeroTier One 抽风,会导致读取时卡较长时间。
-
Go 重写版本使用 Goroutine 并行请求多台服务器,在服务器多、网络差的情况下成倍地加快页面加载速度。
-
这也是我学 Go 语言的一个练手作。
实现了什么功能?
对于 Bird-lgproxy,实现了以下功能:
- 向 Bird 发送指令
- 执行 Traceroute 并返回结果
对于 Bird-lg,实现了以下功能:
-
基本的状态显示,如图:
-
查询到指定 IP 的路由信息:
-
查询信息内 IP 及 ASN 的高亮,以及相应的 WHOIS 查询:
-
Traceroute(下图中可见我的网络到 DN42 DNS 的路由出现了问题):
什么没实现?
相比 Python 版的 Bird-lg,Bird-lgproxy 缺少如下功能:
- IP 来源限制
Bird-lg 缺少如下功能:
- 网页右侧的查询历史记录
缺少这些功能完全是因为我用不到,例如我通过将 Bird-lgproxy 绑定到指定网卡来起到 IP 限制的作用。
演示地址
项目地址及源代码:https://github.com/xddxdd/bird-lg-go
直接进入相应文件夹 go build
获得可执行文件。用 -h
参数来查看可用参数。程序没有配置文件,所有设置通过参数完成。
我还自己修改了 Python 的 bird-lg,用 grequests
加上了并行请求功能,项目地址在此:https://github.com/xddxdd/bird-lg
另外 Go 版本的 Bird-lgproxy 可以直接代替 Python 版的 Bird-lgproxy,可以和 Python 版的 Bird-lg 配合使用。