example.com の任意のサブドメインを処理する Express を使用して、ローカルの https サーバーを作成したいと考えています。理想的には、hosts ファイルを 127.0.0.2 localhost *.example.com のように変更したいのですが、これは許可されていません。
したがって、*.example.com の IP を 127.0.0.2 に解決するために、独自の dns サーバーを作成したいと思います。https://github.com/tjfontaine/node-dnsとhttps://github.com/iriscouch/dnsdを見てきましたが、それらを自分のシナリオに適用する方法がわかりません。
質問する
3091 次
3 に答える
1
私が取り組んできたことで、私をつまずかせていたことがいくつかありました。
- マシンのネットワーク設定で DNS サーバーの IP アドレスを設定していませんでした。
- DNS サーバーの起動と https サーバーの起動の間にタイミングの問題がありました。
- DNS 応答にポート番号を含めていませんでした
これが私の解決策です:
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 マシンで動作しています。私はまだ他のプラットフォームでテストしています。認識されていない DNS サーバーのドメインを正しく処理しているかどうかわかりません。
于 2013-09-26T21:28:23.960 に答える
1
リクエストをインターセプトするには、ローカル 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
は、hosts ファイルにレコードが見つからない場合にフォールバックとして使用される Google の DNS サーバーの IP アドレスです。
これが完了すると、ポートで高速サーバーを起動し、 への80
リクエストを処理できるようになり*.example.com
ます。
于 2013-09-24T23:53:49.077 に答える