Lan Tian @ Blog

Go 语言实现的 Bird-lg(Bird Looking Glass)

本文写于 256 天前, 随着软件更新、外部链接失效等原因,这些内容可能已经不再适用。 如果你发现这些问题,欢迎在评论区指出。

什么是 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 的路由信息

  • 查询信息内 IP 及 ASN 的高亮,以及相应的 WHOIS 查询:

WHOIS 查询域名

WHOIS 查询 ASN

  • Traceroute(下图中可见我的网络到 DN42 DNS 的路由出现了问题)

Traceroute 输出

什么没实现?

相比 Python 版的 Bird-lg,Bird-lgproxy 缺少如下功能:

  • IP 来源限制

Bird-lg 缺少如下功能:

  • 绘制到某一 IP 的路由图(BGPMAP)
  • show route where net ~ [ ... ] 命令
  • 网页右侧的查询历史记录

缺少路由图功能是因为写起来太麻烦,而且我从来不用这个功能;缺少其它功能完全是因为我用不到,例如我通过将 Bird-lgproxy 通过 Docker 映射到指定网卡来起到 IP 限制的作用。

演示地址

项目地址:https://github.com/xddxdd/bird-lg-go

直接进入相应文件夹 go build 获得可执行文件。用 -h 参数来查看可用参数。程序没有配置文件,所有设置通过参数完成。

演示地址:https://lg.lantian.pub

我还自己修改了 Python 的 bird-lg,用 grequests 加上了并行请求功能,项目地址在此:https://github.com/xddxdd/bird-lg

另外 Go 版本的 Bird-lgproxy 可以直接代替 Python 版的 Bird-lgproxy,可以和 Python 版的 Bird-lg 配合使用。

版权所有 2019 Lan Tian @ Blog

本文链接 https://lantian.pub/article/modify-website/go-bird-looking-glass.lantian

CC BY-NC-SA 4.0 协议授权,转载请署名,禁止商业用途,请勿曲解原义

 

« 上一篇文章:
BuyPass GO SSL 证书试用
    昵称
    邮箱
    网站