Я пытаюсь выполнить промежуточное прокси 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 для входного домена и возврата туда, куда они указывают, если они это делают.