Einen lokalen Server über einen Tunnel mit PROXYSERVER() und PROXYCLIENT() veröffentlichen
PROXY() leitet eine Anfrage an einen Server weiter, den der Proxy erreichen kann. Ein Tunnel ist für den umgekehrten Fall: Das Programm läuft auf einem Laptop oder hinter einer Firewall, sodass niemand sich damit verbinden kann, es selbst aber nach außen verbinden kann. PROXYSERVER() und PROXYCLIENT() erledigen das mit einem WebSocket, den die private Seite öffnet:
PROXYSERVER([endpoint], [socketendpoint], [logger])läuft auf dem öffentlichen Server. Jede Anfrage unterhalb vonendpoint(Standard/) wird durch den Tunnel geschickt;socketendpoint(Standard/) ist die WebSocket-Adresse, an der sich der Client verbindet. Verwende verschiedene Adressen, wenn dieselbe Anwendung noch etwas anderes ausliefert: Ein Proxy auf/nimmt jede Anfrage, auch die deiner eigenen Routen (er läuft vor ihnen).loggerist eine Funktion (Standard: gibt mit Datum aus); übergibnullfür keinen.PROXYCLIENT(serverurl, port, [logger])läuft auf der privaten Seite (in diesem Beispiel wird die Adresse des Servers mitCONF.$port, dem Port der Anwendung, gebaut).serverurlist die WebSocket-Adresse des Servers (ws://oderwss://;httpwird zuws) undportist3000oderip:3000, das lokale Programm, das die Anfragen erhält. Es gibt den WebSocket-Client zurück.- Ein Client gleichzeitig: Verbindet sich ein zweiter Client, schließt der Server ihn mit dem Code
4001. Ohne Client lautet die Antwort des ServersNot yet available.. - Das lokale Programm erhält den vollständigen Pfad der ursprünglichen Anfrage, einschließlich des
endpoint(/tunnel/hello), die Header des Besuchers und einen Headerx-proxy: Total.js, mithostauf die lokale Adresse gesetzt. - Die WebSocket-Route hat keine eigene Authentifizierung: Veröffentliche sie nicht ohne etwas davor, das entscheidet, wer sich verbinden darf (die Adresse als Geheimnis, ein eigenes
check, eine Firewall).
Hier ist eine Anwendung beide Seiten: ein kleines lokales Programm auf Port 9511 (jedes Programm täte es), der Server auf /tunnel/ und der Client, der sich mit derselben Anwendung verbindet.
// The program that is "private": an ordinary HTTP server that only listens on the loopback address
require('http').createServer(function(req, res) {
res.writeHead(200, { 'content-type': 'application/json' });
res.end(JSON.stringify({ path: req.url, via: req.headers['x-proxy'] || null, host: req.headers.host }));
}).listen(9511, '127.0.0.1');exports.install = function() {
ROUTE('GET /status/', status);
ROUTE('POST /connect/', connect);
};
// The public side: /tunnel/* goes through the tunnel, the WebSocket of the client is /tunnel-socket/. No logger.
PROXYSERVER('/tunnel/', '/tunnel-socket/', null);
let client = null;
function connect($) {
client = PROXYCLIENT('ws://127.0.0.1:' + CONF.$port + '/tunnel-socket/', '9511', null);
$.json({ connecting: true });
}
function status($) {
$.json({ connected: !!client });
}