Reputation: 596
I cannot find the client IP parameter on the client object.
Upvotes: 52
Views: 95199
Reputation: 9083
After a bit of messing around trying to figure out which one gives the client (web browser's) IP address, the answer is:
ws._socket.remoteAddress
Or if you have access to req
via wss.on('connection', (ws, req) => {})
:
req.socket.remoteAddress
You can use this, for example, to GeoIP locate where the user is connecting from.
Edit:
If you're running Node behind an Nginx reverse proxy (or any other reverse proxy for that matter), you may need to use:
req.headers['x-forwarded-for'] || req.socket.remoteAddress
A note on security: If your Node server is available directly as well as through the reverse proxy, you might like to check the remoteAddress
before trusting x-forwarded-for
. The remote address should be your reverse proxy's IP. There's the odd chance someone could call your service directly and spoof x-forwarded-for
.
Upvotes: 87
Reputation: 131
In websocket server, since req.connection
is deprecated, you use req.socket
.
wss.on('connection', (ws, req) => {
console.log(req.socket.remoteAddress);
});
Upvotes: 6
Reputation: 401
Got this from printing the keys in the socket object:
> ws._socket.address()
{ port: 8081,
family: 2,
address: '127.0.0.1' }
> ws._socket.remoteAddress
'74.125.224.194'
> ws._socket.remotePort
41435
I don't have any documentation so I'm not sure how well this is supported across versions :/
Upvotes: 30