Django IPware
A Django application to retrieve client's IP address
Alternative package
If you prefer a python only version that does not integrate with Django directly, but allows for more flexibility and advanced features, you can use the python-ipware package instead. django-ipware
is a wrapper using python-ipware under the hood staring from version 6.0.0
.
Overview
Best attempt to get client's IP address while keeping it DRY.
Notice
There is no perfect out-of-the-box
solution against fake IP addresses, aka IP Address Spoofing
.
You are encouraged to read the (Advanced users) section of this page and
use trusted_proxies_ips
and/or proxy_count
features to match your needs, especially if
you are
planning to include ipware
in any authentication, security or anti-fraud
related architecture.
This is an open source project, with the source code visible to all. Therefore, it may be exploited through unimplemented, or improperly implemented features.
Please use ipware ONLY
as a complement to your firewall
security measures!
How to install
1. easy_install django-ipware
2. pip install django-ipware
3. git clone http://github.com/un33k/django-ipware
a. cd django-ipware
b. run python setup.py install
4. wget https://github.com/un33k/django-ipware/zipball/master
a. unzip the downloaded file
b. cd into django-ipware-* directory
c. run python setup.py install
How to use
from ipware import get_client_ip
client_ip, is_routable = get_client_ip(request)
if client_ip is None:
else:
if is_routable:
else:
Advanced users:
-
Precedence Order
The default meta precedence order is top to bottom. You may customize the order
by providing your own IPWARE_META_PRECEDENCE_ORDER
by adding it to your project's settings.py
IPWARE_META_PRECEDENCE_ORDER = (
"X_FORWARDED_FOR",
"HTTP_X_FORWARDED_FOR",
"HTTP_CLIENT_IP",
"HTTP_X_REAL_IP",
"HTTP_X_FORWARDED",
"HTTP_X_CLUSTER_CLIENT_IP",
"HTTP_FORWARDED_FOR",
"HTTP_FORWARDED",
"HTTP_CF_CONNECTING_IP",
"X-CLIENT-IP",
"X-REAL-IP",
"X-CLUSTER-CLIENT-IP",
"X_FORWARDED",
"FORWARDED_FOR",
"CF-CONNECTING-IP",
"TRUE-CLIENT-IP",
"FASTLY-CLIENT-IP",
"FORWARDED",
"CLIENT-IP",
"REMOTE_ADDR",
)
Alternatively, you can provide your custom request header meta precedence order when calling get_client_ip()
.
get_client_ip(request, request_header_order=['X_FORWARDED_FOR'])
get_client_ip(request, request_header_order=['X_FORWARDED_FOR', 'HTTP_X_FORWARDED_FOR'])
Trusted Proxies
If your Django server is behind one or more known proxy server(s), you can filter out unwanted requests
by providing the trusted
proxy list when calling get_client_ip(request, proxy_trusted_ips=['177.139.233.133'])
.
In the following example, your load balancer (LB) can be seen as a trusted
proxy.
`Real` Client <public> <---> <public> LB (Server) <private> <--------> <private> Django Server
^
|
`Fake` Client <private> <---> <private> LB (Server) <private> ---^
client_ip, is_routable = get_client_ip(request, proxy_trusted_ips=['177.139.233.133'])
client_ip, is_routable = get_client_ip(request, proxy_trusted_ips=['177.139.233.133', '177.139.233.134'])
client_ip, is_routable = get_client_ip(request, proxy_trusted_ips=['177.139.', '177.140'])
client_ip, is_routable = get_client_ip(request, proxy_trusted_ips=['177.139.233.', '177.139.240'])
Please note:
By default, the right-most
proxy in the chain is the trusted
proxy and that is the one your django
server talks to. Therefore, ipware
checks to see if the right-most
proxy address starts with any ip pattern that was
passed in via the proxy_trusted_ips
list.
Proxy Count
If your Django server is behind a known
number of proxy server(s), you can filter out unwanted requests
by providing the number
of proxies when calling get_client_ip(request, proxy_count=1)
.
In the following example, your load balancer (LB) can be seen as the only
proxy.
`Real` Client <public> <---> <public> LB (Server) <private> <--------> <private> Django Server
^
|
`Fake` Client <private> ---^
client_ip, is_routable = get_client_ip(request, proxy_count=1)
client_ip, is_routable = get_client_ip(request, proxy_count=1, proxy_trusted_ips=['177.139.233.133'])
Originating Request
If your proxy server is configured such that the right-most IP address is that of the originating client, you
can indicate right-most
as your proxy_order
when calling get_client_ip(request, proxy_order="right-most")
.
Please note that the de-facto standard
for the originating client IP address is the left-most
as per <client>, <proxy1>, <proxy2>
.
Running the tests
To run the tests against the current environment:
python manage.py test
License
Released under a (MIT) license.
Version
X.Y.Z Version
`MAJOR` version -- when you make incompatible API changes,
`MINOR` version -- when you add functionality in a backwards-compatible manner, and
`PATCH` version -- when you make backwards-compatible bug fixes.
Neekware Inc.