简体   繁体   English

Node JS TCP代理:使用Node JS设置HTTP隧道

[英]Node JS TCP Proxy: Set up HTTP Tunnel using Node JS

I'm trying to implement a TCP proxy in Node JS. 我正在尝试在Node JS中实现TCP代理。 I only have some experience with Javascript so I met a lot of problems along the way. 我只有Java方面的经验,所以在此过程中遇到了很多问题。 I've done a lot of searching for this one but had no luck. 我已经做了很多寻找,但是没有运气。

I want to implement a two-hop TCP connection for HTTPS proxy. 我想为HTTPS代理实现两跳TCP连接。 Here is part of my code. 这是我的代码的一部分。

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);
                   });
               }
          }
     });
 });

I used Wireshark to capture the packets sent if I visit https://www.google.com . 如果访问https://www.google.com,我会使用Wireshark捕获发送的数据包。 If I don't use my proxy, the "Client Hello" message is sent in TLS v1.2. 如果我不使用代理,则会在TLS v1.2中发送“ Client Hello”消息。 But if I use my proxy, it is sent by SSL. 但是,如果我使用代理,它是通过SSL发送的。 The server always reject my CONNECT request and send back a reset request. 服务器始终拒绝我的CONNECT请求并发送回重置请求。

I also tried the TLS API in Node JS. 我还尝试了Node JS中的TLS API。 The server accepted my CONNECT request but always request me to start a new session after the Key Exchange. 服务器接受了我的CONNECT请求,但始终要求我在密钥交换后开始新的会话。 The browser will close the socket and create a new socket. 浏览器将关闭套接字并创建一个新的套接字。 But it never loaded the page... 但是它从来没有加载过页面...

I've spent a whole day on this single problem. 我花了整整一天的时间来解决这个问题。 I believe I can use TCP socket to implement HTTP Tunnel. 我相信我可以使用TCP套接字来实现HTTP隧道。 Please help... Thanks a lot!! 请帮助...非常感谢!

Problem solved! 问题解决了!

To make TCP socket use TLS v1.2 while dealing with HTTPS, just put this option, {allowHalfOpen: true}, as parameter when creating the sockets. 要使TCP套接字在处理HTTPS时使用TLS v1.2,只需在创建套接字时将此参数{allowHalfOpen:true}作为参数即可。

New Code would look like this: 新代码如下所示:

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);
               });
           }
      }
 });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM