【问题标题】:How to specify a network interface when making net requests from Node.js?从 Node.js 发出网络请求时如何指定网络接口?
【发布时间】:2012-11-16 03:02:24
【问题描述】:

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

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

【问题讨论】:

    标签: node.js http tcp network-interface


    【解决方案1】:

    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。

    【讨论】:

    • 在我问了这个问题之后,我发现这很可能是最好的方法。我可以通过 os.networkInterfaces() 对地址进行分组。
    【解决方案2】:

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

    默认情况下,网络接口由操作系统路由表确定。

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

    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 
    

    这更像是服务器故障,但您可以使用route 命令更改路由。例如,这会将流量路由到 eth0 上的 X.Y.Z.[0-254] 到 X.Y.Z.254:

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

    如果您希望路由保持重启,您可以将它们添加到/etc/network/interfaces。如果你想在几个不同的路由之间进行负载均衡,你还应该检查MPLS

    【讨论】:

    • 感谢您对如何获取信息的解释。那么如何指定路线呢?我将更新我的问题以提供更多信息,我要问的是一种可以用代码指定的方法。我知道这可能是一个简单的 NO。 :D
    • 确实可以手动指定路由。你的目标是什么操作系统?
    • 我的案例是 CentOS 和 OSX (Darwin),但可能会有更多,主要是类 unix。
    【解决方案3】:

    您可以使用node cURL wrapper

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

    【讨论】:

    • 感谢您的回答,curl 是一个很好的开始方式。但是将我所有的代码移植到 node-curl 中看起来并不是一个选择。我真的很想保留原来的 net.connect 和 http.request 的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多