nginx - n js решить днс - PullRequest
       11

nginx - n js решить днс

0 голосов
/ 21 января 2020

Я пытаюсь выполнить промежуточное прокси TLS (без расшифровки трафика c) на основе значения SNI.

В основном я хочу прокси A.gateway.example.com -> A.vpn.example.com. Субдомены vpn.example.com настроены для разрешения внутренних адресов vpn, к которым может подключиться шлюз. (Для всех, кто обеспокоен безопасностью: желательно пробить дыру в VPN, VPN ничего не защищает, это просто способ сделать устройства IoT за NAT доступными через шлюз)

Это работает безупречно.

Однако, если кто-то подходит к шлюзу не с A.gateway.example.com, а с другим доменом, который является CNAME для A.gateway.example.com, он явно не соответствует регулярному выражению. Мне нужно было бы взглянуть на входящую запись DNS и выяснить, есть ли у нее запись CNAME, указывающая на * .gateway.example.com.

Я подумал об использовании n js для этого:

function query_cname(d) {
  ???
}


function match_vpn(d) {
  var m = d.match(/(.*)\.gateway\.example\.com$/);

  if (m !== null) {
    return m[1] + ".vpn.example.com";
  } else {
    return null;
  }
}


function select_upstream(s) {
  s.error(s.variables.ssl_preread_server_name);

  var sni = s.variables.ssl_preread_server_name;
  var v;
  var d;

  if ((v = match_vpn(sni)) !== null) {
    s.error("SNI match: " + v + " ==> " + m);
    return v;
  } else if (((d = query_cname(s)) !== null) && ((v = match_vpn(d)) !== null)) {
    s.error("CNAME match: " + s + " -> " + d + " ==> " + v);
    return v;
  } else {
    s.error("No match for " + sni);
    return "127.0.0.1";
  }
}

Вопрос в том, как написать функцию query_cname, которая должна использовать распознаватель для проверки наличия записей CNAME для входного домена и возврата туда, куда они указывают, если они это делают.

...