Link

Avi 部署使用指南(5):Avi VS 常见配置

目录

  1. Avi 部署使用指南(5):Avi VS 常见配置
    1. 1. HTTP 到 HTTPS 重定向
    2. 2. 导入公信证书
    3. 3. 访问请求中插入X-Forwarded-For
    4. 4. 为同一个 Virtual Service 设置多个端口
    5. 5. 内容交换
    6. 6. 虚拟主机 Virtual hosting
      1. SNI 配置方式
      2. EVH(Enhanced Virtual Hosting)
    7. 7. 移除访问路径中的字段(重写 URI)
      1. 7.1 通过 HTTP Request Policy 实现
      2. 7.2 通过datascript实现1
      3. 7.3 通过datascript实现2
    8. 8. 请求路径重定向
      1. 配置方式 1 - 通过 HTTP Request Policy
      2. 配置方式 2 - 使用 Datascript 来修改请求中的路径
    9. 9. 修改客户端请求包头大小限制
    10. 10. 在访问域名前加 www
    11. 11. 全局黑名单
    12. 12. 设置自定义 SNAT 地址池
      1. 使用 VIP 进行SNAT
      2. 自定义 SNAT 地址池

1. HTTP 到 HTTPS 重定向

需求描述:

  • 网站需要挂载证书以保证连接安全,当用户访问 80 端口时,系统自动重定向到 443 端口,使用 TLS 连接。

配置步骤:

1、创建 Virtual Service,设置 80 和 443 两个端口,其中 443 勾选 SSL:

Graphical user interface, text, application, email Description automatically generated

2、在 “Application Profile” 中勾选 “System-Secure-HTTP”:

Graphical user interface, text, application, email, website Description automatically generated

3、为 Virtual Service 关联 SSL profile 和证书:

Graphical user interface, text, application, email Description automatically generated

4、访问测试:

Graphical user interface, text, website Description automatically generated

在 Client 的浏览器中 inspect 请求,发现 HTTP 被重定向到 HTTPS:

Graphical user interface, text, application Description automatically generated

注意:如果不想使用默认的 System-Secure-HTTP profile,可以新建一个 Profile,然后开启下列选项,即可实现重定向:

Graphical user interface, text, application, email Description automatically generated

2. 导入公信证书

需求描述:

  • 默认 Avi 会为启用 SSL 的 VS 生成自签名证书,但一般生产环境下会使用内部 CA 签发的证书或者购买的公信证书,需要在 Avi 中导入这些证书。

步骤:

1、准备 CA 根证书/中间证书、服务器证书和证书密钥:

Graphical user interface, text, application, chat or text message Description automatically generated

Graphical user interface, text, application Description automatically generated

2、导入根证书和中间证书(此步骤可选,根证书和中间证书只是为了方便 Avi 来验证服务器证书,实际上 VS 并不会用到)

Graphical user interface Description automatically generated

Graphical user interface, text, application, email Description automatically generated

Table Description automatically generated

Graphical user interface, text, application, email Description automatically generated

Graphical user interface, text, application Description automatically generated

3、导入 Server 证书和 key(一般证书的起始行内容为—–BEGIN CERTIFICATE—–,而 key 的起始行内容为—–BEGIN PRIVATE KEY—–,上传不正确会导致证书验证失败)

Graphical user interface, text, email Description automatically generated

Graphical user interface, text, application Description automatically generated

4、导入完成后:

Graphical user interface Description automatically generated

5、创建 HTTPS 应用,关联刚才导入的 Server 证书:

Graphical user interface, application Description automatically generated

6、服务创建后通过域名访问应用进行测试:

Graphical user interface, text, application Description automatically generated

3. 访问请求中插入X-Forwarded-For

需求描述:

  • 服务器需要记录 Client 的 IP 地址以进行分析或者自定义转发;
  • 默认负载均衡器使用全代理模式,此模式下服务器只能“看到”负载均衡的地址,无法看到 Client 的真实 IP 地址,因此需要负载均衡器在 HTTP Header 中插入 X-Forwarded-For 字段来记录 Client IP 地址,Server 通过读取此字段来获得 Client 真实 IP 地址。

在 Avi 下默认 System-HTTP Application profile 会开启此功能,直接在 Virtual Service 调用即可:

