user3356715
user3356715

Reputation: 191

Is there a way to set the source port for a node js https request?

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

Answers (3)

Suhas V
Suhas V

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

user3356715
user3356715

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

binarymax
binarymax

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

Related Questions