前言
上一篇 Blog 中我们已经请 LIR 帮我们注册好了自己的 ASN, 并租用(或获赠)了一段 IPv6 地址.
这篇文章中, 我们要让全世界接入互联网的计算机都能访问到这段 IP 地址.
BGP 会话
理论上, 我们要通过 BGP 协议与其他 AS 内的边界网关连接, 建立 BGP 会话 (BGP Session), 互相交换自己的 IP 段.
但作为新晋的迷你”运营商”, 我们并没有任何物理的基础设施. 要知道正经运营商的主要工作就是全世界到处拉网线, 其他运营商自然没有让我们白嫖的道理.
事实上, 根据对方处理导入/导出路由的行为进行区分, BGP 会话两方的关系可以分三种: 上游, 下游和对等(peer)互连
- 上游: 向我们提供整个 Internet 所有其他 AS 的路由, 并将我们导出的路由告诉它的所有上游及 peer
- 下游: 与上游恰好相反, 我们将我们所有已知的路由告知下游, 并替下游将其导出路由的告诉我们的 peer 和上游
- peer: 仅仅向我们提供自己 AS 内的路由, 也只会将我们导出的路由限制在其 AS 内
一般情况下, 下游需要向其上游支付一些费用(按带宽计算), 作为租借上游物理基础设施的费用, 这种连接也被称为 transit. peer 之间则是同级运营商之间的友好合作, 一般被称为 peering, 免收结算费用.
所以为了达成本文的目标, 最可行的方法就是寻找一个现成的上游, 上游会将我们导出的路由继续传递给上游或 peer, 直到 Tier 1 ISP, 它们之间则会通过 peer 交换所有的路由, 最终连接起整个 Internet.
至于如何和他人 peer, 出于篇幅考虑, 让我们下篇 blog 再研究.
寻找上游
各大运营商常在托管机房有接入点, 如果你有托管在机房的独立服务器, 你应该可以直接联系运营商签约购买带宽及 IP transit 服务. 当然, 这一套流程自然是价格不菲.(想想国内专线宽带的惊人价格, 或是想想把独立服务器搞到国外机房的繁琐流程和开销)
但还好有一些 VPS 厂家也为我们提供了 BGP Session 的服务 (其实就是 IP transit 只是名字不同), 例如 Vultr, v.ps 或 BuyVM. 也有一些 BGP Tunnel 的服务, 通过隧道建立 BGP Session 后进行 transit, 甚至还有部分 BGP Tunnel 是免费的.
你也可以试试在 BGP Services 网站上寻找更多相关服务的提供商.
各个服务商的配置方法都不完全一致, 在这里以我目前使用的 v.ps 为例: 至少需要购买三个月或以上的 Düsseldorf 地区的 VPS (共 22.95 EUR), 可以附赠免费的 LocIX 接入和 BGP Session. (这家不同地区的 BGP Session 价格不一样, 有些地区不能免费, 只有德国有免费 LocIX 接入)
发送工单联系客服后, 按照客服要求注册了 PeeringDB, 且向指定邮箱发送 LoA (Letter of Authorization) 就可以设置好 BGP Session 和 LocIX 了.
宣告地址
目前, 你应该已经从你的上游处得到了这些信息:
- 上游的 ASN
- 上游的 IP
- (可选的) MD5 密码
找到上游之后, 我们现在开始配置我们的客户端 —— BIRD. BIRD 是一个实现了 BGP 协议的客户端, 具体配置可以看这份来自 Soha的很详细的 BGP 教程.
我使用的发行版是 Debian Bookworm, 相对较新, 我就直接使用 apt 安装了 BIRD: apt install bird2
. 较旧的发行版还是建议按照 BIRD 文档编译安装.
我的 ASN 为 214775
, 要宣告 2a14:7c0:4d00::/40
.
上游 xTom 的 ASN 为 3204
, IPv6 为 2a03:d9c0:2000::5
, 我们的 vps 本身的 IPv6 地址为 2a03:d9c0:2000::1f7
, MD5 密码为 114514
, 所以我的配置文件如下:
1 | log syslog all; |
你可以直接按着我的配置文件修改(当然还是建议你看一下 Soha 的教程再改), 改好后写入 /etc/bird/bird.conf
, 重启 BIRD systemctl restart bird
.
你可以运行 birdc show protocols all
查看当前所有协议的状态, 可以看到 BGP 会话已经建立, 导入了全网的 204923 条 IPv6 路由, 导出了我们自己的 1 条路由:
1 | bgp_xtom_v6 BGP --- up 08:00:21.885 Established |
现在运行 birdc show route
可以看到 BIRD 内部的路由, 运行 ip -6 route
应该也能看到 BIRD 已经将所有 IPv6 路由加入了系统路由表 (会输出非常多路由).
宣告的 IP 段在全球范围内的传播和收敛可能需要一点时间, 你现在可以稍微干点别的事, 站起来活动一下————
半个小时后, 我们可以打开 BGP Tools 这个网站. 搜索我们刚刚宣告的 IP 段 2a14:7c0:4d00::/40
, 在 Connectivity 标签下可以用可视化的方式看到目前的连接性状态. 如果你是初次添加 AS, 不同上游更新过滤器的速度可能不同, 实际的传播时间可能长达 24 小时.
配置网卡
目前我们已经成功地把 2a14:7c0:4d00::/40
宣告出去了.
我们可以尝试 ping 一下其中的 IP, 按照我们 BIRD 文件中的配置, 服务器会直接返回 ICMP destination unreachable (p.s. 我测试时发现 Mac 上的 ping6 没能正确处理这里的 Destination unreachable, Linux 上的 ping -6 是可以显示 Destination unreachable: no route, Windows 上的 ping 也会正常显示”无法访问目标网”)
此时全球访问 2a14:7c0:4d00::/40
的流量就已经被路由到我们这台 vps 上了, 不过我们的 vps 现在被配置为什么都不做, 直接返回 unreachable. 我们现在只需要在 vps 上做一些小小的配置就能为全球提供服务了:
1 | # 创建一个 dummy 网卡 |
完成后, 我们就可以从自己的电脑上 ping 到 2a14:7c0:4d00::1
这个地址了.
自然, 此时我们已经可以在 vps 上架设任何需要的服务, 并让别人通过 2a14:7c0:4d00::1
访问, 我这里使用 python3 -m http.server -b :: 80
启动一个简单的 HTTP 服务器.
在 vps 上我们也可以使用 2a14:7c0:4d00::1
去访问别的网站实现实名上网:
1 | root@s39230 ~ # curl --interface 2a14:7c0:4d00::1 -6 www.cloudflare.com/cdn-cgi/trace |
小结
本篇 blog 中完成了 IP 段的宣告, 让整个 Internet 都知道了我们这个自治系统的存在~
下一篇应该会来讲讲如何和他人 peer.
本文采用 CC BY-NC-SA 4.0 许可协议发布.
作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/asn-2-bgp-session/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