#大坑# DN42去中心化网络入门教程

什么是DN42?

dn42 is a big dynamic VPN, which employs Internet technologies (BGP, whois database, DNS, etc). Participants connect to each other using network tunnels (GRE, OpenVPN, Tinc, IPsec) and exchange routes thanks to the Border Gateway Protocol. Network addresses are assigned in the 172.20.0.0/14 range and private AS numbers are used (see registry) as well as IPv6 addresses from the ULA-Range (fd00::/8).

上面的是DN42官方(或者说社区)对DN42的描述。简单地说DN42就是一个大的虚拟内网,你可以自由的跟别人进行点对点的VPN连接(当然对方要同意,但与现实世界有区别的是DN42的互联一般不会有任何费用),建立类似于真实世界中的物理网络。这个网络主要是用于提供网络新手一个自由练习BGP、OSCP、WHOIS、DNS等网络技术的平台。在DN42中,你可以随便测试你路由器的配置而不用担心搞炸别的网络(但如果你是提供DN42网络中继点的话还是要注意一点),你可以照着书本一步步尝试你的配置。进入DN42的世界你只需要一个能接上互联网的电脑,甚至不需要一台Legit的物理路由器。

为了与公网区分开来,DN42内部使用172.20.0.0/14(4个B段)、fd00::/8和私有AS地址(比如我的AS4242420199)作为地址域。当然部分VPS(比如阿里云)会使用这些地址作为VPC地址,这时候就需要配置你服务商的VPC尽可能绕开这些地址以避免路由上的冲突。

顺带一提,国际VPN(国外服务器与国内服务器进行P2P连接)这种东西在国内是违法的,因为大陆政府将VPN认定为非法国际信道。Use At Your Own Risk,本博客只在技术层面对DN42进行讲解。

本教程使用OpenVPN(使用静态密匙)作为点对点的对接方案,Quagga作为BGP的程序。其余方案(比如TincWireguardGREIPSec w/ PKBird)不在本博文讲解范围内,请自行参考Wiki(因为我很Noob自己也不懂所以没法写教程)

特别警告:虽然同为去中心化网络,DN42并不是匿名的。如果你需要完全匿名化的网络,请使用Tor

DN42入门资料参考

因为这篇文章可能会更新得非常非常非常慢,所以你有兴趣的话可以先自行读这些资料进行参考:

官方维基:https://wiki.dn42.us/Home
剩余自行谷歌。因为这个东西比较小众所以资料并不多。

第一步:注册DN42的各种对象

