BGPlayer 从零开始速成指北 - 使用 Bird 2 广播你的 IP

接着上一篇《使用 MikroTik RouterOS v7 广播你的 IP》, 我们来说说为什么还要换成 Bird 2 广播 IP 呢。

虽然 MikroTik RouterOS v7 是专为路由器打造的系统, 但它也有一些缺点:

  • 收费限制: 这是收费软件, 只有 60 天试用期, 过期后限速 1 Mbit/s。

  • 功能单一: 作为一个定制系统, 只能用来做路由器, 无法运行其它程序。

  • 资源占用高: 在 Vultr AMD High Performance 1 核 1GB 内存 ($6/月) 上, 30 天平均 CPU 占用 68%, 内存占用 563 MiB。

    vultr_bgp_routeros_last30day_chart.png

  • 性价比问题: Bird 可以在 Vultr Regular Cloud Compute 1 核 512 MB 内存 ($3.5/月) 上同时接收 IPv4 和 IPv6 全表, 30 天平均 CPU 占用不到 2%, 内存占用低于 300 MiB。

    vultr_bgp_bird_last30day_chart

综上所诉, 使用 Linux 发行版系统搭配 Bird 2 (Internet Routing Daemon) 不仅免费, 还可以运行其他程序, 可玩性更高。

安装 BIRD 2.14

Bird 1.6.x 和 Bird 2.x 的最大区别是:

  • v1 版本 IPv4 和 IPv6 分别是 birdbird6 两个程序
  • v2 版本合并成了一个 bird, 同时支持 IPv4 和 IPv6

官方文档: BIRD 2.14 User’s Guide
本文使用 Cnetos 7 系统, BIRD version 2.14

yum install bird2 -y

建立 BGP 连接并广播你的 IP

如果你之前用过 RouterOS v7 配置 BGP, 那么换到 BIRD 会简单很多。
Bird 的配置文件路径为 /etc/bird.conf

我们要建立 IPv4 和 IPv6 的 Peer, 并在 IPv6 的 Peer 上广播 2a0a:6000:1::/48

查看 Vultr 提供的 BGP 信息

在 Vultr VPS 面板的 BGP 选项卡可以找到以下参数

Instance Vultr
ASN 66666 64515
IPv4 100.101.102.103 169.254.169.254
IPv6 2a05::1 2001:19f0:ffff::1
BGP Password 51522zzwlwlbb
Multihop 2

添加全局配置

打开 /etc/bird.conf 文件后里面有很多默认配置和注释, 我们把所有内容都注释掉从头开始配置

# 日志
log stderr all;
log "/var/log/bird.log" all;

# Router ID (只不过是个名字, 通常用路由器公网 IPv4 地址)
router id 100.101.102.103;

# 监控网卡状态
# This pseudo-protocol watches all interface up/down events.
protocol device {
}

创建 BGP 模板

新建一个 BGP Template

template bgp template_ebgp {
    description "AceSheep BGP Test";   # 自己起一个, 便于自己识别即可
    local as 66666;                    # 你的 ASN
    hold time 90;                      # 默认 240
    multihop 2;                        # 如果上游告诉你 Multihop 是 2 这里就要加上
    password "51522zzwlwlbb";          # 由上游提供
}

配置 IPv4 Peer

建立 IPv4 Peer 并设置过滤

protocol bgp TO_PEER_VULTR_V4 from template_ebgp {
    source address 100.101.102.103;      # 实例 IPv4
    neighbor 169.254.169.254 as 64515;   # 上游 IPv4 和 ASN

    ipv4 {
        import all;                      # 接受所有上游给我们的路由表
        export none;                     # 丢弃所有发送到上游路由表
    };
}

配置 IPv6 Peer 并允许广播前缀

建立 IPv6 Peer, 设置过滤, 并允许要广播 IPv6 前缀

protocol bgp TO_PEER_VULTR_V6 from template_ebgp {
    source address 2a05::1;              # 实例 IPv6
    neighbor 2001:19f0:ffff::1 as 64515; # 上游 IPv6 和 ASN

    ipv6 {
        import all;                      # 接受所有上游给我们的路由表
        export filter {
            if net = 2a0a:6000:1::/48 then accept;  # 如果前缀为 2a0a:6000:1::/48 则允许发送到上游路由表
            reject;                      # 拒绝所有发送到上游路由表
        };
    };
}

至此 IPv4 和 IPv6 的 Peer 就设置好了

宣告要广播的 IPv6 前缀

设置要广播的 IPv6 前缀, IPv4 最小 /24, IPv6 最小 /48

