如果文档中的示例正确,我正在尝试使用std.ip
它作为 varnish 4.0 的一部分来返回客户端 IP,它应该是X-Forwarded-For标头中的第一个有效 IP 地址。
varnishtest "Test v4 vcl X-Forwarded-For Header logic"
server s1 {
rxreq
expect req.http.X-Real-IP == "2.1.1.1"
expect req.http.X-Forwarded-For == "2.1.1.1, 3.3.3.3, 3.3.3.3, 127.0.0.1"
txresp
} -start
varnish v1 -vcl+backend {
sub vcl_recv {
set req.http.X-Real-IP = std.ip(req.http.X-Forwarded-For, "0.0.0.0");
}
} -start
client c1 {
txreq -url "/" -hdr "X-Forwarded-For: 2.1.1.1, 3.3.3.3, 3.3.3.3"
rxresp
}
client c1 -run
以上死得很丑:
...
*** v1 0.9 debug| Assert error in vwk_thread(), waiter/cache_waiter_kqueue.c line 115:\n
*** v1 0.9 debug| Condition(read(vwk->pipe[0], &c, 1) == 1) not true.\n
...
并且不会通过返回第一个 IP 地址来实现我想要的行为。
更新
或者,我发现以下内容确实可以用于相同的目的,但仍然无法开始std.ip
工作:
varnish v1 -vcl+backend {
sub vcl_recv {
set req.http.X-Real-IP = regsub(req.http.X-Forwarded-For, "\s*,.*$", "");
}
} -start
作为后续问题。这个vcl_recv{...}
逻辑实际上存在于我的default.vcl
文件中,其中定义了我所有的后端、探针。但是,当我尝试通过包含到 varnishtest 文件中来测试该代码时,如下所示:
varnish v1 -vcl+backend {
include "/path/to/file.vcl";
} -start
测试没有得到expect
服务器中的语句s1
。如果有人可以澄清以下内容,我会非常高兴:
- 为什么
std.ip(req.http.X-Forwarded-For, "0.0.0.0")
表现不如预期? - 如何
default.vcl
在 set server 中测试包含的期望语句s1
?
谢谢你。