# Citrix 進行特定 User-Agent 的阻擋

如果需要在 Citrix ADC 上針對特定網站（例如 `api.aaa.com`）進行特定 `User-Agent` 的阻擋，可以基於虛擬服務 (Virtual Server) 或 `Host` 標頭進行精確匹配。以下是詳細步驟：

---

### **方法 1：基於虛擬服務 (Virtual Server)**

假設 `api.aaa.com` 綁定到一個特定的虛擬服務，則可以直接對該虛擬服務配置 Responder Policy 或 Rewrite Policy。

#### **步驟**

1. **找到虛擬服務**
    
    
    - 登入 Citrix ADC 管理界面。
    - 前往 **Traffic Management &gt; Load Balancing &gt; Virtual Servers**。
    - 找到綁定 `api.aaa.com` 的虛擬服務。
2. **創建 Responder Policy**
    
    
    - 前往 **AppExpert &gt; Responder &gt; Policies**。
    - 點擊 **Add**，輸入以下內容： 
        - **Policy Name**：例如 `BlockUserAgentForAPI`.
        - **Rule**： ```plaintext
            HTTP.REQ.HEADER("Host").EQ("api.aaa.com") && HTTP.REQ.HEADER("User-Agent").CONTAINS("某關鍵字")
            
            ```
        - **Action**：選擇 **DROP** 或 **Redirect**（例如引導到一個錯誤頁）。
3. **綁定到虛擬服務**
    
    
    - 編輯對應的虛擬服務。
    - 在 **Responder Policies** 部分，綁定剛創建的 Policy。
4. **測試效果**
    
    
    - 使用工具（如 `curl` 或 Postman），模擬包含匹配的 `User-Agent` 訪問 `api.aaa.com`，應該會被阻擋。

---

### **方法 2：基於 HTTP Host Header 的精確匹配**

如果 `api.aaa.com` 與其他應用共享同一虛擬服務，可以基於 `Host` 標頭進行條件判斷。

#### **步驟**

1. **創建 Responder Policy**
    
    
    - 配置條件如下： ```plaintext
        HTTP.REQ.HEADER("Host").EQ("api.aaa.com") && HTTP.REQ.HEADER("User-Agent").CONTAINS("某關鍵字")
        
        ```
    - 動作可以設為： 
        - **DROP**：直接丟棄請求。
        - **Redirect**：引導至一個錯誤頁面，例如： ```plaintext
            HTTP.REQ.URL.SET_TEXT_MODE("http://error-page.yourdomain.com")
            
            ```
2. **綁定到虛擬服務**
    
    
    - 在對應虛擬服務的 **Policies** 區域進行綁定。
3. **測試效果**

---

### **方法 3：使用 Rewrite 改寫或拒絕請求**

#### **改寫方式**

如果你不想丟棄請求，而是改變特定 User-Agent 的行為，可以用 Rewrite Policy 改寫請求，例如修改 `User-Agent` 為通用值或添加額外標頭：

1. **Rewrite Policy 條件**
    
    ```plaintext
    HTTP.REQ.HEADER("Host").EQ("api.aaa.com") && HTTP.REQ.HEADER("User-Agent").CONTAINS("某關鍵字")
    
    ```
2. **Rewrite Action**
    
    
    - 替換 `User-Agent`： ```plaintext
        HTTP.REQ.HEADER("User-Agent").SET_TEXT("DefaultUserAgent")
        
        ```
    - 添加自定義標頭： ```plaintext
        HTTP.REQ.HEADER("X-Blocked").SET_TEXT("Blocked")
        
        ```
3. **綁定到虛擬服務**

---

### **方法 4：使用 Application Firewall (更高級別保護)**

若已啟用 Application Firewall，可基於 `Host` 和 `User-Agent` 配置策略：

1. **創建 Application Firewall Profile**
    
    
    - 添加一個自定義 Profile，啟用 **Signatures**。
    - 創建自定義簽名： 
        - **名稱**：例如 `BlockUAForAPI`
        - **條件**： ```plaintext
            HTTP.REQ.HEADER("Host").EQ("api.aaa.com") && HTTP.REQ.HEADER("User-Agent").CONTAINS("某關鍵字")
            
            ```
2. **綁定 Profile 至虛擬服務**

---

### 測試命令範例

可以使用以下命令測試效果：

```bash
curl -H "Host: api.aaa.com" -H "User-Agent: 特定關鍵字" http://<你的 ADC IP>/path

```

這將模擬請求，並確認是否阻擋成功。

---

如果有更多需求或複雜場景，可以提供更多細節，我將協助進一步優化配置！