@fullerstack/nax-ipware
A Node application to retrieve user's IP address
Best attempt to get user's (client's) real ip-address while keeping it DRY.
1. npm install ipware
2. git clone http://github.com/un33k/node-ipware
a. npm install node-ipware
3. wget https://github.com/un33k/node-ipware/zipball/master
a. unzip the downloaded file
b. npm install node-ipware
// In your js file (e.g. app.js)
var get_ip = require('ipware')().get_ip;
app.use(function(req, res, next) {
var ip_info = get_ip(req);
console.log(ip_info);
// { clientIp: '127.0.0.1', clientIpRoutable: false }
next();
});
// `get_ip` also adds two fields to your request object
// 1. `clientIp`, 2. `clientIpRoutable`
// Where:
// `clientIp` holds the client's IP address
// 'clientIpRoutable` is `true` if user's IP is `public`. (externally route-able)
// is `false` if user's IP is `private`. (not externally route-able)
// Advanced option: By default the left most address in the `HTTP_X_FORWARDED_FOR` or `X_FORWARDED_FOR`
// is returned. However, depending on your preference and needs, you can change this
// behavior by passing the `right_most_proxy=True` to the API.
// Note: Not all proxies are equal. So left to right or right to left preference is not a
// rule that all proxy servers follow.
var ip_info = get_ip(req, right_most_proxy=True)
// 1. Trusted Proxies:
// *************************
// To only get client ip addresses from your own trusted proxy server(s), use `get_trusted_ip()`.
// In your js file (e.g. app.js)
var get_trusted_ip = require('ipware')().get_trusted_ip;
var trusted_proxies = ['177.144.11.100', '177.144.11.101'];
app.use(function(req, res, next) {
var ip_info = get_trusted_ip(req, trusted_proxies);
console.log(ip_info);
// { clientIp: '177.100.44.22', clientIpRoutable: true }
next();
});
// Alternatively, you can pass in the trusted proxies via the configuration file.
{
...
"IPWARE_TRUSTED_PROXY_LIST": [
'177.144.11.100',
'177.144.11.101'
],
...
}
// 2. Customizable configuration file:
// ***********************************
// You can also use your own config file as below.
// for `IPWARE_HTTP_HEADER_PRECEDENCE_ORDER` items, the
// check is done from top to bottom where the request `headers`
// is examined for the existence of the IP address field.
// All lists that start with `IPV` are examined and if an IP
// address starts with any of those patterns the IP is considered
// `private`, otherwise the IP is considered `public` which means
// the IP is externally routable. (reachable through the Internet :)
// Simply copy the following content into a JSON file and
// modify it to suit your needs and place it in your project
// under version control.
// Then you can use it like:
// var get_ip = require('ipware')('../path/to/your/conf.json').get_ip;
{
"IPWARE_HTTP_HEADER_PRECEDENCE_ORDER": [
"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_VIA",
"X_FORWARDED_FOR",
"REMOTE_ADDR"
],
"IPWARE_HTTP_HEADER_PROXY_PRECEDENCE_ORDER": [
"HTTP_X_FORWARDED_FOR",
"X_FORWARDED_FOR"
],
"IPWARE_TRUSTED_PROXY_LIST": [
],
"IPV4_EXTERNALLY_NON_ROUTABLE_IP_PREFIX": [
"0."
],
"IPV4_CLASS_A_PRIVATE_BLOCK_IP_PREFIX": [
"10."
],
"IPV4_CARRIER_GRADE_NAT_IP_PREFIX": [
"100.64.",
"100.65.",
"100.66.",
"100.67.",
"100.68.",
"100.69.",
"100.70.",
"100.71.",
"100.72.",
"100.73.",
"100.74.",
"100.75.",
"100.76.",
"100.77.",
"100.78.",
"100.79.",
"100.80.",
"100.81.",
"100.82.",
"100.83.",
"100.84.",
"100.85.",
"100.86.",
"100.87.",
"100.88.",
"100.89.",
"100.90.",
"100.91.",
"100.92.",
"100.93.",
"100.94.",
"100.95.",
"100.96.",
"100.97.",
"100.98.",
"100.99.",
"100.100.",
"100.101.",
"100.102.",
"100.103.",
"100.104.",
"100.105.",
"100.106.",
"100.107.",
"100.108.",
"100.109.",
"100.110.",
"100.111.",
"100.112.",
"100.113.",
"100.114.",
"100.115.",
"100.116.",
"100.117.",
"100.118.",
"100.119.",
"100.120.",
"100.121.",
"100.122.",
"100.123.",
"100.124.",
"100.125.",
"100.126.",
"100.127."
],
"IPV4_LOCAL_LINK_BLOCK_IP_PREFIX": [
"169.254."
],
"IPV4_CLASS_B_PRIVATE_BLOCK_IP_PREFIX": [
"172.16.",
"172.17.",
"172.18.",
"172.19.",
"172.20.",
"172.21.",
"172.22.",
"172.23.",
"172.24.",
"172.25.",
"172.26.",
"172.27.",
"172.28.",
"172.29.",
"172.30.",
"172.31."
],
"IPV4_INAA_SPECIAL_ADDRESS_REGISTRY_IP_PREFIX": [
"192.0.0."
],
"IPV4_DOCUMENTATION_AND_EXAMPLE_CODE_192_IP_PREFIX": [
"192.0.2."
],
"IPV4_CLASS_C_PRIVATE_BLOCK_IP_PREFIX": [
"192.168."
],
"IPV4_INNER_NETWORK_COMMUNICATION_BETWEEN_TWO_SEPARATE_SUBNETS_IP_PREFIX": [
"198.18.",
"198.19."
],
"IPV4_DOCUMENTATION_AND_EXAMPLE_CODE_198_IP_PREFIX": [
"198.51.100."
],
"IPV4_DOCUMENTATION_AND_EXAMPLE_CODE_203_IP_PREFIX": [
"203.0.113."
],
"IPV4_MULTICAST_IP_PREFIX": [
"224.",
"225.",
"226.",
"227.",
"228.",
"229.",
"230.",
"231.",
"232.",
"233.",
"234.",
"235.",
"236.",
"237.",
"238.",
"239."
],
"IPV4_RESERVED_IP_PREFIX": [
"240.",
"241.",
"242.",
"243.",
"244.",
"245.",
"246.",
"247.",
"248.",
"249.",
"250.",
"251.",
"252.",
"253.",
"254."
],
"IPV4_BRODCAST_IP_PREFIX": [
"255."
],
"IPV4_LOOPBACK_IP_PREFIX": [
"127."
],
"IPV6_EXAMPLE_CODE_DOCUMENTATION_IP_PREFIX": [
"2001:db8:"
],
"IPV6_PRIVATE_BLOCK_IP_PREFIX": [
"fc00:"
],
"IPV6_LINK_LOCAL_UNICAST_IP_PREFIX": [
"fe80:"
],
"IPV6_MULTICAST_IP_PREFIX": [
"ff00:"
],
"IPV6_LOOPBACK_IP_PREFIX": [
"::1"
]
}
To run the tests against the current environment:
npm install
npm test
Released under a (MIT) license.
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.