这里的对象指的是Object别想歪了
Registry地址:https://io.nixnodes.net/
提醒:Registry使用了StarCom的证书,这个证书的根被部分浏览器(比如谷歌)给吊销了,所以可能会有安全警告,直接点击允许即可。
参考资料(英文):https://wiki.dn42.us/howto/Getting-started

  1. 注册局界面概览

    • 右上角那个输入框(我输入了IXNET-MNT的地方)是搜索框,你在里面输入你的Maintainer对象名,就可以看到你自己所有的资源。
    • 下面所有的对象你都可以参考我的配置。
    • 所有对象如果保存成功右边的信息栏都会有类似于saved object: 172.20.165.0_29 | inetnum的提示。
  2. 注册一个Maintainer(维护者)对象
    • 点击右上角的Create Object,选择mntner
    • 左边mntner字段填写你喜欢的名字,比如IXNET-MNT。通常全大写,以-MNT结尾
    • descr填写这个维护者的描述,比如IX Network Studio DN42 Network Maintainer
    • sha512-pw填写这个维护者的明文密码。这个密码非常重要,不建议使用常用密码,但是一定不能忘记,不然的话你所有的对象的配置你都将会无法访问
    • admin-ctech-c填上DUMMY-DN42。这个以后会改,不用担心
    • mnt-by填上和mntner同样的内容,比如IXNET-MNT,表示自己管理自己
    • Save保存。这相当于创建了你在DN42世界中的网管帐号
    • 在右边信息框上面那个输入框里面输入你刚才的密码,然后点+来登陆系统
  3. 创建一个Person(个人)对象
    • 步骤类似于上面
    • person填写名字,比如Howard Liu
    • contact里面填写你自己的电子邮箱地址。建议填写你PGP密匙里面的邮箱,大家在进行加密数据交流的时候可以验证来源
    • nic-hdl填写这个人的代号,比如HOWARD-DN42。通常全大写,以-DN42结尾
    • mnt-by填写你的维护者对象名,比如IXNET-MNT
    • 保存
    • 重新编辑你的维护者对象,把里面的admin-ctech-c改为你的Person对象的代号(比如HOWARD-DN42),保存
    • 从现在开始,接下来你所有创建的对象admin-ctech-c都是你Person对象的代号,mnt-by都是你维护者对象名
  4. 注册一个AS号
    • 要实现外部BGP互联与别人交换路由数据,一个AS号是必须的
    • 可注册的AS号为42424200004242423999,即424242XXXXXXXX < 4000)
    • 这里查询你喜欢的号码是否已经被注册
    • 创建一个aut-num对象
    • aut-num字段填写AS号,比如AS4242420199,注意前面有个大写的AS
    • as-name字段随意,比如IXNET-AS
    • 剩下几个字段不需要解释了,填完保存
  5. 注册一(多)个IPv4前缀
    • 注意:整个DN42只有4个B段,而且一部分地址还在保留中,请只注册你需要的前缀大小,一般新手/27足矣,永远不要注册超过/24(1个C段)
    • 你可以在这里找到还没被别人注册的IPv4前缀
    • 创建一个inetnum对象
    • inetnum填写格式如:172.20.165.0-172.20.165.7(开始地址-结束地址,这个是127.20.165.0/29的示例,我用与阿里云VPC避免路由干扰)
    • status填写ALLOCATED(区分大小写,一个字都不能错)
    • netname字段随意,比如IXNET-INTERNAL
    • country填写两位字母的国家代号,比如SG
    • 剩余的都不需要解释了,填完保存
  6. 注册一(多)个IPv6前缀
    • 因为DN42使用RF4193规定的ULA地址范围(fd00::/8)作为IPv6的地址域,所以你在这里面随便挑一个前缀就行(当然不能跟别人的重复)
    • 想查是否重复的话只需要在注册局搜索框输入你喜欢的前缀(比如fdc9:9999:9999),看看有没有人注册了就行。IPv6地址前缀这么多,一般跟别人重复的几率很小
    • 如果没有人注册的话,你可以创建一个inet6num对象
    • inet6num填写格式如:fdc9:9999:9999:0000:0000:0000:0000:0000 - fdc9:9999:9999:ffff:ffff:ffff:ffff:ffff(这个是我的IP段,即fdc9:9999:9999::/48
    • 剩余的跟上面注册IPv4的一样
    • 填完保存
  7. 决定你想使用的IP段,并创建路由(route)对象

    如果你决定把你上面注册的IP段全部用于同一个网络,请跳过这个引用框
    如果你只想用你步骤5和6注册的IP段的一部分的话,请看这个:

    • 首先你需要创建一个子IPv4(6)前缀,步骤与上面5/6完全相同,除了status那里写ASSIGNED
    • 比如我要在我的172.21.88.128/25中分出一个172.21.88.128/28作为骨干路由地址,我创建了一个inetnum字段为172.21.88.128 - 172.21.88.143的对象,然后状态那填ASSIGNED
    • 分IPv6块同理
    • 某些互联的网络可能开了严格的IP前缀筛选,如果你不注册route对象或者route对象与BGP宣告的前缀不相符的话(比如掩码不相符)你的Peer(或者他们的上/下游)可能会Reject掉你的前缀宣告
    • 决定你要用的IP段(步骤5/6注册的一整个或者上面引用框内说明的子IP段)与AS号(上面第4步注册)
    • 创建一个route对象(如果是IPv6就创建一个route6对象,剩下步骤类似)
    • route字段填你的IP前缀,比如172.21.88.128/28或者fdc9:9999:9999:9900::/64route6对象)(注意一下,这里与上面的`inetnum/inet6num填写的不同,这里只需要写IP+掩码)
    • origin填写你的AS号,比如AS4242420199AS开头,不仅仅是数字)
    • mnt-by不解释了,填完保存

剩余的会抽空更新,最后更新于2017年8月17日晚