限制IP訪問
阿新 • • 發佈:2019-01-22
本文以python為基礎
問題描述
後臺伺服器如何限制某些特定ip的訪問?
問題分析
如果對ip進行限制,那麼第一步就必須得到使用者的ip,才能進行限制,第二部才是限制
問題解決
得到使用者ip
首先,python提供了獲取ip的程式碼語句
ip = request.remote_addr
但是通過這行程式碼,我們卻得到的不是使用者的真是ip,那麼是為什麼呢?不急,我們下來進行分析。
一般來說,應用程式都部署在nginx或者其他代理伺服器上,獲取更多層,利用nginx對使用者的請求進行分發,而request.remote_addr得到的是上一個節點的ip,因此在後臺程式中,我們也得到了nginx伺服器的ip,因此並不是客戶端的真實ip。
那麼如何得到使用者的真實ip呢?
python程式碼如下:
def get_client_ip(request):
try:
real_ip = request.META['HTTP_X_FORWARDED_FOR']
client_ip = real_ip.split(",")[0]
except:
try:
client_ip = request.META['REMOTE_ADDR']
except:
client_ip = ""
return client_ip
註解:程式碼中的HTTP_X_FORWARDED_FOR記錄了客戶ip到達後臺的全部ip過程,每經過一個伺服器節點,伺服器的ip都會加到這個頭的後面,這個ip的獲取是基於TCP,以‘,’隔開,因此當達到應用時,如果將這些ip調出來,頭部的那個ip即是客戶端的真實ip。
當然,這個HTTP_X_FORWARDED_FOR並不是呼叫就可以的,還必須在nginx上進行配置,否則得到的就是空
以下依照uwsgi的nginx為例
server {
listen 80;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000;
uwsgi_param UWSGI_CHDIR ***;
uwsgi_param UWSGI_SCRIPT run:app;
#以下必加
uwsgi_param HTTP_X_FORWARDED_FOR $proxy_add_x_forwarded_for;
uwsgi_param X-Real-IP $remote_addr;
}
}
限制ip
其實在獲取realip後,限制就較簡單了
- 最實用的方法,直接防火牆限制ip
- ip檢測,不符合條件的ip就無權訪問
- 最不好的方法,是將限制ip放在資料庫中,這樣每次來都需要sql,記憶體、資源都消