如何在从Node.js发出网络请求时指定网络接口?

时间:2012-11-28 09:42:42

标签: node.js http tcp network-interface

http.requestnet.connect中,是否有可以指定网络接口来启动连接的选项?

编辑:操作系统级别的AFAIK我可以指定地址级别,或者在路由表中加载平衡。但是在我的软件中选择界面的方式不止于此,我想知道我是否可以在代码中做到这一点。

3 个答案:

答案 0 :(得分:6)

Node内置了这个:

http://nodejs.org/api/net.html#net_net_connect_options_connectionlistener

http://nodejs.org/api/http.html#http_http_request_options_callback

请参阅localAddress,只需将其设置为您要使用的界面的IP。

答案 1 :(得分:4)

编辑:正如mak所指出的,确实可以从用户进程指定网络接口。我纠正了。但是,我还没有找到一个允许它与节点一起使用的模块。

默认情况下,网络接口由OS路由表决定。

您可以在Unix系统上使用netstat -r列出此表(包括OSX)。只需打开终端并输入命令即可。您将获得如下列表:

laurent ~ $ netstat -r
Routing tables

Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            192.168.1.1        UGSc          153        0     en0
127                localhost          UCS             0        0     lo0
localhost          localhost          UH              2       42     lo0
...

Netif字段为您提供用于路线的网络接口。您还可以使用route获取用于访问主机名的界面:

laurent ~ $ route get google.fr
   route to: par03s02-in-f23.1e100.net
destination: default
       mask: default
    gateway: 192.168.1.1
  interface: en0
      flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0         0         0         0         0      1500         0 

这更像是一个serverfault事件,但您可以使用route命令更改路由。例如,这会将流量路由到X.Y.Z. [0-254]到eth0上的X.Y.Z.254:

route add -net X.Y.Z.0/24 gw X.Y.Z.254 dev eth0

如果您希望路由持续重启,可以将其添加到/etc/network/interfaces。如果要在多个不同路线之间进行负载平衡,还应检查MPLS

答案 2 :(得分:2)

您可以使用node cURL wrapper

curl = require('node-curl')
curl('www.google.com', { INTERFACE: 'eth1', RAW: 1 }, function(err) {
    console.info(this);
});