鉴于下面的示例脚本,我正在将一个TCP连接从一个服务器连接到另一个服务器,这很好。
net = require "net"
log = console.log
# This server needs to receive custom data eg. (remoteAddress or an uuid)
target = net.createServer (socket) ->
log('Target connection from ' + socket.remoteAddress)
target.listen(10000, '0.0.0.0', () -> log('Target ready'))
# User-facing server that pipes to the target server
front = net.createServer (socket) ->
log('Front connection from ' + socket.remoteAddress)
socket.on 'data', (data) ->
socket.proxy = net.createConnection 10000, () ->
socket.proxy.write(data)
socket.pipe(socket.proxy).pipe(socket)
front.listen(8006, '0.0.0.0', () -> log('Front ready'))
我面临的问题是我需要将原始套接字的IP地址(例如socket.remoteAddress
)传递给另一台服务器。
它不需要覆盖目标的socket.remoteAddress
,只需要以某种方式检索原始IP。
以下是我对此进行测试的方法:
$ telnet 172.0.0.50 8006
Trying 172.0.0.50...
Connected to 172.0.0.50.
Escape character is '^]'.
SendingData
导致:
Target ready
Front ready
Front connection from 172.0.0.1
Target connection from 127.0.0.1
请注意target
服务器收到front
服务器的IP地址,我完全理解原因。
遗憾的是,我无法使用data
,因为它可能已被客户完全加密。
答案 0 :(得分:1)
另一种更简洁的方法可能是您可以在socket.proxy连接期间发送实际的remoteAddress
,然后在目标服务器上记住它。这样,您就不必为数据增加开销。
同样在您的原始代码中,您正在为每个'数据上的目标服务器建立新的套接字连接。事件。我不认为它是故意的,但是这样,如果流量很高,你很快就会达到打开文件限制。
因此,我建议您在与前端服务器建立新的套接字连接时,只与目标服务器建立套接字连接一次。之后,您的代码应如下所示:
var net = require("net");
const log = console.log;
target = net.createServer(function(socket) {
log('Target connection from ' + socket.remoteAddress);
socket.once('data', function(data){
socket.id = data.toString(); // Now, use socket.id whenever you want at the target server.
});
});
target.listen(10000, '0.0.0.0', function() {
log('Target ready');
});
var front = net.createServer(function(socket) {
log('Front connection from ' + socket.remoteAddress);
socket.proxy = net.createConnection(10000, function() {
socket.proxy.write(socket.remoteAddress);
});
socket.pipe(socket.proxy).pipe(socket);
});
front.listen(8006, '0.0.0.0', function() {
log('Front ready');
});
要检查与服务器的连接数,可以使用server.getConnections。通过这种方式,您可以防止事情走出界限。
希望这有帮助。
答案 1 :(得分:0)
更多地考虑一个不需要对数据进行迂回的解决方案,有一个重要的事实,即两个服务器都知道打开到目标的连接的套接字端口。哪个是前连接套接字的socket.localPort
和目标服务器套接字的socket.remotePort
。
这一事实使得构建端口/ ip映射成为可能:
net = require "net"
log = console.log
portMap = {}
# This server needs to receive custom data eg. (remoteAddress or an uuid)
target = net.createServer (socket) ->
socket.once 'data', (data) ->
socket.id = portMap[socket.remotePort]
log('Target connection from ' + socket.id);
target.listen(10000, '0.0.0.0', () -> log('Target ready'))
# User-facing server that pipes to the target server
front = net.createServer (socket) ->
log('Front connection from ' + socket.remoteAddress)
socket.once 'data', (data) ->
socket.proxy = net.createConnection 10000, () ->
portMap[socket.proxy.localPort] = socket.remoteAddress;
socket.proxy.write(data)
socket.pipe(socket.proxy).pipe(socket)
front.listen(8006, '0.0.0.0', () -> log('Front ready'))