Reputation: 191
Is there a way to set the source port for a node js https request? I am not asking about the destination, rather the source, ie the port used to send the request.
The context is I am trying to send https requests from a specific port, rather than random ports, thus allowing for locking down iptables. Node is not running as root, thus the port is not 443.
Update : It appears there is a bug in Node. The options localAddress and localPort do not work, at least with a TLS socket.
Update : Found a similar question from last year. The answers were "don't do that", which seems dumb given that node is suppose to be a generic tool. Nodejs TCP connection client port assignment
Upvotes: 3
Views: 2994
Reputation: 11
You can use the localPort
option in http.Request options to configure a source port. Seems like it's available since v14.x LTS. I tested out with Node v18.12.0 and it works. :)
https://nodejs.org/docs/latest-v14.x/api/http.html#http_http_request_url_options_callback
options.localPort <number> Local port to connect from.
Upvotes: 0
Reputation: 191
Unfortunately it looks like Node does not support binding a client port. Apparently this isn't a feature that is used much, but it is possible. This link explains port binding fairly well. https://blog.cloudflare.com/cloudflare-now-supports-websockets/ Not sure how to get the nodejs people to consider this change.
Upvotes: 1
Reputation: 3405
The feature appears to be undocumented, but you can achieve this by setting BOTH the localAddress
and localPort
parameters for the options argument in https.request.
For more information, see the code here: https://github.com/nodejs/node/blob/b85a50b6da5bbd7e9c8902a13dfbe1a142fd786a/lib/net.js#L916
A basic example follows:
var https = require('https');
var options = {
hostname: 'example.com',
port: 8443,
localAddress : '192.168.0.1',
localPort: 8444
};
var req = https.request(options, function(res) {
console.log(res);
});
req.end();
Upvotes: 3