mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-11-15 18:08:30 -07:00
Merge: add ability to set DNS upstream per domain #445
* commit 'f7860c893da81bc23220bcdec8161ce7b36dc558': * client: removed links from upstream DNS translations * control, client: fix issues from review + control, dns, client: add ability to set DNS upstream per domain
This commit is contained in:
commit
5b417d9f17
@ -118,9 +118,9 @@
|
|||||||
"example_comment_hash": "# \u0422\u043e\u0432\u0430 \u0435 \u0441\u044a\u0449\u043e \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440",
|
"example_comment_hash": "# \u0422\u043e\u0432\u0430 \u0435 \u0441\u044a\u0449\u043e \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440",
|
||||||
"example_regex_meaning": "\u0411\u043b\u043e\u043a\u0438\u0440\u0430\u0439 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u0434\u043e\u043c\u0435\u0439\u043d\u0438 \u043a\u043e\u0439\u0442\u043e \u0441\u044a\u0432\u043f\u0430\u0434\u0430\u0442 \u0441\u044a\u0441 \u0441\u043b\u0435\u0434\u043d\u043e\u0442\u043e",
|
"example_regex_meaning": "\u0411\u043b\u043e\u043a\u0438\u0440\u0430\u0439 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u0434\u043e\u043c\u0435\u0439\u043d\u0438 \u043a\u043e\u0439\u0442\u043e \u0441\u044a\u0432\u043f\u0430\u0434\u0430\u0442 \u0441\u044a\u0441 \u0441\u043b\u0435\u0434\u043d\u043e\u0442\u043e",
|
||||||
"example_upstream_regular": "\u043a\u043b\u0430\u0441\u0438\u0447\u0435\u0441\u043a\u0438 DNS (UDP \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b)",
|
"example_upstream_regular": "\u043a\u043b\u0430\u0441\u0438\u0447\u0435\u0441\u043a\u0438 DNS (UDP \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b)",
|
||||||
"example_upstream_dot": "\u043a\u0440\u0438\u043f\u0442\u0438\u0440\u0430\u043d <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_TLS' target='_blank'>DNS-\u0432\u044a\u0440\u0445\u0443-TLS<\/a>",
|
"example_upstream_dot": "\u043a\u0440\u0438\u043f\u0442\u0438\u0440\u0430\u043d <0>DNS-\u0432\u044a\u0440\u0445\u0443-TLS<\/0>",
|
||||||
"example_upstream_doh": "\u043a\u0440\u0438\u043f\u0442\u0438\u0440\u0430\u043d <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-\u0432\u044a\u0440\u0445\u0443-HTTPS<\/a>",
|
"example_upstream_doh": "\u043a\u0440\u0438\u043f\u0442\u0438\u0440\u0430\u043d <0>DNS-\u0432\u044a\u0440\u0445\u0443-HTTPS<\/0>",
|
||||||
"example_upstream_sdns": "\u043c\u043e\u0436\u0435 \u0434\u0430 \u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 <a href='https:\/\/dnscrypt.info\/stamps\/' target='_blank'>DNS \u041f\u043e\u0434\u043f\u0438\u0441\u0432\u0430\u043d\u0435<\/a> \u0437\u0430 <a href='https:\/\/dnscrypt.info\/' target='_blank'>DNSCrypt<\/a> \u0438\u043b\u0438 <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-\u0432\u044a\u0440\u0445\u0443-HTTPS<\/a> \u0441\u044a\u0440\u0432\u044a\u0440\u0438",
|
"example_upstream_sdns": "\u043c\u043e\u0436\u0435 \u0434\u0430 \u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 <0>DNS \u041f\u043e\u0434\u043f\u0438\u0441\u0432\u0430\u043d\u0435<\/0> \u0437\u0430 <1>DNSCrypt<\/1> \u0438\u043b\u0438 <2>DNS-\u0432\u044a\u0440\u0445\u0443-HTTPS<\/2> \u0441\u044a\u0440\u0432\u044a\u0440\u0438",
|
||||||
"example_upstream_tcp": "\u043a\u043b\u0430\u0441\u0438\u0447\u0435\u0441\u043a\u0438 DNS (TCP \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b)",
|
"example_upstream_tcp": "\u043a\u043b\u0430\u0441\u0438\u0447\u0435\u0441\u043a\u0438 DNS (TCP \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b)",
|
||||||
"all_filters_up_to_date_toast": "\u0412\u0441\u0438\u0447\u043a\u0438 \u0444\u0438\u043b\u0442\u0438 \u0441\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u043d\u0438",
|
"all_filters_up_to_date_toast": "\u0412\u0441\u0438\u0447\u043a\u0438 \u0444\u0438\u043b\u0442\u0438 \u0441\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u043d\u0438",
|
||||||
"updated_upstream_dns_toast": "\u0413\u043b\u043e\u0431\u0430\u043b\u043d\u0438\u0442\u0435 DNS \u0441\u044a\u0440\u0432\u044a\u0440\u0438 \u0441\u0430 \u043e\u0431\u043d\u043e\u0432\u0435\u043d\u0438",
|
"updated_upstream_dns_toast": "\u0413\u043b\u043e\u0431\u0430\u043b\u043d\u0438\u0442\u0435 DNS \u0441\u044a\u0440\u0432\u044a\u0440\u0438 \u0441\u0430 \u043e\u0431\u043d\u043e\u0432\u0435\u043d\u0438",
|
||||||
|
@ -121,10 +121,11 @@
|
|||||||
"example_comment_hash": "# Also a comment",
|
"example_comment_hash": "# Also a comment",
|
||||||
"example_regex_meaning": "block access to the domains matching the specified regular expression",
|
"example_regex_meaning": "block access to the domains matching the specified regular expression",
|
||||||
"example_upstream_regular": "regular DNS (over UDP)",
|
"example_upstream_regular": "regular DNS (over UDP)",
|
||||||
"example_upstream_dot": "encrypted <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_TLS' target='_blank'>DNS-over-TLS<\/a>",
|
"example_upstream_dot": "encrypted <0>DNS-over-TLS</0>",
|
||||||
"example_upstream_doh": "encrypted <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS<\/a>",
|
"example_upstream_doh": "encrypted <0>DNS-over-HTTPS</0>",
|
||||||
"example_upstream_sdns": "you can use <a href='https:\/\/dnscrypt.info\/stamps\/' target='_blank'>DNS Stamps<\/a> for <a href='https:\/\/dnscrypt.info\/' target='_blank'>DNSCrypt<\/a> or <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS<\/a> resolvers",
|
"example_upstream_sdns": "you can use <0>DNS Stamps</0> for <1>DNSCrypt</1> or <2>DNS-over-HTTPS</2> resolvers",
|
||||||
"example_upstream_tcp": "regular DNS (over TCP)",
|
"example_upstream_tcp": "regular DNS (over TCP)",
|
||||||
|
"example_upstream_reserved": "you can specify DNS upstream <0>for a specific domain(s)</0>",
|
||||||
"all_filters_up_to_date_toast": "All filters are already up-to-date",
|
"all_filters_up_to_date_toast": "All filters are already up-to-date",
|
||||||
"updated_upstream_dns_toast": "Updated the upstream DNS servers",
|
"updated_upstream_dns_toast": "Updated the upstream DNS servers",
|
||||||
"dns_test_ok_toast": "Specified DNS servers are working correctly",
|
"dns_test_ok_toast": "Specified DNS servers are working correctly",
|
||||||
|
@ -115,9 +115,9 @@
|
|||||||
"example_comment_meaning": "solo un comentario",
|
"example_comment_meaning": "solo un comentario",
|
||||||
"example_comment_hash": "# Tambi\u00e9n un comentario",
|
"example_comment_hash": "# Tambi\u00e9n un comentario",
|
||||||
"example_upstream_regular": "DNS regular (a trav\u00e9s de UDP)",
|
"example_upstream_regular": "DNS regular (a trav\u00e9s de UDP)",
|
||||||
"example_upstream_dot": "encriptado <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_TLS' target='_blank'>DNS-a-trav\u00e9s-de-TLS<\/a>",
|
"example_upstream_dot": "encriptado <0>DNS-a-trav\u00e9s-de-TLS<\/0>",
|
||||||
"example_upstream_doh": "encriptado <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-a-trav\u00e9s-de-TLS<\/a>",
|
"example_upstream_doh": "encriptado <0>DNS-a-trav\u00e9s-de-TLS<\/0>",
|
||||||
"example_upstream_sdns": "puedes usar <a href='https:\/\/dnscrypt.info\/stamps\/' target='_blank'>DNS Stamps<\/a> para <a href='https:\/\/dnscrypt.info\/' target='_blank'>DNSCrypt<\/a> o <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS<\/a> resolutores",
|
"example_upstream_sdns": "puedes usar <0>DNS Stamps<\/0> para <1>DNSCrypt<\/1> o <2>DNS-over-HTTPS<\/2> resolutores",
|
||||||
"example_upstream_tcp": "DNS regular (a trav\u00e9s de TCP)",
|
"example_upstream_tcp": "DNS regular (a trav\u00e9s de TCP)",
|
||||||
"all_filters_up_to_date_toast": "Todos los filtros son actualizados",
|
"all_filters_up_to_date_toast": "Todos los filtros son actualizados",
|
||||||
"updated_upstream_dns_toast": "Servidores DNS upstream actualizados",
|
"updated_upstream_dns_toast": "Servidores DNS upstream actualizados",
|
||||||
|
@ -116,9 +116,9 @@
|
|||||||
"example_comment_meaning": "commentaire",
|
"example_comment_meaning": "commentaire",
|
||||||
"example_comment_hash": "# Et comme \u00e7a aussi on peut laisser des commentaires",
|
"example_comment_hash": "# Et comme \u00e7a aussi on peut laisser des commentaires",
|
||||||
"example_upstream_regular": "DNS classique (au-dessus de UDP)",
|
"example_upstream_regular": "DNS classique (au-dessus de UDP)",
|
||||||
"example_upstream_dot": "<a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_TLS' target='_blank'>DNS-au-dessus-de-TLS<\/a> chiffr\u00e9",
|
"example_upstream_dot": "<0>DNS-au-dessus-de-TLS<\/0> chiffr\u00e9",
|
||||||
"example_upstream_doh": "<a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-au-dessus-de-HTTPS<\/a> chiffr\u00e9",
|
"example_upstream_doh": "<0>DNS-au-dessus-de-HTTPS<\/0> chiffr\u00e9",
|
||||||
"example_upstream_sdns": "vous pouvez utiliser <a href='https:\/\/dnscrypt.info\/stamps\/' target='_blank'>DNS Stamps<\/a> pour <a href='https:\/\/dnscrypt.info\/' target='_blank'>DNSCrypt<\/a> ou les resolveurs <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-au-dessus-de-HTTPS<\/a>",
|
"example_upstream_sdns": "vous pouvez utiliser <0>DNS Stamps<\/0> pour <1>DNSCrypt<\/1> ou les resolveurs <2>DNS-au-dessus-de-HTTPS<\/2>",
|
||||||
"example_upstream_tcp": "DNS classique (au-dessus de TCP)",
|
"example_upstream_tcp": "DNS classique (au-dessus de TCP)",
|
||||||
"all_filters_up_to_date_toast": "Tous les filtres sont mis \u00e0 jour",
|
"all_filters_up_to_date_toast": "Tous les filtres sont mis \u00e0 jour",
|
||||||
"updated_upstream_dns_toast": "Les serveurs DNS upstream sont mis \u00e0 jour",
|
"updated_upstream_dns_toast": "Les serveurs DNS upstream sont mis \u00e0 jour",
|
||||||
|
@ -115,9 +115,9 @@
|
|||||||
"example_comment_meaning": "\u305f\u3060\u306e\u30b3\u30e1\u30f3\u30c8\u3067\u3059",
|
"example_comment_meaning": "\u305f\u3060\u306e\u30b3\u30e1\u30f3\u30c8\u3067\u3059",
|
||||||
"example_comment_hash": "# \u3053\u3053\u3082\u30b3\u30e1\u30f3\u30c8\u3067\u3059",
|
"example_comment_hash": "# \u3053\u3053\u3082\u30b3\u30e1\u30f3\u30c8\u3067\u3059",
|
||||||
"example_upstream_regular": "\u901a\u5e38\u306eDNS\uff08UDP\u3067\u306e\u554f\u3044\u5408\u308f\u305b\uff09",
|
"example_upstream_regular": "\u901a\u5e38\u306eDNS\uff08UDP\u3067\u306e\u554f\u3044\u5408\u308f\u305b\uff09",
|
||||||
"example_upstream_dot": "\u6697\u53f7\u5316\u3055\u308c\u3066\u3044\u308b <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_TLS' target='_blank'>DNS-over-TLS<\/a>",
|
"example_upstream_dot": "\u6697\u53f7\u5316\u3055\u308c\u3066\u3044\u308b <0>DNS-over-TLS<\/0>",
|
||||||
"example_upstream_doh": "\u6697\u53f7\u5316\u3055\u308c\u3066\u3044\u308b <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS<\/a>",
|
"example_upstream_doh": "\u6697\u53f7\u5316\u3055\u308c\u3066\u3044\u308b <0>DNS-over-HTTPS<\/0>",
|
||||||
"example_upstream_sdns": "<a href='https:\/\/dnscrypt.info\/' target='_blank'>DNSCrypt<\/a> \u307e\u305f\u306f <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS<\/a> \u30ea\u30be\u30eb\u30d0\u306e\u305f\u3081\u306b <a href='https:\/\/dnscrypt.info\/stamps\/' target='_blank'>DNS Stamps<\/a> \u3092\u4f7f\u3048\u307e\u3059",
|
"example_upstream_sdns": "<0>DNSCrypt<\/0> \u307e\u305f\u306f <1>DNS-over-HTTPS<\/1> \u30ea\u30be\u30eb\u30d0\u306e\u305f\u3081\u306b <2>DNS Stamps<\/2> \u3092\u4f7f\u3048\u307e\u3059",
|
||||||
"example_upstream_tcp": "\u901a\u5e38\u306eDNS\uff08TCP\u3067\u306e\u554f\u3044\u5408\u308f\u305b\uff09",
|
"example_upstream_tcp": "\u901a\u5e38\u306eDNS\uff08TCP\u3067\u306e\u554f\u3044\u5408\u308f\u305b\uff09",
|
||||||
"all_filters_up_to_date_toast": "\u3059\u3079\u3066\u306e\u30d5\u30a3\u30eb\u30bf\u306f\u65e2\u306b\u6700\u65b0\u3067\u3059",
|
"all_filters_up_to_date_toast": "\u3059\u3079\u3066\u306e\u30d5\u30a3\u30eb\u30bf\u306f\u65e2\u306b\u6700\u65b0\u3067\u3059",
|
||||||
"updated_upstream_dns_toast": "\u4e0a\u6d41DNS\u30b5\u30fc\u30d0\u3092\u66f4\u65b0\u3057\u307e\u3057\u305f",
|
"updated_upstream_dns_toast": "\u4e0a\u6d41DNS\u30b5\u30fc\u30d0\u3092\u66f4\u65b0\u3057\u307e\u3057\u305f",
|
||||||
|
@ -118,9 +118,9 @@
|
|||||||
"example_comment_hash": "# Tamb\u00e9m um coment\u00e1rio",
|
"example_comment_hash": "# Tamb\u00e9m um coment\u00e1rio",
|
||||||
"example_regex_meaning": "bloqueia o acesso aos dom\u00ednios correspondentes \u00e0 express\u00e3o regular especificada",
|
"example_regex_meaning": "bloqueia o acesso aos dom\u00ednios correspondentes \u00e0 express\u00e3o regular especificada",
|
||||||
"example_upstream_regular": "DNS regular (atrav\u00e9s do UDP)",
|
"example_upstream_regular": "DNS regular (atrav\u00e9s do UDP)",
|
||||||
"example_upstream_dot": "DNS criptografado <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_TLS' target='_blank'>atrav\u00e9s do TLS<\/a>",
|
"example_upstream_dot": "DNS criptografado <0>atrav\u00e9s do TLS<\/0>",
|
||||||
"example_upstream_doh": "DNS criptografado <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>atrav\u00e9s do HTTPS<\/a>",
|
"example_upstream_doh": "DNS criptografado <0>atrav\u00e9s do HTTPS<\/0>",
|
||||||
"example_upstream_sdns": "Voc\u00ea pode usar <a href='https:\/\/dnscrypt.info\/stamps\/' target='_blank'>DNS Stamps<\/a>para o<a href='https:\/\/dnscrypt.info\/' target='_blank'>DNSCrypt<\/a>ou usar resolvedores<a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-sobre-HTTPS<\/a>",
|
"example_upstream_sdns": "Voc\u00ea pode usar <0>DNS Stamps<\/0> para o <1>DNSCrypt<\/1> ou usar resolvedores <2>DNS-sobre-HTTPS<\/2>",
|
||||||
"example_upstream_tcp": "DNS regular (atrav\u00e9s do TCP)",
|
"example_upstream_tcp": "DNS regular (atrav\u00e9s do TCP)",
|
||||||
"all_filters_up_to_date_toast": "Todos os filtros j\u00e1 est\u00e3o atualizados",
|
"all_filters_up_to_date_toast": "Todos os filtros j\u00e1 est\u00e3o atualizados",
|
||||||
"updated_upstream_dns_toast": "Atualizado os servidores DNS upstream",
|
"updated_upstream_dns_toast": "Atualizado os servidores DNS upstream",
|
||||||
|
@ -115,9 +115,9 @@
|
|||||||
"example_comment_meaning": "\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439",
|
"example_comment_meaning": "\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439",
|
||||||
"example_comment_hash": "# \u0418 \u0432\u043e\u0442 \u0442\u0430\u043a \u0442\u043e\u0436\u0435",
|
"example_comment_hash": "# \u0418 \u0432\u043e\u0442 \u0442\u0430\u043a \u0442\u043e\u0436\u0435",
|
||||||
"example_upstream_regular": "\u043e\u0431\u044b\u0447\u043d\u044b\u0439 DNS (\u043f\u043e\u0432\u0435\u0440\u0445 UDP)",
|
"example_upstream_regular": "\u043e\u0431\u044b\u0447\u043d\u044b\u0439 DNS (\u043f\u043e\u0432\u0435\u0440\u0445 UDP)",
|
||||||
"example_upstream_dot": "\u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_TLS' target='_blank'>DNS-\u043f\u043e\u0432\u0435\u0440\u0445-TLS<\/a>",
|
"example_upstream_dot": "\u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 <0>DNS-\u043f\u043e\u0432\u0435\u0440\u0445-TLS<\/0>",
|
||||||
"example_upstream_doh": "\u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-\u043f\u043e\u0432\u0435\u0440\u0445-HTTPS<\/a>",
|
"example_upstream_doh": "\u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 <0>DNS-\u043f\u043e\u0432\u0435\u0440\u0445-HTTPS<\/0>",
|
||||||
"example_upstream_sdns": "\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href='https:\/\/dnscrypt.info\/stamps\/' target='_blank'>DNS Stamps<\/a> \u0434\u043b\u044f <a href='https:\/\/dnscrypt.info\/' target='_blank'>DNSCrypt<\/a> \u0438\u043b\u0438 <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS<\/a> \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u043e\u0432",
|
"example_upstream_sdns": "\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <0>DNS Stamps<\/0> \u0434\u043b\u044f <1>DNSCrypt<\/1> \u0438\u043b\u0438 <2>DNS-over-HTTPS<\/2> \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u043e\u0432",
|
||||||
"example_upstream_tcp": "\u043e\u0431\u044b\u0447\u043d\u044b\u0439 DNS (\u043f\u043e\u0432\u0435\u0440\u0445 TCP)",
|
"example_upstream_tcp": "\u043e\u0431\u044b\u0447\u043d\u044b\u0439 DNS (\u043f\u043e\u0432\u0435\u0440\u0445 TCP)",
|
||||||
"all_filters_up_to_date_toast": "\u0412\u0441\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b",
|
"all_filters_up_to_date_toast": "\u0412\u0441\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b",
|
||||||
"updated_upstream_dns_toast": "Upstream DNS-\u0441\u0435\u0440\u0432\u0435\u0440\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b",
|
"updated_upstream_dns_toast": "Upstream DNS-\u0441\u0435\u0440\u0432\u0435\u0440\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b",
|
||||||
|
@ -118,9 +118,9 @@
|
|||||||
"example_comment_hash": "# Ocks\u00e5 en kommentar",
|
"example_comment_hash": "# Ocks\u00e5 en kommentar",
|
||||||
"example_regex_meaning": "blockera \u00e5tkomst till en dom\u00e4n som matchar det angivna uttrycket",
|
"example_regex_meaning": "blockera \u00e5tkomst till en dom\u00e4n som matchar det angivna uttrycket",
|
||||||
"example_upstream_regular": "vanlig DNS (\u00f6ver UDP)",
|
"example_upstream_regular": "vanlig DNS (\u00f6ver UDP)",
|
||||||
"example_upstream_dot": "krypterat <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_TLS' target='_blank'>DNS-over-TLS<\/a>",
|
"example_upstream_dot": "krypterat <0>DNS-over-TLS<\/0>",
|
||||||
"example_upstream_doh": "krypterat <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS<\/a>",
|
"example_upstream_doh": "krypterat <0>DNS-over-HTTPS<\/0>",
|
||||||
"example_upstream_sdns": "Du kan anv\u00e4nda <a href='https:\/\/dnscrypt.info\/stamps\/' target='_blank'>DNS-stamps<\/a> f\u00f6r <a href='https:\/\/dnscrypt.info\/' target='_blank'>DNSCrypt<\/a> eller <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-\u00f6ver-HTTPS<\/a>\n-resolvers",
|
"example_upstream_sdns": "Du kan anv\u00e4nda <0>DNS-stamps<\/0> f\u00f6r <1>DNSCrypt<\/1> eller <2>DNS-\u00f6ver-HTTPS<\/2>\n-resolvers",
|
||||||
"example_upstream_tcp": "vanlig DNS (\u00f6ver UDP)",
|
"example_upstream_tcp": "vanlig DNS (\u00f6ver UDP)",
|
||||||
"all_filters_up_to_date_toast": "Alla filter \u00e4r redan aktuella",
|
"all_filters_up_to_date_toast": "Alla filter \u00e4r redan aktuella",
|
||||||
"updated_upstream_dns_toast": "Uppdaterade uppstr\u00f6ms-dns-servrar",
|
"updated_upstream_dns_toast": "Uppdaterade uppstr\u00f6ms-dns-servrar",
|
||||||
|
@ -113,9 +113,9 @@
|
|||||||
"example_comment_meaning": "Ch\u1ec9 l\u00e0 m\u1ed9t ch\u00fa th\u00edch",
|
"example_comment_meaning": "Ch\u1ec9 l\u00e0 m\u1ed9t ch\u00fa th\u00edch",
|
||||||
"example_comment_hash": "# C\u0169ng l\u00e0 m\u1ed9t ch\u00fa th\u00edch",
|
"example_comment_hash": "# C\u0169ng l\u00e0 m\u1ed9t ch\u00fa th\u00edch",
|
||||||
"example_upstream_regular": "DNS th\u00f4ng th\u01b0\u1eddng (d\u00f9ng UDP)",
|
"example_upstream_regular": "DNS th\u00f4ng th\u01b0\u1eddng (d\u00f9ng UDP)",
|
||||||
"example_upstream_dot": "\u0111\u01b0\u1ee3c m\u00e3 ho\u00e1 <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_TLS' target='_blank'>DNS-over-TLS<\/a>",
|
"example_upstream_dot": "\u0111\u01b0\u1ee3c m\u00e3 ho\u00e1 <0>DNS-over-TLS<\/0>",
|
||||||
"example_upstream_doh": "\u0111\u01b0\u1ee3c m\u00e3 ho\u00e1 <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS<\/a>",
|
"example_upstream_doh": "\u0111\u01b0\u1ee3c m\u00e3 ho\u00e1 <0>DNS-over-HTTPS<\/0>",
|
||||||
"example_upstream_sdns": "b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng <a href='https:\/\/dnscrypt.info\/stamps\/' target='_blank'>DNS Stamps<\/a> for <a href='https:\/\/dnscrypt.info\/' target='_blank'>DNSCrypt<\/a> ho\u1eb7c<a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS<\/a> ",
|
"example_upstream_sdns": "b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng <0>DNS Stamps<\/0> for <1>DNSCrypt<\/1> ho\u1eb7c <2>DNS-over-HTTPS<\/2> ",
|
||||||
"example_upstream_tcp": "DNS th\u00f4ng th\u01b0\u1eddng(d\u00f9ng TCP)",
|
"example_upstream_tcp": "DNS th\u00f4ng th\u01b0\u1eddng(d\u00f9ng TCP)",
|
||||||
"all_filters_up_to_date_toast": "T\u1ea5t c\u1ea3 b\u1ed9 l\u1ecdc \u0111\u00e3 \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt",
|
"all_filters_up_to_date_toast": "T\u1ea5t c\u1ea3 b\u1ed9 l\u1ecdc \u0111\u00e3 \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt",
|
||||||
"updated_upstream_dns_toast": "\u0110\u00e3 c\u1eadp nh\u1eadt m\u00e1y ch\u1ee7 DNS t\u00ecm ki\u1ebfm",
|
"updated_upstream_dns_toast": "\u0110\u00e3 c\u1eadp nh\u1eadt m\u00e1y ch\u1ee7 DNS t\u00ecm ki\u1ebfm",
|
||||||
|
@ -121,9 +121,9 @@
|
|||||||
"example_comment_hash": "# \u8fd9\u4e5f\u662f\u4e00\u884c\u6ce8\u91ca",
|
"example_comment_hash": "# \u8fd9\u4e5f\u662f\u4e00\u884c\u6ce8\u91ca",
|
||||||
"example_regex_meaning": "\u963b\u6b62\u8bbf\u95ee\u4e0e\u6307\u5b9a\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u5339\u914d\u7684\u57df\u540d",
|
"example_regex_meaning": "\u963b\u6b62\u8bbf\u95ee\u4e0e\u6307\u5b9a\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u5339\u914d\u7684\u57df\u540d",
|
||||||
"example_upstream_regular": "\u5e38\u89c4 DNS\uff08\u57fa\u4e8e UDP\uff09",
|
"example_upstream_regular": "\u5e38\u89c4 DNS\uff08\u57fa\u4e8e UDP\uff09",
|
||||||
"example_upstream_dot": "\u52a0\u5bc6 <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_TLS' target='_blank'>DNS-over-TLS<\/a>",
|
"example_upstream_dot": "\u52a0\u5bc6 <0>DNS-over-TLS<\/0>",
|
||||||
"example_upstream_doh": "\u52a0\u5bc6 <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS<\/a>",
|
"example_upstream_doh": "\u52a0\u5bc6 <0>DNS-over-HTTPS<\/0>",
|
||||||
"example_upstream_sdns": "\u4f60\u53ef\u4ee5\u4f7f\u7528 <a href='https:\/\/dnscrypt.info\/' target='_blank'>DNSCrypt<\/a> \u7684 <a href='https:\/\/dnscrypt.info\/stamps\/' target='_blank'>DNS Stamps<\/a> \u6216\u8005 <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS<\/a> \u89e3\u6790\u5668",
|
"example_upstream_sdns": "\u4f60\u53ef\u4ee5\u4f7f\u7528 <0>DNSCrypt<\/0> \u7684 <1>DNS Stamps<\/1> \u6216\u8005 <2>DNS-over-HTTPS<\/2> \u89e3\u6790\u5668",
|
||||||
"example_upstream_tcp": "\u5e38\u89c4 DNS\uff08\u57fa\u4e8e TCP \uff09",
|
"example_upstream_tcp": "\u5e38\u89c4 DNS\uff08\u57fa\u4e8e TCP \uff09",
|
||||||
"all_filters_up_to_date_toast": "\u6240\u6709\u8fc7\u6ee4\u5668\u5df2\u66f4\u65b0\u81f3\u6700\u65b0",
|
"all_filters_up_to_date_toast": "\u6240\u6709\u8fc7\u6ee4\u5668\u5df2\u66f4\u65b0\u81f3\u6700\u65b0",
|
||||||
"updated_upstream_dns_toast": "\u4e0a\u6e38 DNS \u5df2\u66f4\u65b0",
|
"updated_upstream_dns_toast": "\u4e0a\u6e38 DNS \u5df2\u66f4\u65b0",
|
||||||
|
@ -121,9 +121,9 @@
|
|||||||
"example_comment_hash": "# \u4e5f\u662f\u4e00\u500b\u8a3b\u89e3",
|
"example_comment_hash": "# \u4e5f\u662f\u4e00\u500b\u8a3b\u89e3",
|
||||||
"example_regex_meaning": "\u5c01\u9396\u81f3\u8207\u5df2\u660e\u78ba\u6307\u5b9a\u7684\u898f\u5247\u904b\u7b97\u5f0f\uff08Regular Expression\uff09\u76f8\u7b26\u7684\u7db2\u57df\u4e4b\u5b58\u53d6",
|
"example_regex_meaning": "\u5c01\u9396\u81f3\u8207\u5df2\u660e\u78ba\u6307\u5b9a\u7684\u898f\u5247\u904b\u7b97\u5f0f\uff08Regular Expression\uff09\u76f8\u7b26\u7684\u7db2\u57df\u4e4b\u5b58\u53d6",
|
||||||
"example_upstream_regular": "\u4e00\u822c\u7684 DNS\uff08\u900f\u904eUDP\uff09",
|
"example_upstream_regular": "\u4e00\u822c\u7684 DNS\uff08\u900f\u904eUDP\uff09",
|
||||||
"example_upstream_dot": "\u52a0\u5bc6\u7684 <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_TLS' target='_blank'>DNS-over-TLS<\/a>",
|
"example_upstream_dot": "\u52a0\u5bc6\u7684 <0>DNS-over-TLS<\/0>",
|
||||||
"example_upstream_doh": "\u52a0\u5bc6\u7684 <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS <\/a>",
|
"example_upstream_doh": "\u52a0\u5bc6\u7684 <0>DNS-over-HTTPS <\/0>",
|
||||||
"example_upstream_sdns": "\u60a8\u53ef\u4f7f\u7528\u95dc\u65bc <a href='https:\/\/dnscrypt.info\/' target='_blank'>DNSCrypt<\/a> \u6216 <a href='https:\/\/en.wikipedia.org\/wiki\/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS<\/a> \u89e3\u6790\u5668\u4e4b <a href='https:\/\/dnscrypt.info\/stamps\/' target='_blank'>DNS \u6233\u8a18<\/a>",
|
"example_upstream_sdns": "\u60a8\u53ef\u4f7f\u7528\u95dc\u65bc <0>DNSCrypt<\/0> \u6216 <1>DNS-over-HTTPS<\/1> \u89e3\u6790\u5668\u4e4b <2>DNS \u6233\u8a18<\/2>",
|
||||||
"example_upstream_tcp": "\u4e00\u822c\u7684 DNS\uff08\u900f\u904eTCP\uff09",
|
"example_upstream_tcp": "\u4e00\u822c\u7684 DNS\uff08\u900f\u904eTCP\uff09",
|
||||||
"all_filters_up_to_date_toast": "\u6240\u6709\u7684\u904e\u6ffe\u5668\u5df2\u662f\u6700\u65b0\u7684",
|
"all_filters_up_to_date_toast": "\u6240\u6709\u7684\u904e\u6ffe\u5668\u5df2\u662f\u6700\u65b0\u7684",
|
||||||
"updated_upstream_dns_toast": "\u5df2\u66f4\u65b0\u4e0a\u6e38\u7684DNS\u4f3a\u670d\u5668",
|
"updated_upstream_dns_toast": "\u5df2\u66f4\u65b0\u4e0a\u6e38\u7684DNS\u4f3a\u670d\u5668",
|
||||||
@ -249,5 +249,7 @@
|
|||||||
"form_error_equal": "\u4e0d\u61c9\u70ba\u76f8\u7b49\u7684",
|
"form_error_equal": "\u4e0d\u61c9\u70ba\u76f8\u7b49\u7684",
|
||||||
"form_error_password": "\u4e0d\u76f8\u7b26\u7684\u5bc6\u78bc",
|
"form_error_password": "\u4e0d\u76f8\u7b26\u7684\u5bc6\u78bc",
|
||||||
"reset_settings": "\u91cd\u7f6e\u8a2d\u5b9a",
|
"reset_settings": "\u91cd\u7f6e\u8a2d\u5b9a",
|
||||||
"update_announcement": "AdGuard Home {{version}} \u73fe\u70ba\u53ef\u7528\u7684\uff01\u95dc\u65bc\u66f4\u591a\u7684\u8cc7\u8a0a\uff0c<0>\u9ede\u64ca\u9019\u88e1<\/0>\u3002"
|
"update_announcement": "AdGuard Home {{version}} \u73fe\u70ba\u53ef\u7528\u7684\uff01\u95dc\u65bc\u66f4\u591a\u7684\u8cc7\u8a0a\uff0c<0>\u9ede\u64ca\u9019\u88e1<\/0>\u3002",
|
||||||
|
"setup_guide": "\u5b89\u88dd\u6307\u5357",
|
||||||
|
"dns_addresses": "DNS \u4f4d\u5740"
|
||||||
}
|
}
|
@ -10,16 +10,69 @@ const Examples = props => (
|
|||||||
<code>1.1.1.1</code> - { props.t('example_upstream_regular') }
|
<code>1.1.1.1</code> - { props.t('example_upstream_regular') }
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<code>tls://1dot1dot1dot1.cloudflare-dns.com</code> - <span dangerouslySetInnerHTML={{ __html: props.t('example_upstream_dot') }} />
|
<code>tls://1dot1dot1dot1.cloudflare-dns.com</code> –
|
||||||
|
<span>
|
||||||
|
<Trans
|
||||||
|
components={[
|
||||||
|
<a href="https://en.wikipedia.org/wiki/DNS_over_TLS" target="_blank" rel="noopener noreferrer" key="0">
|
||||||
|
DNS-over-TLS
|
||||||
|
</a>,
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
example_upstream_dot
|
||||||
|
</Trans>
|
||||||
|
</span>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<code>https://cloudflare-dns.com/dns-query</code> - <span dangerouslySetInnerHTML={{ __html: props.t('example_upstream_doh') }} />
|
<code>https://cloudflare-dns.com/dns-query</code> –
|
||||||
|
<span>
|
||||||
|
<Trans
|
||||||
|
components={[
|
||||||
|
<a href="https://en.wikipedia.org/wiki/DNS_over_HTTPS" target="_blank" rel="noopener noreferrer" key="0">
|
||||||
|
DNS-over-HTTPS
|
||||||
|
</a>,
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
example_upstream_doh
|
||||||
|
</Trans>
|
||||||
|
</span>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<code>tcp://1.1.1.1</code> - { props.t('example_upstream_tcp') }
|
<code>tcp://1.1.1.1</code> – <Trans>example_upstream_tcp</Trans>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<code>sdns://...</code> - <span dangerouslySetInnerHTML={{ __html: props.t('example_upstream_sdns') }} />
|
<code>sdns://...</code> –
|
||||||
|
<span>
|
||||||
|
<Trans
|
||||||
|
components={[
|
||||||
|
<a href="https://dnscrypt.info/stamps/" target="_blank" rel="noopener noreferrer" key="0">
|
||||||
|
DNS Stamps
|
||||||
|
</a>,
|
||||||
|
<a href="https://dnscrypt.info/" target="_blank" rel="noopener noreferrer" key="1">
|
||||||
|
DNSCrypt
|
||||||
|
</a>,
|
||||||
|
<a href="https://en.wikipedia.org/wiki/DNS_over_HTTPS" target="_blank" rel="noopener noreferrer" key="2">
|
||||||
|
DNS-over-HTTPS
|
||||||
|
</a>,
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
example_upstream_sdns
|
||||||
|
</Trans>
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<code>[/example.local/]1.1.1.1</code> –
|
||||||
|
<span>
|
||||||
|
<Trans
|
||||||
|
components={[
|
||||||
|
<a href="https://github.com/AdguardTeam/dnsproxy#specifying-upstreams-for-domains" target="_blank" rel="noopener noreferrer" key="0">
|
||||||
|
Link
|
||||||
|
</a>,
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
example_upstream_reserved
|
||||||
|
</Trans>
|
||||||
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
|
@ -7,6 +7,7 @@ import flow from 'lodash/flow';
|
|||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
|
|
||||||
import { renderSelectField } from '../../../helpers/form';
|
import { renderSelectField } from '../../../helpers/form';
|
||||||
|
import Examples from './Examples';
|
||||||
|
|
||||||
let Form = (props) => {
|
let Form = (props) => {
|
||||||
const {
|
const {
|
||||||
@ -55,6 +56,10 @@ let Form = (props) => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="col-12">
|
||||||
|
<Examples />
|
||||||
|
<hr/>
|
||||||
|
</div>
|
||||||
<div className="col-12">
|
<div className="col-12">
|
||||||
<div className="form__group">
|
<div className="form__group">
|
||||||
<label className="form__label" htmlFor="bootstrap_dns">
|
<label className="form__label" htmlFor="bootstrap_dns">
|
||||||
|
@ -3,7 +3,6 @@ import PropTypes from 'prop-types';
|
|||||||
import { withNamespaces } from 'react-i18next';
|
import { withNamespaces } from 'react-i18next';
|
||||||
|
|
||||||
import Form from './Form';
|
import Form from './Form';
|
||||||
import Examples from './Examples';
|
|
||||||
import Card from '../../ui/Card';
|
import Card from '../../ui/Card';
|
||||||
|
|
||||||
class Upstream extends Component {
|
class Upstream extends Component {
|
||||||
@ -44,8 +43,6 @@ class Upstream extends Component {
|
|||||||
processingTestUpstream={processingTestUpstream}
|
processingTestUpstream={processingTestUpstream}
|
||||||
processingSetUpstream={processingSetUpstream}
|
processingSetUpstream={processingSetUpstream}
|
||||||
/>
|
/>
|
||||||
<hr/>
|
|
||||||
<Examples />
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
|
99
control.go
99
control.go
@ -18,6 +18,7 @@ import (
|
|||||||
"github.com/AdguardTeam/AdGuardHome/dnsforward"
|
"github.com/AdguardTeam/AdGuardHome/dnsforward"
|
||||||
"github.com/AdguardTeam/dnsproxy/upstream"
|
"github.com/AdguardTeam/dnsproxy/upstream"
|
||||||
"github.com/AdguardTeam/golibs/log"
|
"github.com/AdguardTeam/golibs/log"
|
||||||
|
"github.com/AdguardTeam/golibs/utils"
|
||||||
"github.com/miekg/dns"
|
"github.com/miekg/dns"
|
||||||
govalidator "gopkg.in/asaskevich/govalidator.v4"
|
govalidator "gopkg.in/asaskevich/govalidator.v4"
|
||||||
)
|
)
|
||||||
@ -334,11 +335,10 @@ func handleSetUpstreamConfig(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, u := range newconfig.Upstreams {
|
err = validateUpstreams(newconfig.Upstreams)
|
||||||
if err = validateUpstream(u); err != nil {
|
if err != nil {
|
||||||
httpError(w, http.StatusBadRequest, "%s can not be used as upstream cause: %s", u, err)
|
httpError(w, http.StatusBadRequest, "wrong upstreams specification: %s", err)
|
||||||
return
|
return
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
config.DNS.UpstreamDNS = defaultDNS
|
config.DNS.UpstreamDNS = defaultDNS
|
||||||
@ -363,18 +363,80 @@ func handleSetUpstreamConfig(w http.ResponseWriter, r *http.Request) {
|
|||||||
httpUpdateConfigReloadDNSReturnOK(w, r)
|
httpUpdateConfigReloadDNSReturnOK(w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateUpstream(upstream string) error {
|
// validateUpstreams validates each upstream and returns an error if any upstream is invalid or if there are no default upstreams specified
|
||||||
for _, proto := range protocols {
|
func validateUpstreams(upstreams []string) error {
|
||||||
if strings.HasPrefix(upstream, proto) {
|
var defaultUpstreamFound bool
|
||||||
return nil
|
for _, u := range upstreams {
|
||||||
|
d, err := validateUpstream(u)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check this flag until default upstream will not be found
|
||||||
|
if !defaultUpstreamFound {
|
||||||
|
defaultUpstreamFound = d
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.Contains(upstream, "://") {
|
// Return error if there are no default upstreams
|
||||||
return fmt.Errorf("wrong protocol")
|
if !defaultUpstreamFound {
|
||||||
|
return fmt.Errorf("no default upstreams specified")
|
||||||
}
|
}
|
||||||
|
|
||||||
return checkPlainDNS(upstream)
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateUpstream(u string) (bool, error) {
|
||||||
|
// Check if user tries to specify upstream for domain
|
||||||
|
u, defaultUpstream, err := separateUpstream(u)
|
||||||
|
if err != nil {
|
||||||
|
return defaultUpstream, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// The special server address '#' means "use the default servers"
|
||||||
|
if u == "#" && !defaultUpstream {
|
||||||
|
return defaultUpstream, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the upstream has a valid protocol prefix
|
||||||
|
for _, proto := range protocols {
|
||||||
|
if strings.HasPrefix(u, proto) {
|
||||||
|
return defaultUpstream, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return error if the upstream contains '://' without any valid protocol
|
||||||
|
if strings.Contains(u, "://") {
|
||||||
|
return defaultUpstream, fmt.Errorf("wrong protocol")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if upstream is valid plain DNS
|
||||||
|
return defaultUpstream, checkPlainDNS(u)
|
||||||
|
}
|
||||||
|
|
||||||
|
// separateUpstream returns upstream without specified domains and a bool flag that indicates if no domains were specified
|
||||||
|
// error will be returned if upstream per domain specification is invalid
|
||||||
|
func separateUpstream(upstream string) (string, bool, error) {
|
||||||
|
defaultUpstream := true
|
||||||
|
if strings.HasPrefix(upstream, "[/") {
|
||||||
|
defaultUpstream = false
|
||||||
|
// split domains and upstream string
|
||||||
|
domainsAndUpstream := strings.Split(strings.TrimPrefix(upstream, "[/"), "/]")
|
||||||
|
if len(domainsAndUpstream) != 2 {
|
||||||
|
return "", defaultUpstream, fmt.Errorf("wrong DNS upstream per domain specification: %s", upstream)
|
||||||
|
}
|
||||||
|
|
||||||
|
// split domains list and validate each one
|
||||||
|
for _, host := range strings.Split(domainsAndUpstream[0], "/") {
|
||||||
|
if host != "" {
|
||||||
|
if err := utils.IsValidHostname(host); err != nil {
|
||||||
|
return "", defaultUpstream, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
upstream = domainsAndUpstream[1]
|
||||||
|
}
|
||||||
|
return upstream, defaultUpstream, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// checkPlainDNS checks if host is plain DNS
|
// checkPlainDNS checks if host is plain DNS
|
||||||
@ -442,7 +504,18 @@ func handleTestUpstreamDNS(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func checkDNS(input string, bootstrap []string) error {
|
func checkDNS(input string, bootstrap []string) error {
|
||||||
if err := validateUpstream(input); err != nil {
|
// separate upstream from domains list
|
||||||
|
input, defaultUpstream, err := separateUpstream(input)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("wrong upstream format: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// No need to check this entrance
|
||||||
|
if input == "#" && !defaultUpstream {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := validateUpstream(input); err != nil {
|
||||||
return fmt.Errorf("wrong upstream format: %s", err)
|
return fmt.Errorf("wrong upstream format: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,3 +75,79 @@ kXS9jgARhhiWXJrk
|
|||||||
t.Fatalf("valid cert & priv key: validateCertificates(): %v", data)
|
t.Fatalf("valid cert & priv key: validateCertificates(): %v", data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestValidateUpstream(t *testing.T) {
|
||||||
|
invalidUpstreams := []string{"1.2.3.4.5",
|
||||||
|
"123.3.7m",
|
||||||
|
"htttps://google.com/dns-query",
|
||||||
|
"[/host.com]tls://dns.adguard.com",
|
||||||
|
"[host.ru]#",
|
||||||
|
}
|
||||||
|
|
||||||
|
validDefaultUpstreams := []string{"1.1.1.1",
|
||||||
|
"tls://1.1.1.1",
|
||||||
|
"https://dns.adguard.com/dns-query",
|
||||||
|
"sdns://AQMAAAAAAAAAFDE3Ni4xMDMuMTMwLjEzMDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20",
|
||||||
|
}
|
||||||
|
|
||||||
|
validUpstreams := []string{"[/host.com/]1.1.1.1",
|
||||||
|
"[//]tls://1.1.1.1",
|
||||||
|
"[/www.host.com/]#",
|
||||||
|
"[/host.com/google.com/]8.8.8.8",
|
||||||
|
"[/host/]sdns://AQMAAAAAAAAAFDE3Ni4xMDMuMTMwLjEzMDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20",
|
||||||
|
}
|
||||||
|
for _, u := range invalidUpstreams {
|
||||||
|
_, err := validateUpstream(u)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("upstream %s is invalid but it pass through validation", u)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, u := range validDefaultUpstreams {
|
||||||
|
defaultUpstream, err := validateUpstream(u)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("upstream %s is valid but it doen't pass through validation cause: %s", u, err)
|
||||||
|
}
|
||||||
|
if !defaultUpstream {
|
||||||
|
t.Fatalf("upstream %s is default one!", u)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, u := range validUpstreams {
|
||||||
|
defaultUpstream, err := validateUpstream(u)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("upstream %s is valid but it doen't pass through validation cause: %s", u, err)
|
||||||
|
}
|
||||||
|
if defaultUpstream {
|
||||||
|
t.Fatalf("upstream %s is default one!", u)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestValidateUpstreamsSet(t *testing.T) {
|
||||||
|
// Set of valid upstreams. There is no default upstream specified
|
||||||
|
upstreamsSet := []string{"[/host.com/]1.1.1.1",
|
||||||
|
"[//]tls://1.1.1.1",
|
||||||
|
"[/www.host.com/]#",
|
||||||
|
"[/host.com/google.com/]8.8.8.8",
|
||||||
|
"[/host/]sdns://AQMAAAAAAAAAFDE3Ni4xMDMuMTMwLjEzMDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20",
|
||||||
|
}
|
||||||
|
err := validateUpstreams(upstreamsSet)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("there is no default upstream")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Let's add default upstream
|
||||||
|
upstreamsSet = append(upstreamsSet, "8.8.8.8")
|
||||||
|
err = validateUpstreams(upstreamsSet)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("upstreams set is valid, but doesn't pass through validation cause: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Let's add invalid upstream
|
||||||
|
upstreamsSet = append(upstreamsSet, "dhcp://fake.dns")
|
||||||
|
err = validateUpstreams(upstreamsSet)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("there is an invalid upstream in set, but it pass through validation")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
19
dns.go
19
dns.go
@ -7,7 +7,7 @@ import (
|
|||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/dnsfilter"
|
"github.com/AdguardTeam/AdGuardHome/dnsfilter"
|
||||||
"github.com/AdguardTeam/AdGuardHome/dnsforward"
|
"github.com/AdguardTeam/AdGuardHome/dnsforward"
|
||||||
"github.com/AdguardTeam/dnsproxy/upstream"
|
"github.com/AdguardTeam/dnsproxy/proxy"
|
||||||
"github.com/AdguardTeam/golibs/log"
|
"github.com/AdguardTeam/golibs/log"
|
||||||
"github.com/joomcode/errorx"
|
"github.com/joomcode/errorx"
|
||||||
)
|
)
|
||||||
@ -58,19 +58,12 @@ func generateServerConfig() dnsforward.ServerConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, u := range config.DNS.UpstreamDNS {
|
upstreamConfig, err := proxy.ParseUpstreamsConfig(config.DNS.UpstreamDNS, config.DNS.BootstrapDNS, dnsforward.DefaultTimeout)
|
||||||
opts := upstream.Options{
|
if err != nil {
|
||||||
Timeout: dnsforward.DefaultTimeout,
|
log.Error("Couldn't get upstreams configuration cause: %s", err)
|
||||||
Bootstrap: config.DNS.BootstrapDNS,
|
|
||||||
}
|
|
||||||
dnsUpstream, err := upstream.AddressToUpstream(u, opts)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Couldn't get upstream: %s", err)
|
|
||||||
// continue, just ignore the upstream
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
newconfig.Upstreams = append(newconfig.Upstreams, dnsUpstream)
|
|
||||||
}
|
}
|
||||||
|
newconfig.Upstreams = upstreamConfig.Upstreams
|
||||||
|
newconfig.DomainsReservedUpstreams = upstreamConfig.DomainReservedUpstreams
|
||||||
newconfig.AllServers = config.DNS.AllServers
|
newconfig.AllServers = config.DNS.AllServers
|
||||||
return newconfig
|
return newconfig
|
||||||
}
|
}
|
||||||
|
@ -82,10 +82,11 @@ type TLSConfig struct {
|
|||||||
// ServerConfig represents server configuration.
|
// ServerConfig represents server configuration.
|
||||||
// The zero ServerConfig is empty and ready for use.
|
// The zero ServerConfig is empty and ready for use.
|
||||||
type ServerConfig struct {
|
type ServerConfig struct {
|
||||||
UDPListenAddr *net.UDPAddr // UDP listen address
|
UDPListenAddr *net.UDPAddr // UDP listen address
|
||||||
TCPListenAddr *net.TCPAddr // TCP listen address
|
TCPListenAddr *net.TCPAddr // TCP listen address
|
||||||
Upstreams []upstream.Upstream // Configured upstreams
|
Upstreams []upstream.Upstream // Configured upstreams
|
||||||
Filters []dnsfilter.Filter // A list of filters to use
|
DomainsReservedUpstreams map[string][]upstream.Upstream // Map of domains and lists of configured upstreams
|
||||||
|
Filters []dnsfilter.Filter // A list of filters to use
|
||||||
|
|
||||||
FilteringConfig
|
FilteringConfig
|
||||||
TLSConfig
|
TLSConfig
|
||||||
@ -156,15 +157,16 @@ func (s *Server) startInternal(config *ServerConfig) error {
|
|||||||
})
|
})
|
||||||
|
|
||||||
proxyConfig := proxy.Config{
|
proxyConfig := proxy.Config{
|
||||||
UDPListenAddr: s.UDPListenAddr,
|
UDPListenAddr: s.UDPListenAddr,
|
||||||
TCPListenAddr: s.TCPListenAddr,
|
TCPListenAddr: s.TCPListenAddr,
|
||||||
Ratelimit: s.Ratelimit,
|
Ratelimit: s.Ratelimit,
|
||||||
RatelimitWhitelist: s.RatelimitWhitelist,
|
RatelimitWhitelist: s.RatelimitWhitelist,
|
||||||
RefuseAny: s.RefuseAny,
|
RefuseAny: s.RefuseAny,
|
||||||
CacheEnabled: true,
|
CacheEnabled: true,
|
||||||
Upstreams: s.Upstreams,
|
Upstreams: s.Upstreams,
|
||||||
Handler: s.handleDNSRequest,
|
DomainsReservedUpstreams: s.DomainsReservedUpstreams,
|
||||||
AllServers: s.AllServers,
|
Handler: s.handleDNSRequest,
|
||||||
|
AllServers: s.AllServers,
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.TLSListenAddr != nil && s.CertificateChain != "" && s.PrivateKey != "" {
|
if s.TLSListenAddr != nil && s.CertificateChain != "" && s.PrivateKey != "" {
|
||||||
|
4
go.mod
4
go.mod
@ -3,10 +3,10 @@ module github.com/AdguardTeam/AdGuardHome
|
|||||||
go 1.12
|
go 1.12
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/AdguardTeam/dnsproxy v0.11.2
|
github.com/AdguardTeam/dnsproxy v0.12.0
|
||||||
github.com/AdguardTeam/golibs v0.1.3
|
github.com/AdguardTeam/golibs v0.1.3
|
||||||
github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f // indirect
|
github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f // indirect
|
||||||
github.com/bluele/gcache v0.0.0-20171010155617-472614239ac7
|
github.com/bluele/gcache v0.0.0-20190203144525-2016d595ccb0
|
||||||
github.com/go-ole/go-ole v1.2.1 // indirect
|
github.com/go-ole/go-ole v1.2.1 // indirect
|
||||||
github.com/go-test/deep v1.0.1
|
github.com/go-test/deep v1.0.1
|
||||||
github.com/gobuffalo/packr v1.19.0
|
github.com/gobuffalo/packr v1.19.0
|
||||||
|
10
go.sum
10
go.sum
@ -1,6 +1,6 @@
|
|||||||
github.com/AdguardTeam/dnsproxy v0.11.2 h1:S/Ag2q9qoZsmW1fvMohPZP7/5amEtz8NmFCp8kxUalQ=
|
github.com/AdguardTeam/dnsproxy v0.12.0 h1:BPgv2PlH2u4xakFcaW4EqU3Visk1BNidrqGSgxe5Qzg=
|
||||||
github.com/AdguardTeam/dnsproxy v0.11.2/go.mod h1:EPp92b5cYR7HZpO+OQu6xC7AyhUoBaXW3sfa3exq/0I=
|
github.com/AdguardTeam/dnsproxy v0.12.0/go.mod h1:lcZM2QPwcWGEL3pz8RYy06nQdbjj4pr+94H45jnVSHg=
|
||||||
github.com/AdguardTeam/golibs v0.1.0/go.mod h1:zhi6xGwK4cMpjDocybhhLgvcGkstiSIjlpKbvyxC5Yc=
|
github.com/AdguardTeam/golibs v0.1.2/go.mod h1:b0XkhgIcn2TxwX6C5AQMtpIFAgjPehNgxJErWkwA3ko=
|
||||||
github.com/AdguardTeam/golibs v0.1.3 h1:hmapdTtMtIk3T8eQDwTOLdqZLGDKNKk9325uC8z12xg=
|
github.com/AdguardTeam/golibs v0.1.3 h1:hmapdTtMtIk3T8eQDwTOLdqZLGDKNKk9325uC8z12xg=
|
||||||
github.com/AdguardTeam/golibs v0.1.3/go.mod h1:b0XkhgIcn2TxwX6C5AQMtpIFAgjPehNgxJErWkwA3ko=
|
github.com/AdguardTeam/golibs v0.1.3/go.mod h1:b0XkhgIcn2TxwX6C5AQMtpIFAgjPehNgxJErWkwA3ko=
|
||||||
github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f h1:5ZfJxyXo8KyX8DgGXC5B7ILL8y51fci/qYz2B4j8iLY=
|
github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f h1:5ZfJxyXo8KyX8DgGXC5B7ILL8y51fci/qYz2B4j8iLY=
|
||||||
@ -15,8 +15,8 @@ github.com/ameshkov/dnsstamps v1.0.1 h1:LhGvgWDzhNJh+kBQd/AfUlq1vfVe109huiXw4Jhn
|
|||||||
github.com/ameshkov/dnsstamps v1.0.1/go.mod h1:Ii3eUu73dx4Vw5O4wjzmT5+lkCwovjzaEZZ4gKyIH5A=
|
github.com/ameshkov/dnsstamps v1.0.1/go.mod h1:Ii3eUu73dx4Vw5O4wjzmT5+lkCwovjzaEZZ4gKyIH5A=
|
||||||
github.com/beefsack/go-rate v0.0.0-20180408011153-efa7637bb9b6 h1:KXlsf+qt/X5ttPGEjR0tPH1xaWWoKBEg9Q1THAj2h3I=
|
github.com/beefsack/go-rate v0.0.0-20180408011153-efa7637bb9b6 h1:KXlsf+qt/X5ttPGEjR0tPH1xaWWoKBEg9Q1THAj2h3I=
|
||||||
github.com/beefsack/go-rate v0.0.0-20180408011153-efa7637bb9b6/go.mod h1:6YNgTHLutezwnBvyneBbwvB8C82y3dcoOj5EQJIdGXA=
|
github.com/beefsack/go-rate v0.0.0-20180408011153-efa7637bb9b6/go.mod h1:6YNgTHLutezwnBvyneBbwvB8C82y3dcoOj5EQJIdGXA=
|
||||||
github.com/bluele/gcache v0.0.0-20171010155617-472614239ac7 h1:NpQ+gkFOH27AyDypSCJ/LdsIi/b4rdnEb1N5+IpFfYs=
|
github.com/bluele/gcache v0.0.0-20190203144525-2016d595ccb0 h1:vUdUwmQLnT/yuk8PsDhhMVkrfr4aMdcv/0GWzIqOjEY=
|
||||||
github.com/bluele/gcache v0.0.0-20171010155617-472614239ac7/go.mod h1:8c4/i2VlovMO2gBnHGQPN5EJw+H0lx1u/5p+cgsXtCk=
|
github.com/bluele/gcache v0.0.0-20190203144525-2016d595ccb0/go.mod h1:8c4/i2VlovMO2gBnHGQPN5EJw+H0lx1u/5p+cgsXtCk=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
|
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
|
||||||
|
Loading…
Reference in New Issue
Block a user