功能介紹
使用邊緣接入服務-IP應用加速后,源站獲取到的客戶端IP會變為應用加速回源節點的IP。如果源站需要獲取真實的客戶端IP地址,有兩種方式:
- proxy_protocol(簡稱PP),對內核無要求,需要源站進行修改,解析對應的文本字符串以獲取真實的客戶端IP。目前,Nginx和HAProxy已經支持,因此Nginx和HAProxy源站推薦使用該方式獲取客戶端IP。proxy_protocol的v1版本僅支持TCP協議,v2版本同時支持TCP和UDP協議。
- tcp_option傳遞用戶IP回源的方式,該方式僅適用于TCP協議。選擇該方式時,Linux系統需要安裝我們提供的toa內核模塊來獲取真實客戶端地址,該方式無需源站進行修改即可獲取到真實的客戶端IP。
配置說明
新增域名,配置傳遞用戶IP回源步驟:
- 登錄,選擇【邊緣接入】控制臺。
- 進入【域名】-【IP應用加速接入】頁面。
- 點擊左上角【新增接入】。
- 找到傳遞用戶IP回源模塊,打開開關。
- 選擇傳遞用戶IP回源方式,選擇proxy_protocol方式時,還需要選擇協議版本號;選擇tcp_option時,您需要下載適配源站系統版本的toa模塊,并安裝到源站后才可正常使用該功能。
編輯域名,配置傳遞用戶IP回源步驟:
- 登錄,選擇【邊緣接入】控制臺。
- 進入【域名】-【IP應用加速接入】頁面。
- 在首頁列表頁面,點擊詳情,點擊右下角編輯配置,編輯目標域名/實例。
- 找到傳遞用戶IP回源模塊,打開或者關閉開關;打開時需選擇傳遞用戶IP回源方式,選擇proxy_protocol方式時,還需要選擇協議版本號;選擇tcp_option時,您需要下載適配源站系統版本的toa模塊,并安裝到源站后才可正常使用該功能。
使用proxy_protocol方式須知
選擇proxy_protocol方式時,還需要選擇協議版本號,v1版本僅支持TCP協議,v2版本同時支持TCP和UDP協議。
Nginx
PP方式獲取客戶端IP,以Nginx為例,只需把參數proxy_protocol加到server塊的listen指令中,示例如下:
http {
#...
server {
listen 80 proxy_protocol;
listen 443 ssl proxy_protocol;
#...
}
}
Apache
Apache服務支持proxy_protocol協議必須要求httpd版本大于等于httpd 2.4.31。
- 確保httpd服務正常安裝且版本大于等于httpd 2.4.31,可用:/usr/local/httpd/bin/apachectl -v 名稱查看版本號。
- 打開Apache的主配置文件httpd.conf。
/usr/local/httpd/conf/httpd.conf
- 在配置文件中啟用mod_remoteip模塊。
LoadModule remoteip_module modules/mod_remoteip.so
- 在httpd.conf配置文件里的VirtualHost下添加“RemoteIPProxyProtocol On”開啟proxy_protocol協議支持。
<VirtualHost *:80>
RemoteIPProxyProtocol On
</VirtualHost>
- 重啟Apache服務,完成開啟Apache proxy_protocal協議配置。
HAProxy
HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,基于TCP和HTTP提供高可用性、負載均衡,其不能像Apache服務一樣配置一個http服務源站,只能作為負載均衡器作為代理轉發作用,故其后端需要對應至少一個應用服務源站。此示例中使用Apache來模擬一個http源站。請求鏈路為:客戶請求--->IP應用加速網關--->HAProxy負載均衡--->Apache http源站服務,HAProxy有如下兩種配置方式以實現傳遞用戶真實IP回源。
HAProxy組件完全作為轉發器,內容透傳到后端(此種場景支持TCP和HTTP兩種客戶請求協議)
- HAProxy配置
frontend部分,監聽端口開啟proxy_protocol,詳見:bind *:8080 accept-proxy
frontend test-proxy
bind *:8080 accept-proxy
mode http
log global
option httplog
option dontlognull
maxconn 8000
timeout client 30s
# layer7: prevent private network relaying
acl forbidden_dst url_ip 192.168.0.0/24
acl forbidden_dst url_ip 172.16.0.0/12
acl forbidden_dst url_ip 10.0.0.0/8
http-request deny if forbidden_dst
default_backend test-proxy-srv
backend部分,發送后端開啟pp協議,詳見:server next-hop 172.21.51.56:80 send-proxy
backend test-proxy-srv
mode http
timeout connect 5s
timeout server 5s
retries 2
# layer7: Only GET method is valid
acl valid_method method GET
http-request deny if !valid_method
# take IP address from URL's authority
# and drop scheme+authority from URI
http-request set-dst url_ip
http-request set-dst-port url_port
http-request set-uri %[pathq]
server next-hop 172.21.51.56:80 send-proxy
- 重啟HAProxy,完成開啟HAProxy proxy_protocal協議配置。
HAProxy組件作為PP協議卸載作用,發送后端不添加PP協議,而是把用戶真實IP放到x-forwarded-for協議頭傳遞到后端應用服務源站(此種場景只支持HTTP客戶請求協議)
- HAProxy配置
frontend部分:
- 監聽端口開啟proxy_protocol,詳見:bind *:8080 accept-proxy
- 用戶真實IP從pp里讀取后放在x-forwarded-for頭進行傳遞,詳見:option forwardfor
frontend test-proxy
bind *:8080 accept-proxy
mode http
log global
option httplog
option dontlognull
maxconn 8000
timeout client 30s
# layer7: prevent private network relaying
acl forbidden_dst url_ip 192.168.0.0/24
acl forbidden_dst url_ip 172.16.0.0/12
acl forbidden_dst url_ip 10.0.0.0/8
http-request deny if forbidden_dst
default_backend test-proxy-srv
option forwardfor
backend部分,發送后端不開啟pp協議,詳見:server next-hop 172.21.51.56:80
backend test-proxy-srv
mode http
timeout connect 5s
timeout server 5s
retries 2
# layer7: Only GET method is valid
acl valid_method method GET
http-request deny if !valid_method
# take IP address from URL's authority
# and drop scheme+authority from URI
http-request set-dst url_ip
http-request set-dst-port url_port
http-request set-uri %[pathq]
server next-hop 172.21.51.56:80
- 重啟HAProxy,完成開啟HAProxy proxy_protocal協議配置。
使用tcp_option方式須知
選擇tcp_option時,您需要下載適配源站系統版本的toa模塊,并安裝到源站后才可正常使用該功能。不同系統的toa模塊下載地址如下:
| 支持的linux版本 | RPM壓縮包下載 |
|---|---|
| CentOS 6.5 | tcp_toa-1.0-1.CentOS.6.5.x86_64.rar |
| CentOS 6.9 | tcp_toa-1.0-1.CentOS.6.9.x86_64.rar |
| CentOS 7.0 | tcp_toa-1.0-1.CentOS.7.0.x86_64.rar |
| CentOS 7.1 | tcp_toa-1.0-1.CentOS.7.1.x86_64.rar |
| CentOS 7.2 | tcp_toa-1.0-1.CentOS.7.2.x86_64.rar |
| CentOS 7.3 | tcp_toa-1.0-1.CentOS.7.3.x86_64.rar |
| CentOS 7.4 | tcp_toa-1.0-1.CentOS.7.4.x86_64.rar |
| CentOS 7.5 | tcp_toa-1.0-1.CentOS.7.5.x86_64.rar |
| CentOS 7.6 | tcp_toa-1.0-1.CentOS.7.6.x86_64.rar |
| CentOS 7.7 | tcp_toa-1.0-1.CentOS.7.7.x86_64.rar |
| CentOS 7.8 | tcp_toa-1.0-1.CentOS.7.8.x86_64.rar |
安裝
[root@test ~]# rpm -ivh tcp_toa-1.0-1.CentOS.7.8.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:tcp_toa-1.0-1.CentOS.7.8 ################################# [100%]
運行
[root@test ~]# service tcp_toa start
[starting tcp_toa]:
installing tcp_toa... [OK]
查看toa模塊狀態
[root@test ~]# lsmod |grep tcp_toa
tcp_toa 12884 0
停止toa模塊
[root@test ~]# service tcp_toa stop
[stopping tcp_toa]:
uninstalling tcp_toa... [OK]
卸載rpm包
[root@test ~]# rpm -e tcp_toa
[stopping tcp_toa]:
tcp_toa is not running! [OK]