自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

應(yīng)用獲取客戶端真實(shí)IP

開發(fā) 前端
Remote_Addr代表客戶端IP,但是它的值不是由客戶端提供的,而是服務(wù)端根據(jù)客戶端IP指定的。當(dāng)你訪問某個(gè)應(yīng)用時(shí),當(dāng)中間沒有經(jīng)過任何代理,那么應(yīng)用獲取到的Remote_Addr就是你的主機(jī)IP。

背景信息

因?yàn)楫a(chǎn)品需要,要在應(yīng)用端獲取到真實(shí)的客戶端IP,訪問鏈路如下:

由于應(yīng)用前面經(jīng)過了多次代理,所以默認(rèn)情況下是獲取不到真實(shí)IP的。

基本概念

在實(shí)現(xiàn)之前,先簡單了解一下常用來獲取IP的幾個(gè)header。

  • remote_addr
  • X-Forwarded-For
  • X-Real-IP

1、remote_addr

remote_addr代表客戶端IP,但是它的值不是由客戶端提供的,而是服務(wù)端根據(jù)客戶端IP指定的。當(dāng)你訪問某個(gè)應(yīng)用時(shí),當(dāng)中間沒有經(jīng)過任何代理,那么應(yīng)用獲取到的remote_addr就是你的主機(jī)IP。如果中間經(jīng)過了代理轉(zhuǎn)發(fā),正常情況下,應(yīng)用獲取到的remote_addr就是代理的IP,除非在代理服務(wù)器上手動(dòng)將remote_addr的地址設(shè)置成你的主機(jī)IP。

2、X-Forwarded-For

X-Forwarded-For是HTTP擴(kuò)展頭,簡稱XFF。

XFF 的內(nèi)容由「英文逗號(hào) + 空格」隔開的多個(gè)部分組成,最開始的是離服務(wù)端最遠(yuǎn)的設(shè)備 IP,然后是每一級(jí)代理設(shè)備的 IP,其格式為:X-Forwarded-For: client,proxy1,proxy2。

!! PS: X-Forwarded-For的格式可以被偽造。

如果一個(gè)應(yīng)用的前面有三個(gè)代理,分別是 Proxy1、Proxy2、Proxy3,它們的IP地址分別是IP1、IP2、IP3,用戶的真實(shí)IP為IP0,那么按照XFF標(biāo)準(zhǔn),應(yīng)用收到的XFF信息應(yīng)該如下:X-Forwarded-For: IP0,IP1,IP2。這里沒有IP3,是因?yàn)镻roxy3是轉(zhuǎn)發(fā)Proxy2的代理,在轉(zhuǎn)發(fā)過程中會(huì)將Proxy2的IP地址追加到XFF中,而自己的IP地址會(huì)被放入remote_addr中。

!! PS:通過一個(gè)代理才會(huì)把上一個(gè)節(jié)點(diǎn)的IP加到XFF中。

3、X-Real-IP

X-Real-IP是一個(gè)自定義的頭部字段,通常被HTTP代理用來表示與它產(chǎn)生TCP連接的設(shè)備IP,和XFF不一樣的是,它不是列表,無法將記錄追加到X-Real-IP的結(jié)尾,而是直接替換。

理想情況下,我們需要達(dá)到以下效果:

也就是應(yīng)用獲取到的X-Real-IP就是客戶端的真實(shí)IP,這就要求除了第一層代理之外,后面的代理不需要再去設(shè)置X-Real-IP,只需要做轉(zhuǎn)發(fā)即可,這樣應(yīng)用就能拿到真實(shí)的客戶端訪問IP了。

具體實(shí)現(xiàn)

由于現(xiàn)實(shí)情況,我們在Haproxy上會(huì)做很多的規(guī)則配置,所以第一層SLB上是單純的TCP代理,因此在SLB上不需要做太多額外配置,客戶端IP會(huì)直接透傳過去。

當(dāng)請(qǐng)求到達(dá)Haproxy之后,需要將客戶端IP加到XFF中,并且設(shè)置X-Real-IP為客戶端IP,具體配置如下:

