1

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-dnshttps://github.com/iriscouch/dnsdを見てきましたが、それらを自分のシナリオに適用する方法がわかりません。

4

3 に答える 3

1

私が取り組んできたことで、私をつまずかせていたことがいくつかありました。

  1. マシンのネットワーク設定で DNS サーバーの IP アドレスを設定していませんでした。
  2. DNS サーバーの起動と https サーバーの起動の間にタイミングの問題がありました。
  3. 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 に答える