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代理:使用Node JS设置HTTP隧道

来自分类Dev

使用Apache代理的Node.js路由

来自分类Dev

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

来自分类Dev

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

来自分类Dev

node.js http代理重定向

来自分类Dev

使用Node.js设置HTTP标头Cookie

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Node.js tcp 连接

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

IIS反向代理到node.js

来自分类Dev

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

来自分类Dev

带有https的Node.js代理

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Docker Node JS设置环境

来自分类Dev

使用 Node.js 设置 Alexa AppId

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Node.js中的TCP打孔

来自分类Dev

Node.js随机免费TCP端口

来自分类Dev

node.js中的TCP流处理

来自分类Dev

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