201 lines
12 KiB
HTML
201 lines
12 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
|
|
<meta charset="utf-8">
|
|
<title>DNSServer.js - Documentation</title>
|
|
|
|
|
|
<script src="scripts/prettify/prettify.js"></script>
|
|
<script src="scripts/prettify/lang-css.js"></script>
|
|
<!--[if lt IE 9]>
|
|
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
<![endif]-->
|
|
<link type="text/css" rel="stylesheet" href="styles/prettify.css">
|
|
<link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
</head>
|
|
<body>
|
|
|
|
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
|
|
<label for="nav-trigger" class="navicon-button x">
|
|
<div class="navicon"></div>
|
|
</label>
|
|
|
|
<label for="nav-trigger" class="overlay"></label>
|
|
|
|
<nav>
|
|
|
|
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ControlServer.html">ControlServer</a><ul class='methods'><li data-type='method'><a href="ControlServer.html#.instance_info">instance_info</a></li><li data-type='method'><a href="ControlServer.html#close">close</a></li><li data-type='method'><a href="ControlServer.html#createDNSServer">createDNSServer</a></li><li data-type='method'><a href="ControlServer.html#createHTTPServer">createHTTPServer</a></li><li data-type='method'><a href="ControlServer.html#createSOCKSServer">createSOCKSServer</a></li><li data-type='method'><a href="ControlServer.html#createTorPool">createTorPool</a></li><li data-type='method'><a href="ControlServer.html#listen">listen</a></li><li data-type='method'><a href="ControlServer.html#listenTcp">listenTcp</a></li><li data-type='method'><a href="ControlServer.html#listenWs">listenWs</a></li></ul></li><li><a href="DNSServer.html">DNSServer</a><ul class='methods'><li data-type='method'><a href="DNSServer.html#listen">listen</a></li></ul></li><li><a href="HTTPServer.html">HTTPServer</a><ul class='methods'><li data-type='method'><a href="HTTPServer.html#listen">listen</a></li></ul></li><li><a href="SOCKSServer.html">SOCKSServer</a><ul class='methods'><li data-type='method'><a href="SOCKSServer.html#listen">listen</a></li></ul></li><li><a href="TorPool.html">TorPool</a><ul class='methods'><li data-type='method'><a href="TorPool.html#add">add</a></li><li data-type='method'><a href="TorPool.html#add_instance_to_group">add_instance_to_group</a></li><li data-type='method'><a href="TorPool.html#add_instance_to_group_at">add_instance_to_group_at</a></li><li data-type='method'><a href="TorPool.html#add_instance_to_group_by_name">add_instance_to_group_by_name</a></li><li data-type='method'><a href="TorPool.html#create">create</a></li><li data-type='method'><a href="TorPool.html#create_instance">create_instance</a></li><li data-type='method'><a href="TorPool.html#exit">exit</a></li><li data-type='method'><a href="TorPool.html#get_config_at">get_config_at</a></li><li data-type='method'><a href="TorPool.html#get_config_by_name">get_config_by_name</a></li><li data-type='method'><a href="TorPool.html#instance_at">instance_at</a></li><li data-type='method'><a href="TorPool.html#instance_by_name">instance_by_name</a></li><li data-type='method'><a href="TorPool.html#instances_by_group">instances_by_group</a></li><li data-type='method'><a href="TorPool.html#new_identites">new_identites</a></li><li data-type='method'><a href="TorPool.html#new_identites_by_group">new_identites_by_group</a></li><li data-type='method'><a href="TorPool.html#new_identity_at">new_identity_at</a></li><li data-type='method'><a href="TorPool.html#new_identity_by_name">new_identity_by_name</a></li><li data-type='method'><a href="TorPool.html#next">next</a></li><li data-type='method'><a href="TorPool.html#next_by_group">next_by_group</a></li><li data-type='method'><a href="TorPool.html#remove">remove</a></li><li data-type='method'><a href="TorPool.html#remove_at">remove_at</a></li><li data-type='method'><a href="TorPool.html#remove_by_name">remove_by_name</a></li><li data-type='method'><a href="TorPool.html#remove_instance_from_group">remove_instance_from_group</a></li><li data-type='method'><a href="TorPool.html#remove_instance_from_group_at">remove_instance_from_group_at</a></li><li data-type='method'><a href="TorPool.html#remove_instance_from_group_by_name">remove_instance_from_group_by_name</a></li><li data-type='method'><a href="TorPool.html#set_config_all">set_config_all</a></li><li data-type='method'><a href="TorPool.html#set_config_at">set_config_at</a></li><li data-type='method'><a href="TorPool.html#set_config_by_group">set_config_by_group</a></li><li data-type='method'><a href="TorPool.html#set_config_by_name">set_config_by_name</a></li><li data-type='method'><a href="TorPool.html#signal_all">signal_all</a></li><li data-type='method'><a href="TorPool.html#signal_at">signal_at</a></li><li data-type='method'><a href="TorPool.html#signal_by_group">signal_by_group</a></li><li data-type='method'><a href="TorPool.html#signal_by_name">signal_by_name</a></li></ul></li><li><a href="TorProcess.html">TorProcess</a><ul class='methods'><li data-type='method'><a href="TorProcess.html#create">create</a></li><li data-type='method'><a href="TorProcess.html#exit">exit</a></li><li data-type='method'><a href="TorProcess.html#get_config">get_config</a></li><li data-type='method'><a href="TorProcess.html#new_identity">new_identity</a></li><li data-type='method'><a href="TorProcess.html#set_config">set_config</a></li><li data-type='method'><a href="TorProcess.html#signal">signal</a></li></ul></li></ul><h3>Modules</h3><ul><li><a href="module-tor-router.html">tor-router</a></li><li><a href="module-tor-router_ControlServer.html">tor-router/ControlServer</a></li><li><a href="module-tor-router_default_config.html">tor-router/default_config</a></li><li><a href="module-tor-router_default_ports.html">tor-router/default_ports</a></li><li><a href="module-tor-router_DNSServer.html">tor-router/DNSServer</a></li><li><a href="module-tor-router_HTTPServer.html">tor-router/HTTPServer</a></li><li><a href="module-tor-router_launch.html">tor-router/launch</a></li><li><a href="module-tor-router_nconf_load_env.html">tor-router/nconf_load_env</a></li><li><a href="module-tor-router_SOCKSServer.html">tor-router/SOCKSServer</a></li><li><a href="module-tor-router_TorPool.html">tor-router/TorPool</a></li><li><a href="module-tor-router_TorProcess.html">tor-router/TorProcess</a></li><li><a href="module-tor-router_winston_silent_logger.html">tor-router/winston_silent_logger</a></li></ul><h3>Events</h3><ul><li><a href="DNSServer.html#event:instance-connection">instance-connection</a></li><li><a href="HTTPServer.html#event:instance-connection">instance-connection</a></li><li><a href="SOCKSServer.html#event:instance-connection">instance-connection</a></li><li><a href="TorPool.html#event:instance_created">instance_created</a></li><li><a href="TorProcess.html#event:control_listen">control_listen</a></li><li><a href="TorProcess.html#event:controller_ready">controller_ready</a></li><li><a href="TorProcess.html#event:dns_listen">dns_listen</a></li><li><a href="TorProcess.html#event:error">error</a></li><li><a href="TorProcess.html#event:process_exit">process_exit</a></li><li><a href="TorProcess.html#event:ready">ready</a></li><li><a href="TorProcess.html#event:socks_listen">socks_listen</a></li></ul><h3>Global</h3><ul><li><a href="global.html#assembleHost">assembleHost</a></li><li><a href="global.html#cleanUp">cleanUp</a></li><li><a href="global.html#env_whitelist">env_whitelist</a></li><li><a href="global.html#logger">logger</a></li><li><a href="global.html#main">main</a></li><li><a href="global.html#nconf">nconf</a></li><li><a href="global.html#REALM">REALM</a></li><li><a href="global.html#setup_nconf_env">setup_nconf_env</a></li><li><a href="global.html#TOR_ROUTER_PROXY_AGENT">TOR_ROUTER_PROXY_AGENT</a></li></ul>
|
|
</nav>
|
|
|
|
<div id="main">
|
|
|
|
<h1 class="page-title">DNSServer.js</h1>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section>
|
|
<article>
|
|
<pre class="prettyprint source linenums"><code>const dns = require('native-dns');
|
|
const { UDPServer, Request } = dns;
|
|
const Promise = require('bluebird');
|
|
|
|
/**
|
|
* A DNS proxy server that will route requests to instances in the TorPool provided.
|
|
* @extends UDPServer
|
|
*/
|
|
class DNSServer extends UDPServer {
|
|
/**
|
|
* Binds the server to a port and IP Address.
|
|
*
|
|
* @async
|
|
* @param {number} port - The port to bind to.
|
|
* @param {string} [host="::"] - Address to bind to. Will default to :: or 0.0.0.0 if not specified.
|
|
* @returns {Promise}
|
|
*
|
|
*/
|
|
async listen() {
|
|
let args = Array.from(arguments);
|
|
let inner_func = super.serve;
|
|
|
|
if (!args[1])
|
|
args[1] = null;
|
|
|
|
return await new Promise((resolve, reject) => {
|
|
args.push(() => {
|
|
let args = Array.from(arguments);
|
|
resolve.apply(args);
|
|
});
|
|
|
|
try {
|
|
inner_func.apply(this, args);
|
|
} catch (error) {
|
|
reject(error);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Creates an instance of `DNSServer`.
|
|
* @param {TorPool} tor_pool - The pool of instances that will be used for requests.
|
|
* @param {Object} [dns_options] - Options that will be passed to the parent constructor.
|
|
* @param {number} dns_timeout - How long to wait before each outbound DNS request before timing out.
|
|
* @param {Logger} [logger] - Winston logger that will be used for logging. If not specified will disable logging.
|
|
*/
|
|
constructor(tor_pool, dns_options, dns_timeout, logger) {
|
|
/**
|
|
* Handles an incoming DNS request.
|
|
*
|
|
* @function handle_request
|
|
* @param {Request} req - Incoming DNS request.
|
|
* @param {Response} res - Outgoing DNS response.
|
|
* @private
|
|
*/
|
|
const handle_request = (req, res) => {
|
|
let connect = (tor_instance) => {
|
|
for (let question of req.question) {
|
|
let dns_port = (tor_instance.dns_port);
|
|
let outbound_req = Request({
|
|
question,
|
|
server: { address: '127.0.0.1', port: dns_port, type: 'udp' },
|
|
timeout: this.dns_timeout
|
|
});
|
|
|
|
outbound_req.on('message', (err, answer) => {
|
|
if (!err && answer) {
|
|
for (let a of answer.answer){
|
|
res.answer.push(a);
|
|
}
|
|
}
|
|
});
|
|
|
|
outbound_req.on('error', (err) => {
|
|
this.logger.error(`[dns]: an error occured while handling the request: ${err.message}`);
|
|
});
|
|
|
|
|
|
outbound_req.on('end', () => {
|
|
let source = { hostname: req.address.address, port: req.address.port, proto: 'dns' };
|
|
/**
|
|
* Fires when the proxy has made a connection through an instance.
|
|
*
|
|
* @event DNSServer#instance-connection
|
|
* @param {TorProcess} instance - Instance that has been connected to.
|
|
* @param {InstanceConnectionSource} source - Details on the source of the connection.
|
|
*/
|
|
this.emit('instance_connection', tor_instance, source);
|
|
this.logger.verbose(`[dns]: ${source.hostname}:${source.port} → 127.0.0.1:${dns_port}${tor_instance.definition.Name ? ' ('+tor_instance.definition.Name+')' : '' }`);
|
|
res.send();
|
|
});
|
|
|
|
outbound_req.send();
|
|
};
|
|
};
|
|
if (this.tor_pool.instances.length) {
|
|
connect(this.tor_pool.next());
|
|
}
|
|
else {
|
|
this.logger.debug(`[dns]: a connection has been attempted, but no tor instances are live... waiting for an instance to come online`);
|
|
this.tor_pool.once('instance_created', connect);
|
|
}
|
|
};
|
|
|
|
super(dns_options);
|
|
/**
|
|
* Winston logger
|
|
* @type {Logger}
|
|
* @public
|
|
*/
|
|
this.logger = logger || require('./winston_silent_logger');
|
|
|
|
/**
|
|
* The pool of instances that will be used for requests.
|
|
* @type {TorPool}
|
|
* @public
|
|
*/
|
|
this.tor_pool = tor_pool;
|
|
|
|
/**
|
|
* Timeout for each outbound DNS request
|
|
* @type {number}
|
|
* @public
|
|
*/
|
|
this.dns_timeout = dns_timeout;
|
|
|
|
this.on('request', handle_request);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Module that contains the {@link DNSSErver} class.
|
|
* @module tor-router/DNSServer
|
|
* @see DNSServer
|
|
*/
|
|
module.exports = DNSServer;</code></pre>
|
|
</article>
|
|
</section>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<br class="clear">
|
|
|
|
<footer>
|
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Tue Sep 25 2018 12:53:23 GMT-0400 (Eastern Daylight Time) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
</footer>
|
|
|
|
<script>prettyPrint();</script>
|
|
<script src="scripts/linenumber.js"></script>
|
|
|
|
|
|
</body>
|
|
</html>
|