题解、Writeup、游记和碎碎念
教育网的 ipv6 大多是免流的。那么问题是如何找一个合适的梯子实现高速免流。教育网 ipv6 的出国线路大概有 HE、Cogentco、HKIX(有多个 ISP 都会经过 HKIX,就不详细列出了)。
HE 是大多数 ip 都会走线路,于是他 QoS 也比较严重。Cogentco 和 HKIX 则 QoS 的比较少。走 HKIX 的 VPS 还是有不少(自行搜索),不过价格一般还是不便宜。
而 Cogentco 线路有一些大服务商有,比如 vultr 的达拉斯回程和亚特兰大的去程,但是这两个的相反方向却都只是普通的 HE 线路。要综合这两个线路得到一个双向 Cogentco 线路的梯子,其实可以通过一些操作,使得本地给 A 发包,如何 B 返回结果。但是感觉设置比较麻烦,就咕了。
这时我想到我恰好有一个(算是)闲置的 ASN 和一些 ipv6 资源,能不能用 BGP 实现这个双向 Cogentco 呢?
一个 ASN,一些 ip 段。这些许多商家有售(比如 hostus)。比较便宜的可以去各大论坛或者群里问(比如 https://t.me/MoeQing)
首先在 vultr 开两台机,装好必要的软件。
接下来在两台机器上都配置广播 ip,可以参考 https://blog.ni-co.moe/public/560.html。
由于我们想让这个 ip 段强制走其中一台进入,需要把他们之间连起来,并且再设置一下路由优先级。
把他们之间连起来可以参考 https://lantian.pub/article/modify-website/join-dn42-experimental-network.lantian/。这里需要注意,为了让 zerotier 能正常分配公网 ipv6,需要运行 zerotier-cli set 你的网络id allowGlobal=1
。
接下来是设置路由优先级。这里的需求很简单,只是为了让路由全都走某一台,那么可以让另一台的 AS Path 足够长,这样就不会被优先选择了。
具体来说,在 /etc/bird/bird6.conf
中,protocol bgp vultr
一段里,把 export all;
改成:
export filter {
bgp_path.prepend(你的 AS 号);
bgp_path.prepend(你的 AS 号);
...
bgp_path.prepend(你的 AS 号);
bgp_path.prepend(你的 AS 号);
};
这里要加多少个就自己决定了,只要让别人走不过来就行。
配好之后,重启 bird6,等一会路由更新,然后 trace 一下,发现去程确实走了 Cogentco。
回程按理来说是不需要配置的,但是在达拉斯的机器上运行
mtr 2402:f000:2:f001::240:1
是走 GTT 到 Cogentco;而运行
mtr -a 你的ip 2402:f000:2:f001::240:1
却是走 NTT 到 HE。
为了配置这一部分,需要想办法调整回程线路,也就是 VPS 上的出口线路。
而根据 Vultr 给出的一些参考(https://www.vultr.com/docs/as20473-bgp-customer-guide),可以用 BGP Community 来控制宣告。
比如可以在 export filter
中加入
bgp_community.add((64609, 3257));
bgp_community.add((64699, 3257));
bgp_community.add((20473, 6000));
来只对外宣告到 AS3257(GTT)。
然而,这样仍然不能使上面的 mtr 都走 Cogentco。
我找 Vultr 客服把我的 BGP 模式改成了全表。在所有出口路径中,我搜索了 45576(贵清的 ASN),发现只有
64515 65534 20473 6939 23911 23910 24348 45576
一条。也就是直接走 HE 的。
那么 GTT 和 Cogentco 是怎么走出来的就非常奇怪了。
这里我也分析不下去了,如果有人知道原因欢迎联系我。
后来我换了几个不同的贵清 ip 测试,发现有的是两种 mtr 都走 NTT-HE,有的是两种都走 GTT-Cogentco。
BGP 实在是玄妙啊。。。
日期: 2019-12-06
这是一篇旧文,原始文章及评论可在 https://oldblog.mcfx.us/archives/275/ 查看。