應用場景
在基于TCP的應用程序中,獲取客戶端真實源IP地址可以用于以下應用場景:
- 訪問控制和安全策略:通過獲取客戶端真實源IP地址,應用程序可以實施訪問控制策略,限制或允許特定IP地址的訪問。這可以用于身份驗證、防止未經授權訪問、限制特定地理區域的訪問等。例如,防火墻可以根據客戶端IP地址來決定是否允許連接或阻止連接。
- 防止濫用、攻擊和入侵檢測:獲取客戶端真實源IP地址可以用于防止濫用和攻擊行為。通過分析IP地址,可以實施阻止流量來自惡意IP地址的策略,如IP黑名單、限制惡意用戶的連接速率或引入入侵檢測系統。這有助于提高應用程序的安全性,并保護系統免受惡意活動的危害。
- 統計和分析:獲取客戶端真實源IP地址可以用于統計和分析訪問模式和用戶行為。通過分析IP地址,可以了解用戶的地理位置、訪問頻率、使用設備和瀏覽器等信息。這些數據可以用于優化用戶體驗、定位目標受眾、改進應用程序設計和定制內容。
- 安全審計和合規要求:獲取客戶端真實源IP地址有助于安全審計和合規要求的滿足。通過記錄和跟蹤源IP地址,可以提供追溯用戶行為的能力,以滿足法規和合規性要求。這對于監測和報告濫用行為、保護用戶隱私和滿足法律要求非常重要。
工作原理
天翼云資源池,針對四層的TCP請求(TCP監聽器),可以通過下述兩種方式獲取客戶端源IP:
- 在后端主機內配置TOA插件獲取客戶端的真實源IP地址。TOA是操作系統的內核模塊,需要在ELB后端主機中安裝TOA插件,以實現后端主機可獲取客戶端真實源IP地址的目的。具體操作參考——操作步驟(TOA模式)。
- 在后端主機組上打開“獲取客戶端真實源IP”(該功能不支持平滑開啟,切換到ProxyProtocol需要業務停服升級,請謹慎配置)開關,并在后端主機里開啟Proxy Protocol后獲取到客戶端真實源IP。具體操作參考——操作步驟(Proxy Protocol模式)。該功能具體支持情況請以控制臺顯示為準。
說明“獲取客戶端真實源IP”需要代理服務器和后端主機都支持該協議才能正常使用。如果后端主機不具備解析Proxy Protocol協議能力,打開特性開關可能會導致后端服務解析異常,從而影響服務可用性。
對于操作步驟(Proxy Protocol模式)實際支持情況以控制臺展現為準。
操作步驟
TOA模式
- 準備編譯環境
a. 針對Linux內核版本為3.0以上的操作系統。以Centos環境為例。
b. 安裝gcc編譯器,執行以下命令:
sudo yum install gcc
c. 安裝make工具,執行以下命令:
sudo yum install make
d. 安裝內核模塊開發包,執行以下命令:
sudo yum install kernel-devel-`uname -r`
e. 注意開發包的版本需要與內核版本一致,假如自帶源里沒有對應的內核開發包,可以到以下鏈接地址進行下載,地址如下:
//mirror.netcologne.de/oracle-linux-repos/ol7_latest/getPackage/
以3.10.0-1160.80.1.0.1.el7.x86_64為例,下載后執行以下命令安裝:
rpm -ivh kernel-devel-3.10.0-1160.80.1.0.1.el7.x86_64.rpm
f. 以下步驟是以Ubuntu、Debian環境為例,進行編譯環境準備。
g. 安裝gcc編譯器,執行以下命令:
sudo apt-get install gcc
h. 安裝make工具,執行以下命令:
sudo apt-get install make
i. 安裝內核模塊開發包,執行以下命令:
sudo apt-get install linux-headers-`uname -r `
- 編譯內核模塊
a. 下載TOA內核模塊源代碼,點擊進入 (獲取驗證碼:t7nv)進行下載。
b. 編譯模塊。執行以下命令:
cd src
make
c. 編譯過程若未提示warning或者error,說明編譯成功,檢查當前目錄下是否已經生成toa.ko文件。
- 加載內核模塊
a. 加載內核模塊,執行以下命令:
sudo insmod toa.ko
b. 驗證模塊加載情況及內核輸出信息,執行以下命令:
dmesg | grep TOA
假如提示信息中包含“TOA: toa loaded”,則證明內核模塊已經加載成功。
說明當CoreOS在容器中編譯完內核模塊后,需要將內核模塊復制到宿主系統,最后在宿主系統中加載內核模塊。另外由于編譯內核模塊的容器和宿主系統共享/lib/modules目錄,可以在容器中將內核模塊復制到該目錄下,以供宿主系統使用
- 自動加載內核模塊
a. 把加載TOA內核模塊的命令加到您的啟動腳本中,能夠保證TOA內核模塊在系統啟動時生效。
b. 在自定義的啟動腳本中添加加載TOA內核模塊的命令。具體步驟可參考以下操作:
c. 在“/etc/sysconfig/modules/”目錄下新建toa.modules文件。該文件包含了TOA內核模塊的加載腳本。toa.modules文件內容,請參考如下示例:
#!/bin/sh
/sbin/modinfo -F filename /root/toa/toa.ko > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/insmod /root/toa/toa.ko
fi
d. “/root/toa/toa.ko”為TOA內核模塊文件的路徑,您需要將其替換為自己編譯的TOA內核模塊路徑。
e. 為toa.modules啟動腳本添加可執行權限,執行以下命令:
sudo chmod +x /etc/sysconfig/modules/toa.modules
- 安裝多節點
假如要在相同的操作系統中加載此內核模塊,可以將toa.ko文件拷貝到您的虛擬機中,參照以上加載內核模塊的步驟,內核模塊加載成功以后,應用程序可以正常獲取訪問者的真實源IP地址。
- 驗證TOA內核模塊
a. TOA內核模塊安裝成功后即可直接獲取到源地址,在安裝有python的后端服務器中啟動一個HTTP服務,執行如下命令:
python -m SimpleHTTPServer port
b. 其中,port需要與ELB添加該后端服務器時配置的端口一致,默認為80。啟動之后,通過客戶端訪問ELB的IP時,服務端的訪問日志如下:
192.168.1.10 - - [08/Sep/2022 15:21:21] "GET / HTTP/1.1" 200 –
Proxy Protocol模式
-
在TCP監聽器對應的后端主機組上打開如下開關。(只可創建時打開,不可修改)
-
在后端主機內開啟Proxy Protocol。修改/etc/nginx/nginx.conf文件內容如下(以nginx為例演示,用戶可按照后端主機真實應用情況決定如何獲取客戶端源IP)。
http { # 確認已設置$proxy_protocol_addr log_format main '$proxy_protocol_addr - $remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 以888監聽端口為例,增加proxy_protocol字段 server { listen 888 proxy_protocol; #... } } -
在后端主機的Nginx日志可以看到已獲取到客戶端源IP。