Helyi szerver közzététele alagúton át a PROXYSERVER() és a PROXYCLIENT() segítségével
A PROXY() egy olyan szervernek továbbít kérést, amelyet a proxy elér. Az alagút az ellenkező esetre való: a program egy laptopon vagy tűzfal mögött van, így senki nem tud csatlakozni hozzá, de ő ki tud csatlakozni. A PROXYSERVER() és a PROXYCLIENT() ezt egyetlen WebSocketen oldja meg, amelyet a privát oldal nyit meg:
- A
PROXYSERVER([endpoint], [socketendpoint], [logger])a nyilvános szerveren fut. Minden kérés azendpointalatt (alapértelmezés/) az alagúton át megy; asocketendpoint(alapértelmezés/) az a WebSocket-cím, ahol a kliens csatlakozik. Használjon különböző címeket, ha ugyanaz az alkalmazás mást is kiszolgál: egy/-en lévő proxy minden kérést elvisz, a saját útvonalaiét is (azok előtt fut). Aloggeregy függvény (alapértelmezés: dátummal kiír);null-t adjon át, ha nem kell. - A
PROXYCLIENT(serverurl, port, [logger])a privát oldalon fut (ebben a példában a szerver címe aCONF.$port-ból, az alkalmazás portjából készül). Aserverurla szerver WebSocket-címe (ws://vagywss://; ahttpws-re változik), aportpedig3000vagyip:3000, a kéréseket fogadó helyi program. A WebSocket klienst adja vissza. - Egyszerre egy kliens: ha egy második kliens csatlakozik, a szerver a
4001kóddal lezárja. Kliens nélkül a szerver válaszaNot yet available.. - A helyi program az eredeti kérés teljes útvonalát kapja, az
endpoint-tal együtt (/tunnel/hello), a látogató fejléceit és egyx-proxy: Total.jsfejlécet, ahostpedig a helyi címre van állítva. - A WebSocket útvonalnak nincs saját hitelesítése: ne tegye közzé úgy, hogy nincs előtte valami, ami eldönti, ki csatlakozhat (a cím mint titok, saját
check, tűzfal).
Itt egy alkalmazás mindkét oldal: egy kis helyi program a 9511-es porton (bármelyik program megtenné), a szerver a /tunnel/ alatt és a kliens, amely ugyanahhoz az alkalmazáshoz csatlakozik.
// 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 });
}