【问题标题】:Node JS TCP Proxy: Set up HTTP Tunnel using Node JSNode JS TCP 代理:使用 Node JS 设置 HTTP 隧道
【发布时间】:2015-07-21 13:21:00
【问题描述】:

我正在尝试在 Node JS 中实现 TCP 代理。我只对 Javascript 有一些经验,所以在此过程中遇到了很多问题。我已经做了很多搜索,但没有运气。

我想为 HTTPS 代理实现两跳 TCP 连接。这是我的部分代码。

var net = require('net');

var server = net.createServer(function(clientSock) {

    var connected = false;    

    var serverSock;

    clientSock.on('data', function(clientData) {

        if (connected) {

            // Send future messages if is connected
            serverSocet.write(clientData);

        } else {

            var host = // get from data
            var port = // get from data

            if (clientData is a CONNECT request) {

                // Create a new socket to server
                if (!serverSock) {
                    serverSock = new net.Socket();

                    serverSock.connect(port, host, function() {

                        // Send the CONNECT request (Client Hello)
                        serverSock.write(clientData);

                        connected = true;

                        clientSock.write('HTTP/1.1 200 OK\r\n');
                   });

                   serverSock.on('data', function(serverData) {
                        clientSock.write(serverData);
                   });
               }
          }
     });
 });

如果我访问https://www.google.com,我使用 Wireshark 捕获发送的数据包。如果我不使用代理,“Client Hello”消息将在 TLS v1.2 中发送。但是如果我使用我的代理,它是由 SSL 发送的。服务器总是拒绝我的 CONNECT 请求并返回一个重置请求。

我还尝试了 Node JS 中的 TLS API。服务器接受了我的 CONNECT 请求,但总是要求我在密钥交换之后开始一个新会话。浏览器将关闭套接字并创建一个新套接字。但它从未加载过页面...

我花了一整天的时间来解决这个问题。我相信我可以使用 TCP socket 来实现 HTTP Tunnel。请帮忙...非常感谢!

【问题讨论】:

    标签: node.js networking tcp proxy http-tunneling


    【解决方案1】:

    问题解决了!

    要使 TCP 套接字在处理 HTTPS 时使用 TLS v1.2,只需将这个选项 {allowHalfOpen: true} 作为创建套接字时的参数。

    新代码如下所示:

    var net = require('net');
    
                                   // option here
    var server = net.createServer({allowHalfOpen: true}, function(clientSock) {
    
    var connected = false;    
    
    var serverSock;
    
    clientSock.on('data', function(clientData) {
    
        if (connected) {
    
            // Send future messages if is connected
            serverSocet.write(clientData);
    
        } else {
    
            var host = // get from data
            var port = // get from data
    
            if (clientData is a CONNECT request) {
    
                // Create a new socket to server
                if (!serverSock) {
    
                                                 // Option here
                    serverSock = new net.Socket({allowHalfOpen: true});
    
                    serverSock.connect(port, host, function() {
    
                        // Don't need to forward hello message from client
                        // Connect method automatically sends it for you
                        //serverSock.write(clientData);
    
                        connected = true;
    
                        clientSock.write('HTTP/1.1 200 OK\r\n');
                   });
    
                   serverSock.on('data', function(serverData) {
                        clientSock.write(serverData);
                   });
               }
          }
     });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2023-03-09
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多