取得客戶端ip位置

取得訪問者的機器名稱,管制該機器能使用的功能

一般方式取得 client ip

碰到一個需求是要知道訪問者的機器,做後續相關的事情 (例如針對該電腦操作”列表機”之類的機器)

目前得知以下可以取得訪問者的 ip

1
2
3
4
5
6
request.connection.remoteAddress; // ::ffff:192.xxx.xxx.xxx (客戶端ip)
request.connection.remotePort; // port

//other
request.connection.localAddress; // ::ffff:192.xxx.xxx.xxx (本地端機器ip)
request.connection.localPort; // port

node.js 在啟動時,.listen(port)沒有特別設置的話默認會是 ipv6,取得的 ip 會長::ffff:192.xxx.xxx.xx
要達到想到的效果,要將.listen(port, '0.0.0.0'),就可以取到 ipv4,雖然取得 ipv6也是可以用表達是過濾掉 ::ffff:

1
request.connection.remoteAddress.replace(/^.*:/, ""); // ::ffff:192.xxx.xxx.xxx >>> 192.xxx.xxx.xxx

涉及代理情況下取得 client ip

server 假如是有代理(proxy)的話,就要用以下方式抓出 ip
這方式可能會取得多個 ip,因為 X-Forwarded-For: OriginatingClientIPAddress, proxy1-IPAddress, proxy2-IPAddress
最左邊是原始客戶端,並且每個通過請求的後續代理會將 ip 添加到接收請求的位置。
以上的例子通過了 proxy1 再來是 proxy2。proxy2 是請求的遠程位置。

1
2
3
4
// X-Forwarded-For - The IP address of the client before it went through the proxy
// X-Forwarded-Port - The port of the client before it went through the proxy
request.headers["x-forwarded-for"];
request.headers["X-Forwarded-Port"];

建議取得 client ip 的方式

Arnav Gupta 提出的取得方式

1
2
3
4
5
var ip =
(req.headers["x-forwarded-for"] || "").split(",").pop() ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;

相關文件 node.js API: net.module - server.listen

取得客戶端機器名稱

取得 ip 之後,就可以用 node 的 dns module 找出機器名稱。

1
2
3
require('dns').reverse(req.connection.remoteAddress, function(err, domains) {
console.log(domains);
});

相關文件 dns.reverse

參考

How to retrieve client and server IP address and port number in Node.js

Stripping “::ffff:” prefix from request.connection.remoteAddress nodejs

How to determine a user’s IP address in node

How to get client computer name in node js

[api] 如何在節點中確定用戶的 IP 地址

nodejs 獲取客户端 ip 地址

0%