protocol static {
    # route  [IPv6 前缀] via [实例的 IPv6 / 网关];
    route 2a0a:6000:1::/48 via 2a05::1;
}

启动 Bird

接下来启用调试消息并在前台运行 bird

bird -d

或者设置为开机启动

systemctl enable bird
systemctl start bird
systemctl status bird

检查 BGP 会话状态

现在检查一下 Peer 建立的状态

# 查看 BGP 会话状态
birdc show proto
birdc s p          # 等效命令

# 查看路由表里现在有多少前缀
birdc show route count

如果 TO_PEER_VULTR_V4TO_PEER_VULTR_V6 的状态都是 Established 说明连接成功, 并接收到了全表。

IPv4 有 951576 条前缀, IPv6 有 197619 条前缀

[root@BGP ~]# birdc s p
BIRD 2.14 ready.
Name       Proto      Table      State  Since         Info
device1    Device     ---        up     2024-02-29    
direct1    Direct     ---        up     2024-02-29    
static1    Static     ---        up     2024-02-29    
TO_PEER_VULTR_V4 BGP  ---        up     2024-02-29    Established   
TO_PEER_VULTR_V6 BGP  ---        up     2024-02-29    Established

# 显示路由前缀数量
[root@BGP ~]# birdc show route count
BIRD 2.14 ready.
951576 of 951576 routes for 951576 networks in table master4
197619 of 197619 routes for 197619 networks in table master6
Total: 1149195 of 1149195 routes for 1149195 networks in 2 tables

至此, 已经完成建立 BGP 连接并广播你的 IP

如果想在 bgp.he.net 上查询到自己的前缀, 则需要等待 24 小时才能看到

添加一个自己广播的 IP 并测试连通性

目前我们已经成功地把 2a0a:6000:1::/48 宣告出去了

此时全球访问 2a0a:6000:1::/48 的流量就已经被路由到我们这台 vps 上了, 不过我们的 vps 现在被配置为 “什么都不做”, 会直接返回 unreachable. 我们现在只需要在 vps 上做一些小小的配置就能为全球提供服务了

添加 Direct 协议

编辑配置文件 /etc/bird.conf, 添加以下内容

protocol direct {
    ipv6;

    interface "dummy*";
}

:wq 保存文件

热重载配置

使用命令热重载配置文件

birdc configure

添加虚拟网卡和 IPv6 地址

配置虚拟网卡以及 IPv6 地址

# 添加虚拟网卡
ip link add dev dummy1 type dummy

# 启用虚拟网卡
ip link set dummy1 up

# 添加地址
# 例如随便从 `2a0a:6000:1::/48` 前缀内任意选一个地址使用, 以 /128 结尾
ip addr add dev dummy1 2a0a:6000:1::1/128

完成后, 我们就可以从自己的电脑上 ping 通 2a0a:6000:1::1 这个地址了

注意: 这种方式在重启后网卡会失效, 需要重新配置网卡。

测试 Ping

添加好之后用另一台 VPS Ping 这个 IPv6 地址

ping.pe 的全球测试结果

此时我们已经可以在 vps 上架设任何需要的服务, 并让别人通过 2a0a:6000:1::1 访问, 我这里使用 python3 启动一个简单的 HTTP 服务器

python3 -m http.server -b :: 80

能访问到架设的 HTTP 服务器

实名上网

在 vps 上我们也可以使用 2a0a:6000:1::1 去访问别的网站 实现实名上网

[root@BGP-LUX ~]# curl -6 www.cloudflare.com/cdn-cgi/trace --interface 2a0a:6000:1::1
fl=64f75
h=www.cloudflare.com
ip=2a0a:6000:1::1
ts=1754996299.004
visit_scheme=http
uag=curl/7.29.0
colo=ZRH
sliver=none
http=http/1.1
loc=LU
tls=off
sni=off
warp=off
gateway=off
rbi=off
kex=none

[root@BGP-LUX ~]# curl -6 ip.sb --interface 2a0a:6000:1::1
2a0a:6000:1::1

[root@BGP-LUX ~]# curl -6 ifconfig.co --interface 2a0a:6000:1::1
2a0a:6000:1::1

原文

年轻人的第一个私人BGP(二) - 广播你的IP
BIRD 与 BGP 的新手开场
自己在家开运营商 Part.2 - 向世界宣告 IP 段 (BGP Session & BIRD)
BGP_example_1
BGP_filtering
IPv4/IPv6 CIDR 地址计算器
IPv6子网计算器
IPv6 Address Expander
IPv6 Address Shortener

最后更新于 2025-08-12
使用 Hugo 构建
主题 StackJimmy 设计