接着上一篇《使用 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。
-
性价比问题: Bird 可以在 Vultr Regular Cloud Compute 1 核 512 MB 内存 ($3.5/月) 上同时接收 IPv4 和 IPv6 全表, 30 天平均 CPU 占用不到 2%, 内存占用低于 300 MiB。
综上所诉, 使用 Linux 发行版系统搭配 Bird 2 (Internet Routing Daemon) 不仅免费, 还可以运行其他程序, 可玩性更高。
安装 BIRD 2.14
Bird 1.6.x 和 Bird 2.x 的最大区别是:
- v1 版本 IPv4 和 IPv6 分别是
bird
和bird6
两个程序 - 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_V4
和 TO_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 地址
此时我们已经可以在 vps 上架设任何需要的服务, 并让别人通过 2a0a:6000:1::1
访问, 我这里使用 python3 启动一个简单的 HTTP 服务器
python3 -m http.server -b :: 80
实名上网
在 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