119 lines
3.2 KiB
JavaScript
119 lines
3.2 KiB
JavaScript
const Component = require("./_component");
|
|
const net = require('net');
|
|
const fs = require('fs');
|
|
|
|
function logger (...p) {
|
|
return;
|
|
console.debug("[TCP reverse]:", ...p);
|
|
};
|
|
|
|
async function isFirewalled () { // TODO: Firewall
|
|
return false;
|
|
}
|
|
|
|
module.exports = class TCPServer extends Component {
|
|
static type () {
|
|
return "tcp-proxy";
|
|
}
|
|
|
|
constructor (adr, syntaxTree) {
|
|
super(adr, syntaxTree);
|
|
if (syntaxTree.firewall) {
|
|
throw new Error("Firewall doesn't supports");
|
|
}
|
|
}
|
|
|
|
run () {
|
|
this.server = net.createServer(async (srvSocket) => {
|
|
const isFrw = await isFirewalled(srvSocket.remoteAddress);
|
|
if (isFrw) {
|
|
srvSocket.end();
|
|
logger(`${srvSocket.remoteAddress} firewalled, reject`);
|
|
}
|
|
srvSocket.on("error", (err) => {
|
|
logger("Caught server socket error: ");
|
|
logger(err.stack);
|
|
});
|
|
});
|
|
const connections = {};
|
|
|
|
this.server.on('connection', async (socket) => {
|
|
socket.fullAddress = `${socket.remoteAddress}:${socket.remotePort}`;
|
|
logger(`Connected: ${socket.fullAddress}`);
|
|
|
|
//const loggerPromise = loggingIp(`${this.adr.address}:${this.adr.port}`, socket.remoteAddress, new Date());
|
|
const isFrw = await isFirewalled(socket.remoteAddress);
|
|
if (isFrw) {
|
|
socket.end();
|
|
logger(`${socket.remoteAddress} firewalled, reject`);
|
|
//await loggerPromise;
|
|
return;
|
|
}
|
|
else {
|
|
//await loggerPromise;
|
|
const remote = {
|
|
ip: this.syntax.target.split(/:/)[0],
|
|
port: this.syntax.target.split(/:/)[1],
|
|
};
|
|
connections[socket.fullAddress] = net.createConnection(remote.port, remote.ip);
|
|
|
|
socket.on('data', (data) => {
|
|
logger(`from ${socket.remoteAddress} sended: ${data.length} bytes`);
|
|
connections[socket.fullAddress].write(data, function(err) {
|
|
if (err)
|
|
logger(`error: ${socket.remoteAddress} throwed: ${err.name}`);
|
|
// connections[socket.fullAddress].end();
|
|
});
|
|
// connections[socket.fullAddress].end();
|
|
});
|
|
|
|
connections[socket.fullAddress].on('data', (data) => {
|
|
logger(`to ${socket.remoteAddress} sended: ${data.length} bytes`);
|
|
socket.write(data, function(err) {
|
|
if (err)
|
|
logger(`error: ${socket.remoteAddress} (remote) throwed: ${err.name}`);
|
|
// socket.end();
|
|
});
|
|
// socket.end();
|
|
});
|
|
|
|
connections[socket.fullAddress].on('end', (data) => {
|
|
logger(`remote of ${socket.remoteAddress} disconnected`);
|
|
socket.end();
|
|
});
|
|
|
|
connections[socket.fullAddress].on('error', (err) => {
|
|
logger(`remote of ${socket.remoteAddress} error:`);
|
|
logger(err.stack);
|
|
socket.end();
|
|
});
|
|
|
|
socket.on('end', () => {
|
|
logger(`${socket.remoteAddress} disconnected`);
|
|
connections[socket.fullAddress].end();
|
|
connections[socket.fullAddress] = undefined; // Free memory!
|
|
});
|
|
|
|
socket.on("error", (err) => {
|
|
logger(
|
|
`socket.on(${socket.remoteAddress}) error:`
|
|
);
|
|
logger(err.stack);
|
|
connections[socket.fullAddress].end();
|
|
// socket.end();
|
|
});
|
|
}
|
|
});
|
|
|
|
this.server.on('error', (err) => {
|
|
logger("Error of server");
|
|
logger(err.stack);
|
|
});
|
|
|
|
this.server.listen(this.adr.port, this.adr.address, (err) => {
|
|
if (err) throw err;
|
|
console.log("TCP reverse proxy connected!");
|
|
});
|
|
}
|
|
}
|