defaults
                mode                    http
                log                     global
                option                  httplog
                option                  dontlognull
                option http-server-close
                log 127.0.0.1 local3
                option forwardfor       except 127.0.0.0/8
                option                  redispatch
                retries                 3
                timeout http-request    10s
                timeout queue           1m
                timeout connect         10s
                timeout client          5m
                timeout server          5m
                timeout http-keep-alive 10s
                timeout check           10s
                unique-id-format %{+X}o\ %ci%cp%fi%fp%Ts%rt%pid

frontend https_link_ha
        bind *:443 ssl crt /usr/local/etc/haproxy/cert/crt/ ca-file /usr/local/etc/haproxy/cert/ca/ca.pem verify optional
        #log 127.0.0.1 local3
        mode http
        log-format "%ID %ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r"
        option accept-invalid-http-request

        http-request set-header x-request-id %[unique-id]
        http-request set-header x-request-time %[date()]
        http-request set-header X-Real-IP %[src]

        default_backend pre

backend pre 
    server 1 10.74.136.13:8080 check inter 1500 rise 3 fall 3 weight 3

其中主要是兩個(gè)配置:

  • option forwardfor       except 127.0.0.0/8在由Haproxy發(fā)往后端的請(qǐng)求中加上XFF首部,其值是前個(gè)客戶端的IP。
  • http-request set-header X-Real-IP %[src]在X-Real-IP中設(shè)置客戶端IP。

現(xiàn)在請(qǐng)求就到達(dá)Ingress了。

Ingress也是一層代理,前面的客戶端IP已經(jīng)放到XFF中,但是默認(rèn)情況下,Ingress沒有開啟XFF。

在Ingress上要使用XFF,需要使用到以下三個(gè)參數(shù):

  • use-forwarded-headers:是否開啟XFF頭傳遞,默認(rèn)是false。
  • forwarded-for-header:XFF的真實(shí)header名,默認(rèn)是X-Forwarded-For。
  • compute-full-forwarded-for:列出客戶端訪問所經(jīng)過的代理IP,默認(rèn)情況下,XFF是從remote_addr中獲取的值。

所以,我們只需要在Nginx Ingress的ConfigMap里增加以下兩個(gè)配置即可:

use-forwarded-headers: 'true'
compute-full-forwarded-for: 'true'

配置完成后,Nginx Ingress會(huì)自動(dòng)重載服務(wù),不需要單獨(dú)重啟。

然后在應(yīng)用的日志里就能獲取到客戶端的真實(shí)IP了。

當(dāng)然,并不是所有的場景都能通過XFF獲取到用戶的真實(shí)IP,比如當(dāng)SLB前面還有CDN的情況下,獲取的可能就是CDN的來源IP了。

責(zé)任編輯:姜華 來源: 運(yùn)維開發(fā)故事
相關(guān)推薦

2019-10-29 05:34:34

IPJava服務(wù)器

2018-12-19 10:31:32

客戶端IP服務(wù)器

2010-02-22 11:10:17

WCF獲取客戶端IP

2011-11-30 15:43:40

JavaJSP

2009-12-21 15:53:56

WCF獲取客戶端IP

2010-12-21 11:03:15

獲取客戶端證書

2010-02-24 16:17:09

WCF獲取客戶端IP

2009-12-08 16:47:06

WCF IP

2010-08-31 16:29:40

DHCP客戶端

2009-12-03 10:09:47

PHP獲取客戶端IP

2024-05-06 08:00:00

C#IP地址

2011-08-25 13:42:57

IP隧道IPIPGRE

2011-08-17 10:10:59

2021-09-22 15:46:29

虛擬桌面瘦客戶端胖客戶端

2011-05-13 15:59:28

LBS團(tuán)購移動(dòng)支付

2009-05-22 18:42:12

虛擬化服務(wù)器IT

2011-09-14 14:35:12

TweetFireiPhoneTwittiphone應(yīng)用

2020-12-04 19:18:03

LinuxMySQLDBeaver

2010-05-31 10:11:32

瘦客戶端

2011-10-26 13:17:05

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)