【问题标题】:How do I open a websocket connection to cloud from location behind corporate proxy如何从公司代理后面的位置打开到云的 websocket 连接
【发布时间】:2016-07-26 01:04:22
【问题描述】:

我有一个在云中运行的 nodejs websocket 服务器,我可以从公司防火墙之外的任何位置建立安全的 web socket 连接。 现在,如何在从公司代理(本地)后面的资源创建 websocket 连接时提供代理信息?我正在使用来自https://github.com/websockets/ws 的这个 nodejs 模块。

执行以下代码时出现 EHOSTUNREACH 错误。请注意,云资源和本地资源之间没有 VPN 连接。

**var wss = new WebSocket('wss://cloudserver:443', {
        rejectUnauthorized: false
    });**

使用下面的示例代码,我可以使用代理信息从公司代理后面的资源建立与云的 http 连接,但无法弄清楚如何使其与 Web 套接字一起使用。

    **var Http = require('http');

    var req = Http.request({
        host: 'proxy',
        port: 8080,
        method: 'GET',
        path: 'http://cnn.com/' // full URL as path
    }, function (res) {
        res.on('data', function (data) {
            console.log(data.toString());
        });
    });

    req.end()

**

我还关注了http://blog.vanamco.com/proxy-requests-in-node-js/,它似乎有我需要的东西,但由于我是 nodejs 新手,所以我有点迷路了。

【问题讨论】:

  • 您是否使用真实的真实 URL 来代替 'wss://cloudserver:443' 和真实有效的域?
  • 是的。正如我所提到的,我可以从家里打开到它的安全 Web 套接字连接,但不能从工作中打开。实际的url当然不一样。

标签: javascript node.js proxy websocket


【解决方案1】:

EHOSTUNREACH 表示无法找到到 DNS 为目标服务器提供的 IP 地址的网络路由。

这可能是来自本地 DNS 服务器的 DNS 错误(错误的 IP 地址)或路由错误(错误或缺少到该 IP 地址的路由)或者可能故意没有路由到目标地址(专用网络或公司网络阻塞的东西)。

您可以通过查看您是否从工作和家庭获得该主机的相同 IP 地址来检查 DNS 方面。一个简单的ping hostname 将显示IP 地址。如果目标服务器支持 ping 请求,它还会告诉您主机是否可达。您还可以在家和工作中检查tracert hostname,看看哪里丢失了。

【讨论】:

  • 嗯,我分享的第二个代码段在工作中运行良好,这表明只要我使用代理,我就可以连接到任何外部资源。只是应该调整第一个代码段以使用代理信息。 Ping 到任何外部网址(包括工作中的相关网址)都不起作用。
  • @user702886 - 这听起来像是一个代理/防火墙,它阻止了除了直接 HTTP 请求之外的任何东西。这有点奇怪,因为 webSocket 连接以普通 HTTP 请求(设置了一些标头)的形式开始生命,您认为它会通过 corp 基础设施,除非它们通过查找这些标头并拒绝它们来专门阻止 webSocket 请求。一种可能性是使用 socket.io,如果 webSocket 连接不成功,它将自动回退到长 HTTP 轮询。
【解决方案2】:

我能够通过使用 websocket-node (https://github.com/theturtle32/WebSocket-Node/) 提供代理信息来连接到我的云实例 模块如下。出于安全原因,实际 url 被替换为“xxx”。感谢所有试图提供帮助的人。

var fs = require('fs');
var client = new WebSocketClient();
var tunnel = require('tunnel');
var net = require('net');

var tunnelingAgent = tunnel.httpsOverHttp({
  rejectUnauthorized: false,
  proxy: {
      host: 'xxxxxxxx',
      port: 8080,
  }
});



var requestOptions = {
    agent: tunnelingAgent,
    rejectUnauthorized: false,
    strictSSL: false,
    requestCert: false,
};

var headers = {

};


client.connect('wss://xxxxxx',null, 'xxxxxx', headers, requestOptions);

【讨论】:

    猜你喜欢
    • 2020-02-13
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2011-04-29
    • 1970-01-01
    • 2023-03-25
    • 2012-09-05
    相关资源
    最近更新 更多