惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Last Watchdog
The Last Watchdog
T
Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Security @ Cisco Blogs
S
Securelist
L
LINUX DO - 最新话题
The Hacker News
The Hacker News
S
SegmentFault 最新的问题
C
Cyber Attacks, Cyber Crime and Cyber Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园_首页
博客园 - Franky
H
Heimdal Security Blog
G
Google Developers Blog
N
News and Events Feed by Topic
Cisco Talos Blog
Cisco Talos Blog
Engineering at Meta
Engineering at Meta
B
Blog RSS Feed
S
Schneier on Security
T
Threat Research - Cisco Blogs
D
DataBreaches.Net
Simon Willison's Weblog
Simon Willison's Weblog
Hacker News: Ask HN
Hacker News: Ask HN
WordPress大学
WordPress大学
Latest news
Latest news
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
N
Netflix TechBlog - Medium
T
Tor Project blog
月光博客
月光博客
D
Docker
美团技术团队
Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Cyberwarzone
Cyberwarzone
小众软件
小众软件
TaoSecurity Blog
TaoSecurity Blog
Blog — PlanetScale
Blog — PlanetScale
L
LINUX DO - 热门话题
O
OpenAI News
人人都是产品经理
人人都是产品经理
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
V2EX
C
Cisco Blogs
NISL@THU
NISL@THU
Recent Commits to openclaw:main
Recent Commits to openclaw:main
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 司徒正美

0x7f Blog

telephony42 完全指南:从零开始在 dn42 构建电话网络 telephony42 完全指南:从零开始在 dn42 构建电话网络 在 Telephony42 中配置 E.164 ENUM 在 Telephony42 中配置 E.164 ENUM 有关 DN42 的本质及诸多暴论 有关 DN42 的本质及诸多暴论 线香简评(持续更新) 线香简评(持续更新) 美味冰淇淋的制作方法 美味冰淇淋的制作方法 一场有关数字世界自决权的战争 一场有关数字世界自决权的战争 在 rDNS 上念诗!(加强版) 在 rDNS 上念诗!(加强版) 木桶饭杂谈 其二 木桶饭杂谈 其二 木桶饭杂谈 其一 木桶饭杂谈 其一 杂牌对讲机的写频 杂牌对讲机的写频 科研随想 (21.09) 科研随想 (21.09) IFSolver Reloaded 系列 0x03:解码生成 IFSolver Reloaded 系列 0x03:解码生成 IFSolver Reloaded 系列 0x02:特征匹配 IFSolver Reloaded 系列 0x02:特征匹配 IFSolver Reloaded 系列 0x01:特征提取与存储 IFSolver Reloaded 系列 0x01:特征提取与存储 新站点启用,以及一些小细节 新站点启用,以及一些小细节 IFSolver Reloaded 系列 0x00:总体结构 IFSolver Reloaded 系列 0x00:总体结构 IFSolver 的原理解析 IFSolver 的原理解析 博客静态迁移 博客静态迁移 DN42系列 0x03:Peer Finder & Looking Glass DN42系列外传 0x00 : 利用Nebula建立p2p网络 日常翻车实录 日常翻车实录 智(能)(避)障小车项目研究 基本思路 智(能)(避)障小车项目研究 基本思路 五月站点更新
DN42系列 0x02:Peering
YukariChiba · 2020-02-12 · via 0x7f Blog

先前说到了已经在DN42 Registry注册了AS和IP段,但在进行Peer前,网络还没有到DN42的路由,而进行Peering需要另外的一套协议和机制。

查找 Peer

DN42 提供了一个 交友平台 Peer Finder 来查找最近的 Peer,只需要在上面输入需要 Peer 的服务器公网 IP,在等待一阵后就能找到 DN42 网络内最近的节点(ping 值最低),并提供了联系方式。

在接下来的章节内也会提到如何在自己的服务器上部署 Peer Finder 的客户端。

配置 WireGuard

WireGuard 是一个基于 Linux 内核实现的 VPN,具有快速、高效的特点。在 DN42 里被大多数 Peering 所使用。

一般安装

在安装 Debian 10 的服务器上进行操作,只需要安装 wireguard-dkmswireguard-tools 即可。

OpenVZ 安装

由于OpenVZ的虚拟化特性,虚拟机无法安装内核模块,可参照以下文章进行安装:

生成密钥

通过以下方式可以生成一对公钥/私钥,放置在当前文件夹:

1
wg genkey | tee wg-private.key | wg pubkey > wg-public.key

交换参数

通常一次 Peer 会把隧道、IP、BGP参数都同时提前进行交换,但这里为了保持文章的连贯性,会将隧道与 BGP 部分分开。

欲成功建立 WireGuard 隧道,需要双方交换以下几个东西:

  • 隧道的地址(通常是希望进行 Peer 的服务器公网 IP 地址及 WireGuard 端口号)
  • 隧道终结点,即双方为隧道分配的 DN42 IP 地址
  • 此外,若需建立 IPv6 隧道,需要再提供一个 link-local IPv6 地址

systemd-networkd

在服务的管理上,我自信地采用了 systemd-networkd(部分发行版可能需要手动安装)。

根据 Debian Wiki 上的介绍,对于每个接口,均需要创建一个 .netdev.network 文件。

/etc/systemd/network/wgi0.netdev

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[NetDev]
Name=<接口名称>
Kind=wireguard
Description=Wireguard Network

[WireGuard]
PrivateKey={私钥}
ListenPort={本地端口}

