Nginx 很常拿來做 Proxy / Reverse Proxy,設定方便又簡單
通常 Reverse Proxy 會放在非交戰區(DMZ) 來做為 Public 跟 Private 之間的連線,避免 attack 直接接觸到資料主機,也能降低資料主機的 Loading
範例架構
試想將 Web Server 放置內網,所有使用者都必須由 Reverse Proxy 代為交涉
為了瞭解概念,用 Nginx官網 來當作 Web Server
而我們必須要從 Reverse Proxy 來反向代理到 Nginx官網
環境
CentOS 6.6
Reverse Proxy: 172.16.10.10
目標 Web : http://nginx.com
安裝 Nginx Reverse Proxy
step1. 先把 Nginx 安裝起來
要從EPEL才能找到 Nginx
$ yum install nginx
step2. nginx.conf 常態性調整
$ vim /etc/nginx/nginx.conf user nginx; worker_processes 2; worker_cpu_affinity 01 10; events { use epoll; worker_connections 1024; }
step3. 設定 Reverse Proxy
$ vim /etc/nginx/conf.d/default.conf server{ listen 80; #Proxy的位置,提供給使用者連線 server_name 172.16.10.10; location / { root /usr/share/nginx/html; index index.html index.htm; #後端的Web伺服器,以Nginx官網為例 proxy_pass http://nginx.com; #定義header記錄使用者IP proxy_set_header X-Real-IP $remote_addr; #讓後端的Web伺服器可以取得使用者真實IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #把 Protocol header 也往後送 proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; proxy_max_temp_file_size 0; } }
其實設定檔很簡單,其常常忘記的就是忘記加上 $proxy_add_x_forwarded_for
若是沒有加上這個,在後端的 Web Server 取得的 access IP 都會是 Proxy Server 的 IP,而不是真實IP。
在後端如果也是使用 Nginx 的話,必須在 nginx.conf 加上一些設定
若是前端的 IP header 為 X-Forwarded-For
那就要設定為
$ vim /etc/nginx/nginx.conf set_real_ip_from 125.119.141.65; real_ip_header X-Forwarded-For;
set_real_ip_from 就是前端的 Proxy IP
read_ip_header 是前端記錄真實 IP 的 header,必須相符合
shazi7804,您好!
目前手上有安裝一個NGINX反向代理伺服器當作軟體load baliance,架構為一台NGINX,後面搭配三台IIS,最近遇到一些情況,用戶使用SSL VPN方式連入網站,由於使用單位大多為學校單位,因此會以各個學校的IP為認證基礎,最近發現以SSL VPN方式連入網站,所取得的request端IP竟然都是終端IP,而非學校的SSL VPN服務器IP,因此無法稽核使用情形,想請教您,有辦法解決此情況嗎?謝謝
Hi 簡文森
看起來應該 SSL VPN 有替使用者 rewrite IP 出去,你可以試試看去印從 SSL VPN 過來使用者的 REMOTE_ADDR, HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR … 等等這些表頭,看看是不是有藏在這些 header 裡面。
用一支 index.php 給你參考,使用者訪問會印出這些 header。
另外, 任何從使用者提供的資料都是不可被信任的,用於稽核其實不太恰當哦。僅供參考
版主,您好!
謝謝您的回覆,我會試試看的!
您說的沒錯,客戶端IP可以假造,其實不應拿來識別稽核,因為使用情境比較特別,而且我所提供的網站服務為買方市場,因此也只能配合,謝謝您的建議!