VCLI协议-编写CLI界面脚本

将Varnish CLI用作API时,它有一些特别之处。

首先: vcli.h 包含幻数。

第二:如果您使用 varnishadm 要连接到 varnishd 出于API目的,请使用 -p 参数以获取“PASS”模式。

在“PASS”模式下,或使用直接CLI连接(更多信息如下),响应的第一行始终正好是13字节长,包括NL,并且它包含两个数字:状态代码和响应“正文”中的字节计数:

200␣19␣␣␣␣␣␣␤
PONG␣1613397488␣1.0

这使得解析响应变得明确,即使在这样的情况下,响应不以NL结尾。

Varnishapi库包含实现CLI协议基础的函数,有关更多信息,请参阅 vcli.h 包括文件。

本地和远程CLI连接

这个 varnishd 进程通过需要PSK身份验证(见下文)但不提供保密性的TCP连接接收CLI命令。

“无保密”意味着,如果您将这些TCP连接配置为在网络上运行,任何可以嗅探数据包的人都可以看到您的CLI命令。如果您需要保密,请使用 ssh 运行 varnishadm 或者以隧道方式传输该TCP连接。

默认情况下 varnishd 绑定到 localhost 并要求内核分配一个随机端口号。产生的监听地址存储在共享内存中,其中 varnishadm 程序会找到它。

您可以配置 varnishd 来侦听特定的地址 -T 参数,则它也将写入共享内存,因此 varnishadm 继续工作::

# Bind to internal network
varnishd -T 192.168.10.21:3245

您还可以配置 varnishd 主动打开到另一个“控制器”程序的TCP连接,并使用 -M 争论。

最后,在“调试模式”下使用 -d 论据, varnishd 将保持在前台,并将stdin/stdout转换为CLI连接。

身份验证CLI连接

CLI连接到 varnishd 使用“预共享密钥”身份验证方案进行身份验证,另一端必须证明他们知道 the contents of 这份秘密文件 varnishd 用途。

他们不必读取特定计算机上的完全相同的文件,他们可以在不同的计算机上读取完全不同的文件,或者从服务器获取机密。

文件的名称可以使用 -S 选项,以及 varnishd 将名称记录在共享内存中,因此 varnishadm 都能找到它。

作为最低限度 varnishd 需要能够读取文件,但除此之外,它可以以任何您想要的方式进行限制。

因为重要的不是文件,而是文件的内容,所以您可以使文件对所有人都不可读,而是将文件的副本放在授权用户的主目录中。

文件只在以下时刻被读取: auth 已发出CLI命令,并且内容未缓存在 varnishd ,这样您就可以随时更改它。

经过身份验证的会话如下所示:

critter phk> telnet localhost 1234
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
107 59
ixslvvxrgkjptxmcgnnsdxsvdmvfympg

Authentication required.

auth 455ce847f0073c7ab3b1465f74507b75d3dc064c1e7de3b71e00de9092fdc89a
200 279
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
FreeBSD,13.0-CURRENT,amd64,-jnone,-sdefault,-sdefault,-hcritbit
varnish-trunk revision 89a558e56390d425c52732a6c94087eec9083115

Type 'help' for command list.
Type 'quit' to close CLI session.
Type 'start' to launch worker process.

CLI状态107表示需要身份验证。回答文本的前32个字符是挑战“ixsl...mpg”。质询是为每个CLI连接随机生成的,每次发出107都会发生变化。

必须使用最近发出的质询来计算验证码“455C…c89a”。

通过将SHA256函数应用于以下字节序列来计算验证码:

  • 质询字符串

  • 换行符(0x0a)。

  • 机密文件的内容

  • 质询字符串

  • 换行符(0x0a)。

并将生成的摘要转储为小写十六进制。

在上面的示例中,秘密文件包含 foo\n 因此:

critter phk> hexdump secret
00000000  66 6f 6f 0a                                       |foo.|
00000004
critter phk> cat > tmpfile
ixslvvxrgkjptxmcgnnsdxsvdmvfympg
foo
ixslvvxrgkjptxmcgnnsdxsvdmvfympg
^D
critter phk> hexdump -C tmpfile
00000000  69 78 73 6c 76 76 78 72  67 6b 6a 70 74 78 6d 63  |ixslvvxrgkjptxmc|
00000010  67 6e 6e 73 64 78 73 76  64 6d 76 66 79 6d 70 67  |gnnsdxsvdmvfympg|
00000020  0a 66 6f 6f 0a 69 78 73  6c 76 76 78 72 67 6b 6a  |.foo.ixslvvxrgkj|
00000030  70 74 78 6d 63 67 6e 6e  73 64 78 73 76 64 6d 76  |ptxmcgnnsdxsvdmv|
00000040  66 79 6d 70 67 0a                                 |fympg.|
00000046
critter phk> sha256 tmpfile
SHA256 (tmpfile) = 455ce847f0073c7ab3b1465f74507b75d3dc064c1e7de3b71e00de9092fdc89a
critter phk> openssl dgst -sha256 < tmpfile
455ce847f0073c7ab3b1465f74507b75d3dc064c1e7de3b71e00de9092fdc89a

源文件 lib/libvarnish/cli_auth.c 包含一个有用的函数,该函数在给定机密文件的打开文件描述符和质询字符串的情况下计算响应。

另见: