成为互联网自治系统之一

最近心血来潮,从RIPE NCC的LIR申请到了一个ASN和IPv6 /44前缀地址:AS198764。这里记录一下我的经历,分享给有需要的朋友。

写在前面:IPv4资源已经消耗殆尽,这是IPv6的时代。;)

申请ASN

RIR(区域互联网注册机构)负责管理世界上特定地区的互联网资源,我们需要向他们去申请互联网资源。目前世界上有五个运作的机构:

  • ARIN:美洲
  • RIPE NCC:欧洲
  • APNIC:亚洲
  • LACNIC:拉丁美洲
  • AfriNIC:欧洲

看了一圈下来似乎欧洲稍微友好些,你可以根据实际情况更新RIPE数据库中的信息,而不需要审核之类的,费用看上去也还行。当决定向RIPE申请互联网资源后,有两种方式去申请:

  • 每年交大笔费用成为RIPE NCC Member,对象可以是法律实体或者是自然人。
  • 找到一位RIPE NCC Member作为赞助你的LIR(本地互联网注册机构),让他来赞助你ASN和IP资源。

由于没钱,我选择了第二种方法,每年向LIR支付一定费用来让他们赞助我ASN和资源。这里我并不打算推荐任何LIR,搜索LIR Service应该可以找到大批商家。

申请RIPE NCC的资源前,你需要做下面的准备:

  • 可以提供你的身份证或者护照照片。
  • 需要证明你在欧洲的存在,即你需要可以ping通的欧洲服务器,然后至少有两个Transit(上游)为你提供服务,比如你用Vultr(推广链接)创建了一个欧洲VPS,使用他们的免费BGP Session,那么你就有了一个Transit,你还得找一个。有些LIR可以把满足要求的VPS为你打包销售,省得麻烦。
  • 在RIPE Database中创建Role and maintainer pair对象,这里直接登录RIPE NCC官网进入Database自行创建即可。创建的时候Role和Person没有多大区别,可以选择创建Role,然后把你的mntnerrole对象ID记下来即可,创建完成后建议截个图。
  • 钱。

准备好后,就可以去联系欧洲的LIR啦,他们会让你确认订单、提供身份信息、缴费等等,差不多一周左右你就可以惊喜地在RIPE Database中看到你的ASN和IPv6啦!缴费前建议去RIPE官方公布的Member列表中确认一下对方是不是真的LIR。

我的ASN

广播

当拿到一个ASN和IPv6资源后,我们可以通过BGP将其广播出去,让我们可以被路由到。BGP Daemon一般使用bird,bird支持多种路由协议,如OSPF、RIP(RIP确实RIP了)、BGP等等。你也可以选择Golang或者Rust的相关实现。

你还需要准备支持BGP的服务器,不是所有卖VPS的都支持你BGP。假如是Vultr或者BuyVM,我们需要先联系客服,客服会发送验证邮件到你在数据库中留下的联系邮箱确认你的所有权,然后为你设置BGP Sessioon。一切妥当后,让我们开始广播!

这里推荐先阅读Soha Jin编写的BIRD 与 BGP 的新手开场。我的Vultr服务器上的Bird配置如下(请注意替换大括号内的内容):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
log syslog all;
log "/var/log/bird.log" {info};

router id {VPS的公网IPv4};
define OWN_ASN = {你的ASN};

protocol device {}

protocol kernel {
    ipv6 {
        export all;
    };
}

protocol static {
    ipv6;
    route {你准备宣告的段,建议最小/48} via {VPS的IPv6地址};
}

# 过滤掉太长的段
function net_len_too_long(){
    case net.type {
        NET_IP4: return net.len > 24;
        NET_IP6: return net.len > 48;
        else: print "net_len_too_long: unexpected net.type ", net.type, " ", net; return false;
    }
}

function bgp_export() {
    if net_len_too_long() then return false;
    if source != RTS_STATIC then return false;
    # 这里为了防止泄露路由,我们只允许我们的段export出去
    if net !~ [{你的IPv6段}+] then return false;
    return true;
}

protocol bgp vultr {
    local as OWN_ASN;
    source address {VPS的IPv6地址};
    ipv6 {
        import none;
        export filter {
            if !bgp_export() then reject;
            accept;
        };
    };
    graceful restart on;
    multihop 2;
    neighbor {ISP提供的BGP IPv6} as {ISP提供的BGP ASN};
    password "{ISP提供的BGP 密码}";
}

搞定之后,一定再三确定不会出现泄露路由的情况,即把不该广播的地址广播出去了!BGP并不安全,详见CloudFlare专门做的网站Is BGP safe yet?。确定之后重启Bird即可。

当我们通过birdc show protocol all vultr查看信息,有类似下面的信息:

1
2
3
4
5
6
Routes:         0 imported, 1 exported, 0 preferred
Route change stats:     received   rejected   filtered    ignored   accepted
    Import updates:        2043363          0    2043363          0          0
    Import withdraws:       206668          0        ---     206669          0
    Export updates:              1          0          0        ---          1
    Export withdraws:            0        ---        ---        ---          0

有一条路由Export成功了,我们接下来要做的事情就是等待这条路由慢慢传播了,一般24小时之后可以在各种BGP工具上查询到。

RPKI

其实完成上面的步骤后,我们的段就可以用了,当你创建一个dummy网卡,配置成你的IPv6地址后就能ping通。但是这里我还想讲讲RPKI和ROA。

上面提到了BGP并不安全,为了缓解这个问题引入了基于证书的系统,名为Resource Public Key Infrastructure (RPKI)。我们可以创建ROA(路由源授权),每个ROA包含三个信息:ASN、地址段、最长允许长度。其他人收到我们的路由信息后可以通过软件去验证这条路由信息,判断是否符合ROA,防止路由劫持、泄露。

我们不需要关心密码学的东西太多,如果需要配置ROA联系LIR即可。(这里没有对PA和PI地址进行说明,一般LIR赞助我们的是PA资源,由LIR来管理,所以需要他们去配置)

今天就写到这里,下次我会介绍怎么搭建全球任播网络。Global Anycast Network!

Licensed under CC BY-SA 4.0