用例:使用 IP 黑名单筛选客户端

HTTP 标注可用于阻止来自管理员列入黑名单的客户端的请求。客户端列表可以是公开已知黑名单、您为您的组织维护的黑名单或两者的组合。

Citrix ADC 设备会根据预配置的黑名单检查客户端的 IP 地址,并在 IP 地址已被列入黑名单时阻止事务。如果 IP 地址不在列表中,设备将处理事务。

要实现此配置,您必须执行以下任务:

  1. 启用 Citrix ADC 设备上的响应程序。
  2. 在 Citrix ADC 设备上创建 HTTP 标注,并使用有关外部服务器和其他所需参数的详细信息对其进行配置。
  3. 配置响应程序策略以分析对 HTTP 标注的响应,然后全局绑定策略。
  4. 在远程服务器上创建 HTTP 标注代理。

启用响应程序

您必须先启用响应程序,然后才能使用响应程序。

使用 GUI 启用响应程序

  1. 请确保您已安装响应程序许可证。
  2. 在配置实用程序中,展开 AppExpert,然后右键单击响应程序,然后单击启用响应程序功能。

在 Citrix ADC 设备上创建 HTTP 标注

使用下表中显示的参数设置创建 HTTP 标注 Http_Callout。有关创建 HTTP 标注的更多信息,请参阅 配置 HTTP 标注 pdf。

配置响应程序策略并将其全局绑定

配置 HTTP 标注后,验证标注配置,然后配置响应程序策略以调用标注。虽然您可以在策略子节点中创建响应程序策略,然后使用 响应程序策略管理器将其全局绑定, 但本演示使用 响应程序策略管理器创建响应程序策略并在全局范围内绑定策略。

创建响应程序策略并通过 usto 将其全局绑定

  1. 导航至应 AppExpert > 响应程序
  2. 在详细信息窗格的策略管理器下,单击策略管理器
  3. 响应程序策略管理器对话框中,单击覆盖全局
  4. 单击插入策略,然后在策略名称下单击新建策略**。
  5. 在“创建响应程序策略”对话框中,执行以下操作:

    1. 在名称中,键入 PolicyResponder1
    2. 在“操作”中,选择“RESET”。
    3. 在“未定义结果操作”中,选择“全局未定义结果操作”。
    4. 在“表达式”中,键入以下默认语法表达式:

      "HTTP.REQ.HEADER("Request").EQ("Callout Request").NOT && SYS.HTTP_CALLOUT(HTTP_Callout).CONTAINS("IP Matched")"
      
    5. 单击 Create(创建),然后单击 Close(关闭)。
  6. 单击应用更改,然后单击关闭

在远程服务器上创建 HTTP 标注代理

现在,必须在远程标注服务器上创建 HTTP 标注代理,该代理将接收来自 Citrix ADC 设备的标注请求并作出适当响应。HTTP 标注代理是一个脚本,每个部署都有所不同,在编写时必须考虑到服务器规范,例如数据库类型和支持的脚本语言。

下面是验证给定 IP 地址是否属于 IP 黑名单的一部分的标注代理示例。代理已使用 Perl 脚本语言编写,并使用 MySQL 数据库。

以下 CGI 脚本检查标注服务器上的给定 IP 地址。

#!/usr/bin/perl -w
print "Content-type: text/html\n\n";
        use DBI();
        use CGI qw(:standard);
#Take the Client IP address from the request query
        my $ip_to_check = param('cip');
# Where a MYSQL database is running
        my $dsn = 'DBI:mysql:BAD_CLIENT:localhost';
# Database username to connect with
        my $db_user_name = dbuser;
# Database password to connect with
        my $db_password = 'dbpassword';
        my ($id, $password);
# Connecting to the database
        my $dbh = DBI->connect($dsn, $db_user_name, $db_password);
        my $sth = $dbh->prepare(qq{ select * from bad_clnt });
        $sth->execute();
        while (my ($ip_in_database) = $sth->fetchrow_array()) {
        chomp($ip_in_database);
# Check for IP match
        if ($ip_in_database eq $ip_to_check) {
              print "\n IP Matched\n";
                                                     $sth->finish();
                                               exit;
                }
       }
       print "\n IP Failed\n";
       $sth->finish();
       exit;