3 个版本
使用旧的 Rust 2015
0.0.4 | 2024 年 3 月 26 日 |
---|---|
0.0.3 | 2023 年 6 月 1 日 |
0.0.2 | 2021 年 5 月 14 日 |
#978 在 命令行工具
84 每月下载量
73KB
1.5K SLoC
RRDPIT
"rrdpit" 是一个小型工具,可以将系统中的目录指向它,并生成 RPKI RRDP (RFC 8182) 通知、快照和增量文件。您需要使用您偏好的 http 服务器将这些文件交付给世界。
警告
此工具旨在在发布运行之间运行,而不是在发布运行期间运行。作为同步过程的一部分,源目录被递归地爬取。如果在同步过程中更改了路径,则可能会导致 RRDP 快照和增量包含不一致的存储库状态。
当 rrdpit 再次运行而没有更改时,这种情况将自行解决,但它可能会对 RPKI 验证器造成错误和噪声。
因此,最佳选项是在已知不会更改源的情况下运行此工具。例如,当非 RRDP 兼容的发布服务器知道它已完成内容写入时,它可以触发 rrdpit,并在 rrdpit 完成后再写入新内容。
当然,最安全的选项可能仍然是使用 RRDP 兼容的 RPKI 发布服务器,这样就不需要这个额外的辅助工具。
变更日志
版本 0.0.4
更新 ring 到 0.17。
版本 0.0.3
添加了使用 --max_deltas 限制最大增量数量的选项。保留太多增量会导致 RRDP 通知文件很大,如果单个增量比快照小得多,这将对服务器产生重大影响。如果许多 RP 请求大通知文件,这可能会对服务器产生重大影响。
默认限制设置为 25。如果 rrdpit 每分钟运行一次,这个值将很好地工作,因为它比典型的 RP 检索间隔(10 分钟)多两倍。如果 rrdpit 运行得更频繁,则此数字可以降低。基本上,应该保留足够的增量,以便返回的 RP 永远不需要加载快照。
此设置的最低值为 1。
版本 0.0.2
忽略源目录中的隐藏文件。即排除所有以 '.' 字符开头的文件和文件夹。
版本 0.0.1
初始版本。
安装 rrdpit
假设您已经安装了rsync和C工具链,但没有安装Rust,以下是安装Rust的方法。
curl https://sh.rustup.rs -sSf | sh
source ~/.cargo/env
如果您已安装了旧版本的Rust,可能需要更新它。
rustup update
要在用户主目录下安装'rrdpit',请使用以下命令:
git clone [email protected]:NLnetLabs/rrdpit.git
cd rrdpit
cargo install
如果您已安装了旧版本的rrdpit,可以通过以下方式更新:
cargo install -f
使用rrdpit
您可以向rrdpit请求帮助。
rrdpit --help
rrdpit 0.0.2
Dist to RPKI RRDP
USAGE:
rrdpit --https <uri> --rsync <uri> --source <dir> --target <dir> [clean]
FLAGS:
--help Prints help information
-V, --version Prints version information
OPTIONS:
-h, --https <uri> base rrdp uri
-r, --rsync <uri> base rsync uri
-s, --source <dir> source directory
-t, --target <dir> target directory
ARGS:
<clean> Clean up target dir (handle with care!)
请注意,'clean'是可选的。如果使用,rrdpit将尝试清理目标目录,即它会删除未使用的会话ID目录,以及不再引用的delta文件的未使用版本目录。
请谨慎使用此选项。您不希望意外地将系统目录用于--target
选项。尤其是如果您以root身份运行,这也会很危险。
示例
同步整个ARIN RPKI存储库
$ mkdir -p tmp/arin
$ cd tmp/arin/
$ mkdir source
$ rsync -zarvh rsync://rpki.arin.net/repository ./source/
receiving file list ... done
./
arin-rpki-ta.cer
arin-rpki-ta/
arin-rpki-ta/5e4a23ea-e80a-403e-b08c-2171da2157d3.cer
arin-rpki-ta/arin-rpki-ta.crl
arin-rpki-ta/arin-rpki-ta.mft
arin-rpki-ta/5e4a23ea-e80a-403e-b08c-2171da2157d3/
.....
.....
sent 158.78K bytes received 11.08M bytes 976.85K bytes/sec
total size is 14.25M speedup is 1.27
现在在目标目录中创建RRDP文件
$ mkdir target
$ time rrdpit --https https://rpki.arin.net/rrdp/ \
--rsync rsync://rpki.arin.net/repository/ \
--source ./source/ \
--target ./target/
real 0m0.848s
user 0m0.385s
sys 0m0.258s
检查所有预期文件是否存在,或者至少数量正确
$ find ./source/ -type f | wc -l
7031
$ grep uri ./target/8e142e20-236c-4694-8430-b05693fab150/1/snapshot.xml | wc -l
7031
(请注意,该uuid是随机生成的会话ID,用于目标目录为空时)
$ rm source/arin-rpki-ta.cer
$ time rrdpit --https https://rpki.arin.net/rrdp/ \
--rsync rsync://rpki.arin.net/repository/ \
--source ./source/ \
--target ./target/
real 0m1.484s
user 0m1.285s
sys 0m0.186s
$ find target
target
target/8e142e20-236c-4694-8430-b05693fab150
target/8e142e20-236c-4694-8430-b05693fab150/1
target/8e142e20-236c-4694-8430-b05693fab150/1/snapshot.xml
target/8e142e20-236c-4694-8430-b05693fab150/2
target/8e142e20-236c-4694-8430-b05693fab150/2/snapshot.xml
target/8e142e20-236c-4694-8430-b05693fab150/2/delta.xml
target/notification.xml
$ cat ./target/notification.xml
<notification xmlns="http://www.ripe.net/rpki/rrdp" version="1" session_id="8e142e20-236c-4694-8430-b05693fab150" serial="2">
<snapshot uri="https://rpki.arin.net/rrdp/8e142e20-236c-4694-8430-b05693fab150/2/snapshot.xml" hash="3e8645f306c3c9a888c236fc923128959c88ee2d7abad11802a2d201a29f992f" />
<delta serial="2" uri="https://rpki.arin.net/rrdp/8e142e20-236c-4694-8430-b05693fab150/2/delta.xml" hash="c08298b02f4e53a652bc6bc6d66c136e2ee9181d19d616e90bfd80b50341d6eb" />
</notification>
$ cat ./target/8e142e20-236c-4694-8430-b05693fab150/2/delta.xml
<delta xmlns="http://www.ripe.net/rpki/rrdp" version="1" session_id="8e142e20-236c-4694-8430-b05693fab150" serial="2">
<withdraw uri="rsync://rpki.arin.net/repository/arin-rpki-ta.cer" hash="88e8ed8bb7bdafb8942c82cb6816bb65f37372a8f67a26c045c0103e42996b9e" />
</delta>
请注意,如果您再次同步,并且源目录中没有更改,则不会写入任何delta文件
$ time rrdpit --https https://rpki.arin.net/rrdp/ \
--rsync rsync://rpki.arin.net/repository/ \
--source ./source/ \
--target ./target/
real 0m1.495s
user 0m1.292s
sys 0m0.190s
$ find target
target
target/8e142e20-236c-4694-8430-b05693fab150
target/8e142e20-236c-4694-8430-b05693fab150/1
target/8e142e20-236c-4694-8430-b05693fab150/1/snapshot.xml
target/8e142e20-236c-4694-8430-b05693fab150/2
target/8e142e20-236c-4694-8430-b05693fab150/2/snapshot.xml
target/8e142e20-236c-4694-8430-b05693fab150/2/delta.xml
target/notification.xml
rrdpit还将对现有的RRDP文件执行一些健全性检查,如果发现问题,它将使用新的会话
$ find target -type f
target/8e142e20-236c-4694-8430-b05693fab150/1/snapshot.xml
target/8e142e20-236c-4694-8430-b05693fab150/2/snapshot.xml
target/8e142e20-236c-4694-8430-b05693fab150/2/delta.xml
target/notification.xml
$ echo "corrupt" > target//8e142e20-236c-4694-8430-b05693fab150/2/delta.xml
$ rrdpit --https https://rpki.arin.net/rrdp/ \
--rsync rsync://rpki.arin.net/repository/ \
--source ./source/ \
--target ./target/
$ find target -type f
target/07cfc1ce-e7d9-4bec-8a70-9feb76778700/1/snapshot.xml
target/8e142e20-236c-4694-8430-b05693fab150/1/snapshot.xml
target/8e142e20-236c-4694-8430-b05693fab150/2/snapshot.xml
target/8e142e20-236c-4694-8430-b05693fab150/2/delta.xml
target/notification.xml
可选地,您可以让rrdpit清理旧文件
$ rrdpit --https https://rpki.arin.net/rrdp/ \
--rsync rsync://rpki.arin.net/repository/ \
--source ./source/ \
--target ./target/ \
clean
$ find target -type f
target/07cfc1ce-e7d9-4bec-8a70-9feb76778700/1/snapshot.xml
target/notification.xml
未来
此代码可能需要进行更多测试。有些事情可以清理。然而,从我们所进行的测试来看,它似乎工作得很好。
当然,您可以创建问题,但鉴于我们目前的重点是Krill,其中包括其自己的RRDP服务器,我们无法保证问题将获得高优先级。拉取请求可能会得到更多关注 ;)
依赖项
~9–17MB
~311K SLoC