Graphical user interface, text, application, email, website Description automatically generated

Graphical user interface, text, application, email Description automatically generated

在 Server 端抓包结果:

Graphical user interface, application Description automatically generated

4. 为同一个 Virtual Service 设置多个端口

需求描述:

  • 在某些情况下,单个 Virtual Service 需要使用多个端口,并连接到后端服务器的相应端口,例如:Virtual Service 同时使用 7071,7072,7073 三个端口,分别转发给后端 Server 的 7071,7072,7073 三个端口。

配置步骤:

1、创建 Virtual Service 时使用高级向导创建新的服务:

Graphical user interface, application Description automatically generated

2、应用类型选择 “System-L4-Application”:

Graphical user interface, text, application, email, website Description automatically generated

3、在 Service Port 中添加三个端口:

Graphical user interface, text, email Description automatically generated

4、为 Virtual Service 添加 Pool,Pool 的默认端口保持为 80,无需修改:

Graphical user interface, text, application Description automatically generated

5、在向导的第三步中,勾选 “Disable Port Translation”。此功能将禁用端口转换,使得前后端端口保持一致(即 VS 端口到后端 Server 端口一一对应):

Graphical user interface, text, application, email Description automatically generated

5. 内容交换

需求描述:

  • 按照访问的路径不同,将请求转发给后端不同的 Server,例如将图片发送给专门的图片缓存服务器等,此需求可以由 Avi 的内容交换(Content Switching)功能实现。

Avi 支持两种内容交换配置:HTTP Request policy 和 Datascript,一般建议使用 HTTP Request policy。

配置步骤:

1、创建两个 Pool,第一个 Pool 中的 Server 提供普通的服务,第二个 Pool 中的 Server 提供图片服务:

Graphical user interface, text Description automatically generated with medium confidence

Graphical user interface Description automatically generated

2、通过 Advanced 向导创建 Virtual Service,在 Pool 中选择 Pool-1 作为主要 Pool:

Graphical user interface, text, application, email Description automatically generated

3、在 Step2:Policies 中添加 HTTP Request Policy,设置 Content Switch 规则:

Graphical user interface, application Description automatically generated

Graphical user interface, text, application, email Description automatically generated

Graphical user interface, text, application Description automatically generated

4、创建完成后 Virtual Service 监控界面会有两个 Pool:

Graphical user interface, application Description automatically generated

5、通过浏览器测试可以正常访问页面:

Graphical user interface, text, website Description automatically generated

临时勾选 Virtual Service 的 Non-significant-log 以查看详细的访问日志:

Graphical user interface, text, application, email Description automatically generated

测试发现 img 路径被转发到了 Pool-2:

Graphical user interface, application Description automatically generated

其他访问路径则是被转发到了 Pool-1:

Graphical user interface, application Description automatically generated

6. 虚拟主机 Virtual hosting

需求描述:

  • 为了节省 IP 地址耗用,多个服务共享一个虚拟 IP,基于域名或者路径来进行负载转发
  • 聚合负载均衡流量入口,减少网络配置,增强安全性

Avi 的 Virtual Hosting 可以实现将不同域名的访问请求转发给不同池,或者将同一域名的不同路径转发给不同的 Server。

使用 Virtual Hosting 时,每个 child vs 有自己独立的管理和监控界面,可以共享 parent vs 的 VIP 和 SSL 证书。

目前 Avi 下有两种 Virtual Hosting 模式:SNI 和 EVH,两者相比有下列区别:

  • SNI: Child VS 必须通过 HTTPS 访问,多个 Child VS 可以共享 VIP,但不能共享域名。仅能根据不同域名将流量转发到不同的池;

Diagram Description automatically generated with low confidence

  • EVH:Child VS 同时支持 HTTP 和 HTTPS,多个 Child VS 可以共享 VIP,可以根据 host(域名或者 IP)及 path 来进行条件匹配。

Diagram Description automatically generated

具体详见:https://avinetworks.com/docs/20.1/enhanced-virtual-hosting/

SNI 配置方式

配置步骤:

1、创建 Parent VS,启用 Virtual Hosting VS,Type 设置为 SNI:

Graphical user interface, text, application, chat or text message Description automatically generated