[WireGuardPeer]
PublicKey={对方公钥}
AllowedIPs=172.20.0.0/14
AllowedIPs=fd00::/8
Endpoint={对方公网IP}:{对方端口}

/etc/systemd/network/wgi0.network

1
2
3
4
5
6
7
8
9
10
11
12
13
[Match]
Name = {接口名称}

[Address]
Address = {隧道对端IPv4}/32
Peer = {隧道本地IPv4}/32

[Address]
Address = {隧道对端IPv6}/128
Peer = {隧道本地IPv6}/128

[Address]
Address = {link-local地址}

在完成上述步骤后,使用 systemctl restart systemd-networkd 即可完成配置。若需进行测试,直接 ping 隧道对端 IP 即可。

配置 BIRD

BIRD 是一种开源实现,用于在类似 Unix 的操作系统上路由 Internet 协议数据包。它是作为布拉格查尔斯大学数学与物理学院的一个学校项目开发的,并根据 GNU 通用公共许可证发行。 BIRD 通过运行单独的守护程序来支持 Internet 协议版本 4 和版本 6。
– Wikipedia: Bird Internet routing daemon

总而言之,BIRD 是一个路由软件。由于使用的服务器均没有类似于 Arch 的发行版,所有安装的版本均为 1.6。

基本配置

DN42 在网站上提供了一个 模板配置文件

/etc/bird/bird.conf

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
protocol device {
scan time 10; # 扫描周期 10 秒
}

protocol static {
route 172.20.158.128/26 via 172.20.158.130;
route 172.20.168.128/25 via 172.20.158.130;
# 宣告两个 IPv4 段的路由
import all;
export none;
};

include "/etc/bird/local4.conf"; # 本地的配置文件,每个服务器均不相同

##include "/etc/bird/filter4.conf"; # IPv4 的路由过滤规则文件,暂不使用

protocol kernel {
scan time 20;
import none;
export filter {
if source = RTS_STATIC then reject; # 如果有隧道连接被断开,则 reject 该条路由
krt_prefsrc = OWNIP; # 使用指定的 IP 作为源 IP
accept;
};
};

# DN42 BGP 模板
template bgp dnpeers {
local as OWNAS;
path metric 1; # 单跳即可连接
import keep filtered; # 保留被过滤路由,方便检查
import filter {
if is_valid_network() && !is_self_net() then {
accept; # 仅接受属于 DN42 网络且不是自身网络的路由
}
reject;
};
export filter {
if is_valid_network() then {
accept; # 仅导出属于 DN42 网络的路由
}
reject;
};
import limit 1000 action block; # 仅接受最大 1000 条路由
};

include "/etc/bird/peers4/*"; # 加载 BGP 配置文件
include "/etc/bird/ospf4/*"; # 加载 OSPF 配置文件

IPv6 的配置文件 /etc/bird/bird6.conf 与上述内容大同小异。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
router id 172.20.158.130;  # 路由器 ID,通常以 IP 地址命名

define OWNAS = 4242421331; # 自身的 ASN
define OWNIP = 172.20.158.130; # 自身的 IP 地址

function is_self_net() { # 检验是否位于自身网络中
return net ~ [172.20.158.128/26+,172.20.168.128/25+];
}

function is_valid_network() { # 检验是否在 DN42 网络中
return net ~ [
172.20.0.0/14{21,29}, # dn42
172.20.0.0/24{28,32}, # dn42 Anycast
172.21.0.0/24{28,32}, # dn42 Anycast
172.22.0.0/24{28,32}, # dn42 Anycast
172.23.0.0/24{28,32}, # dn42 Anycast
172.31.0.0/16+, # ChaosVPN
10.100.0.0/14+, # ChaosVPN
10.0.0.0/8{15,24} # Freifunk.net
];
}

IPv6 的配置文件 /etc/bird/local6.conf 与上述内容大同小异。

在完成后,使用 systemd 可以启动这 IPv4 和 IPv6 的服务(不要忘记 enable):

1
2
systemctl start bird
systemctl start bird6

Peering 配置

完成一次 BGP Peering,需要双方交换以下内容:

  • 双方的 ASN

完成交换后,即可在 /etc/bird/peers4 和/或 /etc/bird/peers6 中加入以下文件内容

/etc/bird/peers{4,6}/{NAME}

1
2
3
4
protocol bgp <NAME> from dnpeers {
neighbor {隧道对端 IP} as {对方 ASN};
# neighbor {IPv6 link-local IP} % '{接口名称}' as {对方 ASN}; # 这是使用 link-local 方式进行 IPv6 Peering 的配置
};

之后,使用 birdc configure 和/或 birdc6 configure 重载配置。

使用 birdc show protocol 和/或 birdc6 show protocol 查看状态,如果一切配置正常,即可看到状态是 Established。

等待一段时间后,在 nixnodes 的 DN42 网络地图 上可以看到一条 Link 已经建立。


以上就是建立 BGP Peer 的一般步骤,在 AS 内部也可以使用(双方具有相同 ASN)。

以下是目前由我负责的 Niantic Network 的 Peering 联系方式:

  • 邮件: [email protected] / [email protected]
  • ASN: AS424242 1331
  • IP: 172.20.158.128/26 (骨干网)
  • Peer Finder 对应: Ox7f (IRC)
  • 在下一章节,将会建立 Peer Finder 客户端和 Looking Glass 服务,这将成为首批对外提供的服务。