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

我正在尝试在Node JS中实现TCP代理。我只有Java方面的经验,所以在此过程中遇到了很多问题。我已经做了很多搜索工作,但是没有运气。

我想为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捕获发送的数据包如果我不使用代理,则会在TLS v1.2中发送“ Client Hello”消息。但是,如果我使用我的代理,它是通过SSL发送的。服务器始终拒绝我的CONNECT请求并发送回重置请求。

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

我花了整整一天的时间来解决这个问题。我相信我可以使用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);
               });
           }
      }
 });

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Node.js随机免费TCP端口

来自分类Dev

Node.js中的TCP打孔

来自分类Dev

Node.js ORM mysql通过SSH隧道连接

来自分类Dev

使用Node.js设置HTTP标头Cookie

来自分类Dev

IIS反向代理到node.js

来自分类Dev

我如何通过node.js http.Client使用和授权http代理

来自分类Dev

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

来自分类Dev

Docker Node JS设置环境

来自分类Dev

HTTP代理(Node.js)未执行正确的SSL验证

来自分类Dev

设置Node JS服务器的用户代理

来自分类Dev

使用Nginx代理在node.js应用上启用Cors

来自分类Dev

AngularJS + ServiceStack + Node.js作为代理?

来自分类Dev

Node.js HTTP.get()添加用户代理

来自分类Dev

有关使用Node.js“代理”服务器代理CSS和JS的建议

来自分类Dev

如何使用Node.js在React Native中设置代理目标?

来自分类Dev

使用代理在VM中安装node.js

来自分类Dev

使用代理将会话保持在node.js中

来自分类Dev

node.js中的TCP流处理

来自分类Dev

node.js http代理重定向

来自分类Dev

Node.js ORM mysql通过SSH隧道连接

来自分类Dev

带有https的Node.js代理

来自分类Dev

如何保护TCP连接-Node.js?

来自分类Dev

从Node.js中的地址设置代理

来自分类Dev

使用Apache代理的Node.js路由

来自分类Dev

使用请求模块的Node.JS代理

来自分类Dev

如何使用 Node.js 制作 API 代理?

来自分类Dev

使用 Node.js 设置 Alexa AppId

来自分类Dev

Node.js tcp 连接

来自分类Dev

如何检测 Node.js 中 HTTP 代理的存在?