设置端口、默认的 Pool、证书。注意在 SNI 下 Parent VS 必须开启 SSL:

Graphical user interface, application Description automatically generated

Graphical user interface, application, Word Description automatically generated

2、创建 Child VS,启用 Virtual Hosting:

Graphical user interface, text, application, chat or text message Description automatically generated

设置域名和需要使用的 Pool,证书。

Graphical user interface, text, application, email Description automatically generated

Graphical user interface, text, application, email Description automatically generated

访问测试:

Graphical user interface, text, website Description automatically generated

EVH(Enhanced Virtual Hosting)

EVH 是 Avi 20.1.3 后提供的新功能,可以根据 Host 和 Path 进行请求转发。

配置步骤:

1、创建 Parent VS,启用 Virtual Hosting VS,type 设置为 Enhanced Virtual Hosting:

Graphical user interface, text, application, chat or text message Description automatically generated

设置端口、默认的 Pool 及证书:

Graphical user interface, text, application Description automatically generated

2、创建 Child VS,启用 Virtual Hosting

Graphical user interface, text, application Description automatically generated

设置 Host 和 Path 匹配条件。Host 可以使用 Parent VS 的 VIP 或者域名。

Graphical user interface, text, application, email Description automatically generated

设置此 Child VS 的 Pool:

Graphical user interface, application Description automatically generated

配置完成后的访问效果:

Graphical user interface, text Description automatically generated

7. 移除访问路径中的字段(重写 URI)

需求描述:

  • 对原始请求中的 URI 进行修改,满足应用需求,比如去掉访问 URI 中的 img 字段
    • 原始请求: http://10.10.50.188/img/logo.svg
    • 转换后的请求:http://10.10.50.9/logo.svg

此需求可以通过 HTTP Request Policy 的 Policy Tokens 实现,或者使用 Datascript 实现。

7.1 通过 HTTP Request Policy 实现

参考链接:https://avinetworks.com/docs/20.1/configuration-guide/applications/vs-policies/#policy-tokens

Policy Tokens 可以将一个请求路径转换成多个 Token,方便用户进行URL重组,例如:

原始访问请求: http://www1.avinetworks.com/docs/index.htm

原始 Request 各个字段www1avinetworkscomdocsIndex.html
Tokenhost[0]host[1]host[2]path[0]path[1]

可以通过下列配置修改请求URL:

New host: [www.host1:]

New path:/host[0]/path[0:]

重组后的 URL:www.avinetworks.com/www1/docs/index.htm

配置方式:

1、为应用添加一个 HTTP Request Policy,匹配条件为 Path 起始为 /img,设置 Content Switch 和 Rewrite URL,Rewrite URL 时,HOST header 保持不变(http://10.10.50.188),修改 Path,只保留 path[1] 及之后的 Path,且保留 Query。

Graphical user interface, text, application, email Description automatically generated

2、查看访问日志,有 /img 路径时去掉了 /img :

Graphical user interface, application Description automatically generated

针对 / 路径,则没有进行 URI Rewrite:

Graphical user interface, text, application, email Description automatically generated

7.2 通过datascript实现1

参考链接:https://avinetworks.com/docs/20.1/datascript-avi-http-get_path_tokens/

除了使用 HTTP Request Policy,也可以用 Datascript 来修改请求中的路径,例如:

原始请求: http://10.10.50.188/img/logo.svg

转换后的请求:http://10.10.50.9/logo.svg

除了修改路径外,同时本示例也配置了 Content Switch。

配置方式:在 HTTP Request Event Script 中添加下列内容:

path = avi.http.get_path()
if string.beginswith(path, "/img") then
 path="/"..avi.http.get_path_tokens(2)
 avi.http.set_path(path)
 avi.Pool.select("Pool-2-img")
end

# 注:get_path_tokens(2) 表示保留path变量中第二个token及之后的内容。

Graphical user interface, text, application Description automatically generated

img

访问 /img 时的日志:

A screenshot of a computer Description automatically generated with medium confidence

访问 / 时的日志:

Graphical user interface, text, application, email Description automatically generated

7.3 通过datascript实现2

参考链接:

https://avinetworks.com/docs/20.1/datascript-string-sub/

除了使用 Path token,也可以使用 string.sub 来剔除某些字符。

配置方式:在 HTTP Request Event Script 中添加下列内容:

path = avi.http.get_path()
if string.beginswith(path, "/img") then
 path = string.sub(path, 5)
 avi.http.set_path(path)
 avi.Pool.select("Pool-2-img")
end

#注:string.sub(path, 5) 表示保留path变量中第五个字符(/img这四个字符之后的字符)开始之后的path

Graphical user interface, application Description automatically generated

Graphical user interface, text, application Description automatically generated

访问 /img 时的日志:

Graphical user interface, application Description automatically generated

访问 / 时的日志:

Graphical user interface, application Description automatically generated

8. 请求路径重定向

需求描述:

  • 原始请求: http://10.10.50.34/app2

  • 转换后的请求:http://10.10.50.9/app1

配置方式 1 - 通过 HTTP Request Policy

Graphical user interface, text, application Description automatically generated

相关访问请求日志:

Graphical user interface, application Description automatically generated

配置方式 2 - 使用 Datascript 来修改请求中的路径

添加 Datascript,在 HTTP Request Event Script 中添加下列内容:

path = avi.http.get_path()
if string.beginswith(path, "/app2") then
 path = string.sub(path, 6)
 avi.http.set_path("/app1"..path)
end

Graphical user interface, text, application, website Description automatically generated

Graphical user interface, application Description automatically generated

相关访问请求日志:

Graphical user interface, text, application Description automatically generated

9. 修改客户端请求包头大小限制

需求描述:

  • 默认 Avi 会限制单个 Client 请求包头最大为 12KB,如果应用的请求包头会大于此限制,请求会被 Avi 丢弃且返回 “414 Request-URI Too Large”,可以通过修改 Application Profile 来调整此值。

配置方式:

1、编辑应用当前使用的 Application Profile(建议为应用新建一个,不要修改系统默认的 System-HTTP):

Graphical user interface, text, application, email, website Description automatically generated

2、在 DDoS 中找到 “HTTP Size Settings”,修改 “Client Max Header Field Size”。

Graphical user interface, text, application, email Description automatically generated

10. 在访问域名前加 www

需求描述:

  • 某些时候,用户希望访问根域名时自动加上 www,此需求可以通过 Datascript 实现。

具体的 Datascript 示例如下:

if string.beginswith(avi.http.hostname(),"www") == false then
  avi.http.redirect(avi.http.protocol() .. "://www." .. avi.http.hostname() .. 
  avi.http.get_uri())
end

Graphical user interface, text, application, email Description automatically generated

访问效果:

Graphical user interface, application Description automatically generated

11. 全局黑名单

需求描述:

  • 一些企业内部会部署威胁情报分析软件,这些软件可以发现一些恶意攻击,发现后希望其他安全软件可以对相关的 IP 进行拉黑,禁止这些 IP 访问内部业务系统。在 Avi 中可以直接使用 Network Security 策略+IP 组实现。

具体配置方式如下:

在 Avi 的 “Templates>Groups>IP Group” 中新建一个黑名单 IP 组。

Graphical user interface, application Description automatically generated

然后编辑 Virtual Service,在 Network Security 中基于 IP 组添加 Deny 策略:

Graphical user interface, text, application, email Description automatically generated

12. 设置自定义 SNAT 地址池

需求描述:

  • 客户希望使用 VIP 作为 SNAT 地址;
  • 默认 Avi 会使用每个 SE 的 Data NIC 来执行 SNAT 和后端 Server 连接,因此在使用 Avi 时默认就可以突破传统负载均衡器 65535 个端口(连接)的限制。如果客户有特殊需求,需要使用自定义 SNAT 地址池来满足超大并发需求,Avi 也支持手动指定 SNAT 地址池。

具体配置方式如下:

使用 VIP 进行SNAT

编辑 Virtual Service,在 Advanced 中勾选 “Use VIP as SNAT”:

注意:此选项仅支持 Active/Standby 高可用模式,不支持 N+M 或者 Active/Active。

A screenshot of a cell phone Description automatically generated

自定义 SNAT 地址池

编辑 Virtual Service,在 Advanced 中设置 “SNAT IP address”,注意设置的 SNAT 地址池必须和 VIP 在同一个网段:

A screenshot of a cell phone Description automatically generated