nginx - njs解决dns

问题描述 投票:0回答:1

我试图根据SNI值进行TLS直通式代理(不解密流量)。

基本上我想代理A.gateway.example.com -> A.vpn.example.com。将vpn.example.com子域设置为解析到内部的vpn地址,网关可以连接到该地址。(对于担心安全问题的人来说:在vpn上打洞是希望的,vpn并没有保护任何东西,它只是让NAT后面的物联网设备通过网关来访问)

这样做是完美无缺的。

但是,如果有人不是用A.gateway.example.com,而是用其他一些CNAME指向A.gateway.example.com的域名接近网关,显然与regex不匹配。我需要看看传入的DNS记录,弄清楚它是否有指向*.gateway.example.com的CNAME记录。

我想过用njs来解决这个问题。

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 记录,如果有,则返回其指向的位置。

nginx nginx-reverse-proxy
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.