像普通的web应用可以能过deny 和allow这样的参数设置黑白名单,当使用varnish直接监听80端口对外提供服务时,我们也可以通过vcl 规则来实现黑白名单的功能。

1、定义ACL,导入外部IP列表

1acl forbidden {
2   include "/etc/varnish/chinaip.dat";
3}

而chinaip.dat的内部如下:

1"192.168.1.0"/24;
2"10.0.0.0"/24;

2、通过vcl_recv策略实现黑白名单

1if (client.ip ~ forbidden) {
2   error 505 "Forbidden";
3}

上面是对黑名单中的IP禁止防问,如果想实现只允许某些IP访问,而其他IP不允许访问,就做取反就行了。

3、自定义错误页

利用obj.status参数,可以很方便的实现对不对代码实现不用的操作。如下,如果状态码为750 ,重定向至google,错误码为505直接返回varnish错误页。

 1sub vcl_error {
 2set obj.http.Content-Type = "text/html; charset=utf-8";
 3if (obj.status == 750) {
 4set obj.http.Location = "http://www.google.com/";
 5set obj.status = 302;
 6deliver;
 7}
 8else {
 9synthetic {"
10<?xml version="1.0" encoding="utf-8"?>
11
12<html>
13<head>
14<title>"} obj.status " " obj.response {"</title>
15</head>
16<body>
17<h1>Error "} obj.status " " obj.response {"</h1>
18<p>"} obj.response {"</p>
19</body>
20</html>
21"};
22}
23return (deliver);
24}

4、验证配置并生效

1varnishd -d -f /etc/varnish/my.vcl
2service varnish restart