node.js - Node JS TCP 代理 : Set up HTTP Tunnel using Node JS

标签 node.js networking tcp proxy http-tunneling

我正在尝试在 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);
                   });
               }
          }
     });
 });

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

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

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

最佳答案

问题解决了!

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

关于node.js - Node JS TCP 代理 : Set up HTTP Tunnel using Node JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30160873/

相关文章:

node.js - Node AWS S3 getObject 在文件流完成之前触发 httpDone

android - 如何找出连接到您在android中的同一WIFI网络的其他用户?

c - 网络编程通过c编译执行但不打印IP地址...!

javascript - 每次为每个请求提供相同的输出

javascript - NPM 模块 - 如何利用 package.json 文件?

go - 使用 gopacket 向 127.0.0.1 发送 UDP 数据包

Spring Integration TCP 工厂错误处理

c++ - C/C++ 复合 TCP

C++ 网络,recv() 无缘无故失败(?)

javascript - 为什么 crypto.createHash 在新版本中返回不同的输出?