Total Pageviews

Thursday, 3 August 2017

DN42 - 一个大型的 VPN 网络

简介

DN42 是一个大型的 VPN 网络,通过 GRE, OpenVPN, Tinc, IPsec 等隧道将不同地区的用户连接在一起,同时使用 BGP 协议宣告自己的网段,实现用户之间的互联互通。
DN42 有一套完整的 AS 号的申请、IP 地址块的申请以及 .dn42 域名的申请系统,IP 地址块的分配不会于公网上的产生冲突,因为使用的是 172.20.0.0/14 以及 fd00::/8 这些私网地址。
那么,在 DN42 中我们能玩些什么呢?

路由协议

正如上面所说,DN42 使用 BGP 协议来让各个用户宣告自己的网段,从而实现用户之间的互联互通,因此 BGP 协议是十分重要的一个环节。当前 DN42 大概有 300 多个 AS 在线,有大概 580 条路由,应该足够我们进行研究的了。
在我实际的操作中,使用到了 iBGP 、 eBGP 以及路由反射器,相信在以后进一步深入的话还会学习到很多好玩的东西,例如 Anycast 。
可能你会想说,eNSP 和 Cisco Packet Tracer 也同样可以做到类似的模拟,事实上的确如此,但是,有什么比在实际的网络上进行操作更加有趣的呢?而且,你不必成为 APNIC 的会员就可以拿到 AS 号,也不用交纳年费来买一个 IP 地址块,同时,也不用怕弄坏了实际的网络然后被上级责备。

连接到 Hacker Spaces

如今没有多少人有公网 IP ,就连宽带也逐渐开始分配 100.64.0.0/16 的 IP 地址,如果我们家里有一台树莓派什么的想要在外面访问,将自己的路由器加入到 DN42 也是一个不错的选择。我们可以随时随地连接上 DN42 网络,然后可以访问到自己的树莓派,也可以用树莓派给其他人提供各种各样的服务。
说人话就是,DN42 在一定程度上解决了 NAT 设备的访问问题,如果有担心安全问题的话,也可以设置一些访问控制进行访问的过滤。

加入 DN42 网络

请参考官方的入门文档:https://dn42.net/howto/Getting-started

体验

大概一个星期之前我就拿着我的几台VPS 入了坑,在 http://io.nixnodes.net/ 中注册了一个 AS 号:4242421888 ,然后 ALLOCATED 了几个 IP 段给这几台不同地区的 VPS 使用。
一切就绪之后,我在 https://dn42.us/peers 中联系到了 Chris Moons ,通过和他做 peer ,我成功地将自己的 VPS 连接到了 DN42 网络中。
不得不说,DN42 和真实的互联网真的很相似。

BGP

我目前使用的是 Bird 作为 BGP 宣告工具,之前是使用 Quagga 的,但是他对 IPv6 协议上不是很支持,在我的操作中遇到了不少问题,虽然他的使用方法很像是在操作 Cisco 设备,但是后来我还是把他撤掉换成了 Bird
Bird 的语法虽然不像 Quagga 那样有 Cisco 设备操作经验就可以上手,但是他的配置及其简单明了。
如果想要了解的话可以去 DN42 的 Wiki 了解:https://dn42.net/howto/Bird
下面是我在 Bird 中运行 show protocols all chrismoos 的结果
Preference:     100
  Input filter:   (unnamed)
  Output filter:  (unnamed)
  Import limit:   10000
    Action:       block
  Routes:         468 imported, 0 filtered, 560 exported, 16 preferred
  Route change stats:     received   rejected   filtered    ignored   accepted
    Import updates:        4657978          0      46297    1252694    3358987
    Import withdraws:        14184          0        ---      43809       7162
    Export updates:        9025262     284456          0        ---    8740806
    Export withdraws:         9173        ---        ---        ---     275578
  BGP state:          Established
    Neighbor address: 172.20.162.86
    Neighbor AS:      4242421588
    Neighbor ID:      172.20.16.133
    Neighbor caps:    refresh AS4
    Session:          external AS4
    Source address:   172.22.68.1
    Route limit:      468/10000
    Hold timer:       179/240
    Keepalive timer:  46/80

DNS

DN42 不仅仅实现了域名的注册,也实现了根域名服务器以及下面的分级域名服务器
下面是反向查询我的一个 ip 地址,可以看出他和我们的实际网络上的 DNS 查询是十分相似的.
root@cn-can01:~# dig @172.23.0.53 -x 172.22.68.8 +trace

; <<>> DiG 9.9.5-9+deb8u6-Debian <<>> @172.23.0.53 -x 172.22.68.8 +trace
; (1 server found)
;; global options: +cmd
.                       67      IN      NS      t.root-servers.dn42.
.                       67      IN      NS      a.root-servers.dn42.
.                       67      IN      NS      x.root-servers.dn42.
.                       67      IN      NS      m.root-servers.dn42.
;; Received 225 bytes from 172.23.0.53#53(172.23.0.53) in 1628 ms

22.172.in-addr.arpa.    7200    IN      NS      x.in-addr-servers.dn42.
22.172.in-addr.arpa.    7200    IN      NS      m.in-addr-servers.dn42.
22.172.in-addr.arpa.    7200    IN      NS      c.in-addr-servers.dn42.
;; Received 121 bytes from 172.23.67.67#53(m.root-servers.dn42) in 1319 ms

68.22.172.in-addr.arpa. 7200    IN      NS      d.dn42-servers.dn42.
68.22.172.in-addr.arpa. 7200    IN      NS      x.dn42-servers.dn42.
;; Received 162 bytes from 172.23.67.53#53(m.in-addr-servers.dn42) in 1059 ms

8.68.22.172.in-addr.arpa. 7200  IN      CNAME   8.0/27.68.22.172.in-addr.arpa.
0/27.68.22.172.in-addr.arpa. 7200 IN    NS      ns2.imlonghao.dn42.
0/27.68.22.172.in-addr.arpa. 7200 IN    NS      ns1.imlonghao.dn42.
;; Received 124 bytes from fdea:a15a:77b9:4444::3#53(x.dn42-servers.dn42) in 349 ms

Peers

最后,如果你想加入的话,可以去到 dn42@hackint 这个 IRC 频道寻求帮助.
---------------

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/ PK、 Bird)不在本博文讲解范围内,请自行参考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

    • 右上角那个输入框(我输入了IXNET-MNT的地方)是搜索框,你在里面输入你的Maintainer对象名,就可以看到你自己所有的资源。
    • 下面所有的对象你都可以参考我的配置。
    • 所有对象如果保存成功右边的信息栏都会有类似于saved object: 172.20.165.0_29 | inetnum的提示。
  1. 注册一个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世界中的网管帐号
    • 在右边信息框上面那个输入框里面输入你刚才的密码,然后点+来登陆系统
  2. 创建一个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都是你维护者对象名
  3. 注册一个AS号
    • 要实现外部BGP互联与别人交换路由数据,一个AS号是必须的
    • 可注册的AS号为42424200004242423999,即424242XXXXXXXX > 4000)
    • 这里查询你喜欢的号码是否已经被注册
    • 创建一个aut-num对象
    • aut-num字段填写AS号,比如AS4242420199,注意前面有个大写的AS
    • as-name字段随意,比如IXNET-AS
    • 剩下几个字段不需要解释了,填完保存
  4. 注册一(多)个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
    • 剩余的都不需要解释了,填完保存
  5. 注册一(多)个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的一样
    • 填完保存
  6. 决定你想使用的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不解释了,填完保存.

No comments:

Post a Comment

Note: only a member of this blog may post a comment.