tcpdump -c 4000 -s 10000 -w dumpfile.bin
FreeBSD 中 IPsec 功能的独立验证
商标
FreeBSD 是 FreeBSD 基金会的注册商标。
Motif、OSF/1 和 UNIX 是注册商标,IT DialTone 和 The Open Group 是 The Open Group 在美国和其他国家/地区的商标。
制造商和销售商用来区分其产品的许多名称都被宣称为商标。在本文档中出现这些名称的地方,如果 FreeBSD 项目知道商标声明,则这些名称后面会加上“™”或“®”符号。
目录
摘要
您安装了 IPsec,并且它似乎正在工作。你怎么知道?我描述了一种实验验证 IPsec 是否正常工作的方法。
1. 问题
首先,假设您已 安装 IPsec。你怎么知道它是否 正常工作?当然,如果配置错误,您的连接将无法工作,并且在您最终正确配置后它将可以工作。netstat(1) 将列出它。但是,您可以独立确认它吗?
2. 解决方案
首先,一些与加密相关的信息理论
加密数据是均匀分布的,即每个符号具有最大熵;
原始的未压缩数据通常是冗余的,即具有低于最大值的熵。
假设您可以测量数据进出网络接口的熵。然后您可以看到未加密数据和加密数据之间的差异。即使“加密模式”下的一些数据未加密,这也将是正确的——因为如果数据包要可路由,则最外层的 IP 标头必须被加密。
2.1. MUST
Ueli Maurer 的“随机比特生成器的通用统计测试”(MUST)快速测量样本的熵。它使用类似压缩的算法。Maurer 的通用统计测试(块大小为 8 位) 用于测量文件的连续(约四分之一兆字节)块的变体。
2.2. Tcpdump
我们还需要一种捕获原始网络数据的方法。一个名为 tcpdump(1) 的程序可以让您做到这一点,前提是您已在 src/sys/i386/conf/KERNELNAME 中启用了Berkeley 数据包过滤器接口。
命令
将捕获 4000 个原始数据包到dumpfile.bin。在此示例中,每个数据包最多将捕获 10,000 个字节。
3. 实验
以下是实验步骤
打开一个窗口连接到 IPsec 主机,另一个窗口连接到不安全的另一台主机。
现在启动 Tcpdump。
在“安全”窗口中,运行 UNIX® 命令 yes(1),它将流式传输
y
字符。过一段时间后,停止此操作。切换到不安全的窗口,并重复此操作。过一段时间后,停止。现在在捕获的数据包上运行 Maurer 的通用统计测试(块大小为 8 位)。您应该会看到类似以下内容。需要注意的重要一点是,安全连接的预期值为 7.18,实际值为 93%(6.7),而“正常”连接的预期值为 7.18,实际值为 29%(2.1)。
% tcpdump -c 4000 -s 10000 -w ipsecdemo.bin % uliscan ipsecdemo.bin Uliscan 21 Dec 98 L=8 256 258560 Measuring file ipsecdemo.bin Init done Expected value for L=8 is 7.1836656 6.9396 -------------------------------------------------------- 6.6177 ----------------------------------------------------- 6.4100 --------------------------------------------------- 2.1101 ----------------- 2.0838 ----------------- 2.0983 -----------------
4. 注意事项
此实验表明 IPsec确实似乎正在均匀地分发有效负载数据,就像加密应该做的那样。但是,此处描述的实验无法检测系统中许多可能的缺陷(我没有任何证据表明存在这些缺陷)。这些包括密钥生成或交换不佳、数据或密钥对其他人可见、使用弱算法、内核破坏等。研究源代码;了解代码。
5. IPsec --- 定义
IPv4 的 Internet 协议安全扩展;IPv6 要求。一种在 IP(主机到主机)级别协商加密和身份验证的协议。SSL 仅保护一个应用程序套接字;SSH 仅保护登录;PGP 仅保护指定的文件或消息。IPsec 加密两台主机之间的所有内容。
6. 安装 IPsec
大多数现代版本的 FreeBSD 在其基本源代码中都支持 IPsec。因此,您需要在内核配置中包含IPSEC
选项,并在内核重建和重新安装后,使用 setkey(8) 命令配置 IPsec 连接。
有关在 FreeBSD 上运行 IPsec 的全面指南,请参阅 FreeBSD 手册。
7. src/sys/i386/conf/KERNELNAME
这需要出现在内核配置文件中,以便使用 tcpdump(1) 捕获网络数据。请确保在添加此内容后运行 config(8),并重建和重新安装。
device bpf
8. Maurer 的通用统计测试(块大小为 8 位)
您可以在 此链接 中找到相同的代码。
/* ULISCAN.c ---blocksize of 8 1 Oct 98 1 Dec 98 21 Dec 98 uliscan.c derived from ueli8.c This version has // comments removed for Sun cc This implements Ueli M Maurer's "Universal Statistical Test for Random Bit Generators" using L=8 Accepts a filename on the command line; writes its results, with other info, to stdout. Handles input file exhaustion gracefully. Ref: J. Cryptology v 5 no 2, 1992 pp 89-105 also on the web somewhere, which is where I found it. -David Honig honig@sprynet.com Usage: ULISCAN filename outputs to stdout */ #define L 8 #define V (1<<L) #define Q (10*V) #define K (100 *Q) #define MAXSAMP (Q + K) #include <stdio.h> #include <math.h> int main(argc, argv) int argc; char **argv; { FILE *fptr; int i,j; int b, c; int table[V]; double sum = 0.0; int iproduct = 1; int run; extern double log(/* double x */); printf("Uliscan 21 Dec 98 \nL=%d %d %d \n", L, V, MAXSAMP); if (argc < 2) { printf("Usage: Uliscan filename\n"); exit(-1); } else { printf("Measuring file %s\n", argv[1]); } fptr = fopen(argv[1],"rb"); if (fptr == NULL) { printf("Can't find %s\n", argv[1]); exit(-1); } for (i = 0; i < V; i++) { table[i] = 0; } for (i = 0; i < Q; i++) { b = fgetc(fptr); table[b] = i; } printf("Init done\n"); printf("Expected value for L=8 is 7.1836656\n"); run = 1; while (run) { sum = 0.0; iproduct = 1; if (run) for (i = Q; run && i < Q + K; i++) { j = i; b = fgetc(fptr); if (b < 0) run = 0; if (run) { if (table[b] > j) j += K; sum += log((double)(j-table[b])); table[b] = i; } } if (!run) printf("Premature end of file; read %d blocks.\n", i - Q); sum = (sum/((double)(i - Q))) / log(2.0); printf("%4.4f ", sum); for (i = 0; i < (int)(sum*8.0 + 0.50); i++) printf("-"); printf("\n"); /* refill initial table */ if (0) { for (i = 0; i < Q; i++) { b = fgetc(fptr); if (b < 0) { run = 0; } else { table[b] = i; } } } } }
最后修改时间:2024 年 9 月 23 日,作者 Fernando Apesteguía