如何在本地主机上为通配符域创builddns服务器,以便与node / express一起使用?

我想创build一个本地https服务器,使用express来处理example.com的任何子域。 理想情况下,我想修改我的主机文件,如下所示:127.0.0.2 localhost * .example.com但是这是不允许的。
所以我想创build我自己的dns服务器来parsing* .example.com的IP到127.0.0.2。 我已经看过https://github.com/tjfontaine/node-dns和https://github.com/iriscouch/dnsd,但我不明白如何将它们应用于我的scheme。

您将需要运行本地DNS服务器来拦截请求。

我发现dnsproxy.py工作得很好。 它是用python编写的,需要在运行的时候打算使用它。

您将需要编辑您的hosts文件,并添加一行这样的:

 127.0.0.1 *.example.com 

之后,您将需要启动DNS代理服务器:

 $ sudo python dnsproxy.py -s 8.8.8.8 

8.8.8.8是Google DNS服务器的IP地址,如果在hosts文件中找不到logging,它将被用作回退。

完成此操作后,您应该能够在端口80上启动快速服务器,并处理对*.example.com请求。

xip.io可能不适合你,但我发现它非常有用。 “xip.io是一个神奇的域名,为任何IP地址提供通配DNS。” “xip.io在公共互联网上运行一个自定义的DNS服务器,当你的计算机查找一个xip.io域时,xip.io DNS服务器将从该域中提取IP地址,并将其发送回来。”

因此,以下所有域将parsing为127.0.0.1:

 127.0.0.1.xip.io www.127.0.0.1.xip.io example.com.127.0.0.1.xip.io something.example.com.127.0.0.1.xip.io 

( 这个守护进程恰好是用Coffeescript编写的,在node.js上运行)

有些事情让我感到沮丧,我已经努力了。

  1. 我没有在我的机器的networking设置中设置DNS服务器的IP地址。
  2. 我在启动DNS服务器和启动https服务器之间有一个计时问题。
  3. 我没有在DNS响应中包含端口号

这是我的解决scheme:

 var fs = require('fs'); var path = require('path'); var dns = require('native-dns'); var https = require('https'); var express = require('express'); String.prototype.endsWith = function(s) { return this.length >= s.length && this.substr(this.length - s.length) == s; }; var startDns = function(example_port, callback) { var server = dns.createServer(); server.on('request', function(request, response) { var found = false; for (var q = 0; q < request.question.length; q++) { var name = request.question[q].name; if (name.endsWith("example.com")) { response.answer.push(dns.A({ name:name, address:'127.0.0.2', port:example_port, ttl:600 })); found = true; } } if (found) { response.send(); } }); server.on('error', function(err, buff, req, res) { console.log(JSON.stringify(err)); }); server.on('listening', function() { console.log("DNS server started on port 53"); if (callback) { callback(); } }); server.serve(53); return server; }; var startHttps = function(serverPort) { // Set up secure server var options = { key:fs.readFileSync(path.join(__dirname, 'certificates/example.com-key.pem')), cert:fs.readFileSync(path.join(__dirname, 'certificates/example.com-cert.pem')) }; var app = express(); var server = https.createServer(options, app); app.get('*', function(req, res, next) { res.send('Hello from ' + req.headers.host); }); server.listen(serverPort, 'example.com'); console.log('https server started on port ' + serverPort); return server; }; var server_port = parseInt(process.argv[2] || 8082); var httpsServer; var dnsServer = startDns(server_port, function() { httpsServer = startHttps(server_port) }); process.on('SIGINT', function() { console.log("shutting down"); if (httpsServer) { httpsServer.close(); } if (dnsServer) { dnsServer.close(); } }); 

注意:这是在我的Windows机器上工作。 我仍然在其他平台上进行testing。 我不知道,如果我正确地处理我的DNS服务器中无法识别的域名。