Node JS TCP 代理:使用 Node JS 设置 HTTP 隧道
Node JS TCP Proxy: Set up HTTP Tunnel using Node JS
我正在尝试在 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 套接字来实现 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 中实现 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 套接字来实现 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);
});
}
}
});