рдЖрдореНрд╣реА рдЖрдордЪрд╛ DNS-over-HTTPS рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдврд╡рддреЛ

DNS рдСрдкрд░реЗрд╢рдирдЪреНрдпрд╛ рд╡рд┐рд╡рд┐рдз рдкреИрд▓реВрдВрд╡рд░ рд▓реЗрдЦрдХрд╛рдиреЗ рдЕрдиреЗрдХ рд╡реЗрд│рд╛ рдЖрдзреАрдЪ рд╕реНрдкрд░реНрд╢ рдХреЗрд▓рд╛ рдЖрд╣реЗ рд▓реЗрдЦ рдмреНрд▓реЙрдЧрдЪрд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди рдкреНрд░рдХрд╛рд╢рд┐рдд. рддреНрдпрд╛рдЪ рд╡реЗрд│реА, рдпрд╛ рдкреНрд░рдореБрдЦ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗрд╡реЗрдЪреА рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╡рд░ рдиреЗрд╣рдореАрдЪ рдореБрдЦреНрдп рднрд░ рджрд┐рд▓рд╛ рдЧреЗрд▓рд╛ рдЖрд╣реЗ.

рдЖрдореНрд╣реА рдЖрдордЪрд╛ DNS-over-HTTPS рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдврд╡рддреЛ

рдЕрд▓реАрдХрдбреЗ рдкрд░реНрдпрдВрдд, DNS рд░рд╣рджрд╛рд░реАрдЪреА рд╕реНрдкрд╖реНрдЯ рднреЗрджреНрдпрддрд╛ рдЕрд╕реВрдирд╣реА, рдЬреЗ рдЕрдЬреВрдирд╣реА, рдмрд╣реБрддреЗрдХ рднрд╛рдЧрд╛рдВрд╕рд╛рдареА, рд╕рд╛рдордЧреНрд░реА, рд╕рд░рдХрд╛рд░реА рд╕реБрд░рдХреНрд╖рд╛ рдПрдЬрдиреНрд╕реА рдЖрдгрд┐ рд╕реЗрдиреНрд╕реЙрд░рд╢рд┐рдкрдордзреНрдпреЗ рдЬрд╛рд╣рд┐рд░рд╛рддреА рдПрдореНрдмреЗрдб рдХрд░реВрди рддреНрдпрд╛рдВрдЪреЗ рдЙрддреНрдкрдиреНрди рд╡рд╛рдврд╡реВ рдкрд╛рд╣рдгрд╛рд▒реНрдпрд╛ рдкреНрд░рджрд╛рддреНрдпрд╛рдВрдЪреНрдпрд╛ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдХреГрддреАрдВрдХрдбреЗ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддреЗ, рддрд╕реЗрдЪ рдлрдХреНрдд рдЧреБрдиреНрд╣реЗрдЧрд╛рд░, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддреНрдпрд╛рдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдордЬрдмреВрдд рдХрд░рдгреЗ, DNSSEC/DANE, DNScrypt, DNS-over-TLS рдЖрдгрд┐ DNS-over-HTTPS рд╕рд╛рд░рдЦреНрдпрд╛ рд╡рд┐рд╡рд┐рдз рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪреА рдЙрдкрд╕реНрдерд┐рддреА рдЕрд╕реВрдирд╣реА, рдардкреНрдк рдЖрд╣реЗ. рдЖрдгрд┐ рдЬрд░ рд╕рд░реНрд╡реНрд╣рд░ рд╕реЛрд▓реНрдпреВрд╢рдиреНрд╕, рдЖрдгрд┐ рддреНрдпрд╛рдкреИрдХреА рдХрд╛рд╣реА рдмрд░реНрдпрд╛рдЪ рдХрд╛рд│рд╛рдкрд╛рд╕реВрди рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗрдд, рд╡реНрдпрд╛рдкрдХрдкрдгреЗ рдЬреНрдЮрд╛рдд рдЖрдгрд┐ рдЙрдкрд▓рдмреНрдз рдЕрд╕рддреАрд▓, рддрд░ рдХреНрд▓рд╛рдпрдВрдЯ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рдХрдбреВрди рддреНрдпрд╛рдВрдЪреЗ рд╕рдорд░реНрдерди рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрд╣реЗ.

рд╕реБрджреИрд╡рд╛рдиреЗ, рдкрд░рд┐рд╕реНрдерд┐рддреА рдмрджрд▓рдд рдЖрд╣реЗ. рд╡рд┐рд╢реЗрд╖рддрдГ, рд▓реЛрдХрдкреНрд░рд┐рдп рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рдмреНрд░рд╛рдЙрдЭрд░рдЪреЗ рд╡рд┐рдХрд╕рдХ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдореБрд▓рднреВрддрд░рд┐рддреНрдпрд╛ рд╕рдорд░реНрдерди рдореЛрдб рд╕рдХреНрд╖рдо рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдпреЛрдЬрдирд╛рдВрдмрджреНрджрд▓ DNS-рдУрд╡реНрд╣рд░-HTTPS (DoH) рд▓рд╡рдХрд░рдЪ. рд╣реЗ рд╡рд░реАрд▓ рдзреЛрдХреНрдпрд╛рдВрдкрд╛рд╕реВрди WWW рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ DNS рдЯреНрд░реЕрдлрд┐рдХрдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рд╕ рдорджрдд рдХрд░реЗрд▓, рдкрд░рдВрддреБ рд╕рдВрднрд╛рд╡реНрдпрддрдГ рдирд╡реАрди рд╕рд╛рджрд░ рдХрд░реВ рд╢рдХреЗрд▓.

1. DNS-рдУрд╡реНрд╣рд░-HTTPS рд╕рдорд╕реНрдпрд╛

рдкрд╣рд┐рд▓реНрдпрд╛ рджреГрд╖реНрдЯреАрдХреНрд╖реЗрдкрд╛рдд, рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рдордзреНрдпреЗ рдбреАрдПрдирдПрд╕-рдУрд╡реНрд╣рд░-рдПрдЪрдЯреАрдЯреАрдкреАрдПрд╕рдЪрд╛ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ рдкрд░рд┐рдЪрдп рдХреЗрд╡рд│ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛рд░рдгреАрднреВрдд рдард░рддреЛ. рддрдерд╛рдкрд┐, рд╕реИрддрд╛рди, рдЬрд╕реЗ рддреЗ рдореНрд╣рдгрддрд╛рдд, рддрдкрд╢реАрд▓рд╛рдВрдордзреНрдпреЗ рдЖрд╣реЗ.

DoH рдЪреНрдпрд╛ рд╡реНрдпрд╛рдкрдХ рд╡рд╛рдкрд░рд╛рдЪреНрдпрд╛ рд╡реНрдпрд╛рдкреНрддреАрд▓рд╛ рдорд░реНрдпрд╛рджрд╛ рдШрд╛рд▓рдгрд╛рд░реА рдкрд╣рд┐рд▓реА рд╕рдорд╕реНрдпрд╛ рдореНрд╣рдгрдЬреЗ рдХреЗрд╡рд│ рд╡реЗрдм рд░рд╣рджрд╛рд░реАрд╡рд░ рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдгреЗ. рдЦрд░рдВрдЪ, HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рд╡рд░реНрддрдорд╛рди рдЖрд╡реГрддреНрддреА HTTP/2, рдЬреНрдпрд╛рд╡рд░ DoH рдЖрдзрд╛рд░рд┐рдд рдЖрд╣реЗ, рд╣реЗ WWW рдЪрд╛ рдЖрдзрд╛рд░ рдЖрд╣реЗрдд. рдкрдг рдЗрдВрдЯрд░рдиреЗрдЯ рд╣реЗ рдлрдХреНрдд рд╡реЗрдм рдирд╛рд╣реА. рдЕрдиреЗрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕реЗрд╡рд╛ рдЖрд╣реЗрдд, рдЬрд╕реЗ рдХреА рдИрдореЗрд▓, рд╡рд┐рд╡рд┐рдз рдЗрдиреНрд╕реНрдЯрдВрдЯ рдореЗрд╕реЗрдВрдЬрд░, рдлрд╛рдЗрд▓ рдЯреНрд░рд╛рдиреНрд╕рдлрд░ рд╕рд┐рд╕реНрдЯрдо, рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдЗ., рдЬреНрдпрд╛ HTTP рд╡рд╛рдкрд░рдд рдирд╛рд╣реАрдд. рдЕрд╢рд╛рдкреНрд░рдХрд╛рд░реЗ, рдЕрдиреЗрдХ DoH рд▓рд╛ рд░рд╛рдордмрд╛рдг рдЙрдкрд╛рдп рдореНрд╣рдгреВрди рд╕рдордЬрдд рдЕрд╕реВрдирд╣реА, рдмреНрд░рд╛рдЙрдЭрд░ рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд рдЗрддрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рдЧреЛрд╖реНрдЯреАрд╕рд╛рдареА рдЕрддрд┐рд░рд┐рдХреНрдд (рдЖрдгрд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ) рдкреНрд░рдпрддреНрдирд╛рдВрд╢рд┐рд╡рд╛рдп рддреЗ рд▓рд╛рдЧреВ рд╣реЛрдд рдирд╛рд╣реА. рддрд╕реЗ, DNS-over-TLS рдпрд╛ рднреВрдорд┐рдХреЗрд╕рд╛рдареА рдЕрдзрд┐рдХ рдпреЛрдЧреНрдп рдЙрдореЗрджрд╡рд╛рд░рд╛рд╕рд╛рд░рдЦреЗ рджрд┐рд╕рддреЗ, рдЬреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рдирдХ TLS рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдордзреНрдпреЗ рдорд╛рдирдХ DNS рд░рд╣рджрд╛рд░реАрдЪреЗ рдПрдиреНрдХреЕрдкреНрд╕реБрд▓реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ.

рджреБрд╕рд░реА рд╕рдорд╕реНрдпрд╛, рдЬреА рд╕рдВрднрд╛рд╡реНрдпрдд: рдкрд╣рд┐рд▓реНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЕрдзрд┐рдХ рд▓рдХреНрд╖рдгреАрдп рдЖрд╣реЗ, рддреА рдореНрд╣рдгрдЬреЗ рдмреНрд░рд╛рдЙрдЭрд░ рд╕реЗрдЯрд┐рдВрдЧреНрдЬрдордзреНрдпреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓рд╛ рдПрдХрдЪ DoH рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдмрд╛рдЬреВрдиреЗ рдбрд┐рдЭрд╛рдЗрдирджреНрд╡рд╛рд░реЗ DNS рдЪреЗ рдореВрд│ рд╡рд┐рдХреЗрдВрджреНрд░реАрдХрд░рдгрд╛рдЪрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрдпрд╛рдЧ рдХрд░рдгреЗ. рд╡рд┐рд╢реЗрд╖рддрдГ, Mozilla Cloudflare рдЪреА рд╕реЗрд╡рд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рд╕реБрдЪрд╡рддреЗ. рдЕрд╢реАрдЪ рд╕реЗрд╡рд╛ рдЗрддрд░ рдкреНрд░рдореБрдЦ рдЗрдВрдЯрд░рдиреЗрдЯ рд╡реНрдпрдХреНрддреАрдВрдиреА, рд╡рд┐рд╢реЗрд╖рддрдГ Google рдиреЗ рджреЗрдЦреАрд▓ рд╕реБрд░реВ рдХреЗрд▓реА рд╣реЛрддреА. рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА рдбреАрдПрдирдПрд╕-рдУрд╡реНрд╣рд░-рдПрдЪрдЯреАрдЯреАрдкреАрдПрд╕рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЬреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рд╕рдзреНрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЖрд╣реЗ рддреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдХреЗрд╡рд│ рдЕрдВрддрд┐рдо рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдЪреЗ рд╕рд░реНрд╡рд╛рдд рдореЛрдареНрдпрд╛ рд╕реЗрд╡рд╛рдВрд╡рд░ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рд╡рд╛рдврд╡рддреЗ. DNS рдкреНрд░рд╢реНрдирд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рджрд╛рди рдХрд░реВ рд╢рдХрдгрд╛рд░реА рдорд╛рд╣рд┐рддреА рддреНрдпрд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдЧреЛрд│рд╛ рдХрд░реВ рд╢рдХрддреЗ, рддрд╕реЗрдЪ рддреНрдпрд╛рдЪреА рдЕрдЪреВрдХрддрд╛ рдЖрдгрд┐ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рд╡рд╛рдврд╡реВ рд╢рдХрддреЗ рд╣реЗ рд░рд╣рд╕реНрдп рдирд╛рд╣реА.

рдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд, рд▓реЗрдЦрдХ рдбреАрдПрдирдПрд╕-рдУрд╡реНрд╣рд░-рдПрдЪрдЯреАрдЯреАрдкреАрдПрд╕рдЪреНрдпрд╛ рдирд╡реНрд╣реЗ рддрд░ рдбреАрдПрдирдПрд╕-рдУрд╡реНрд╣рд░-рдЯреАрдПрд▓рдПрд╕рдЪреНрдпрд╛ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪрд╛ рд╕рдорд░реНрдердХ рд╣реЛрддрд╛ рдЖрдгрд┐ рддреЛ рдПрдХ рд╕рд╛рд░реНрд╡рддреНрд░рд┐рдХ, рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрдгрд┐ рдЗрдВрдЯрд░рдиреЗрдЯрдЪреНрдпрд╛ рдкреБрдвреАрд▓ рдХреЗрдВрджреНрд░реАрдХрд░рдгрд╛рд╕рд╛рдареА рдЕрдиреБрдХреВрд▓ рдирд╛рд╣реА рдореНрд╣рдгреВрди DNSSEC/DANE рд╕реЛрдмрдд рдЖрд╣реЗ. DNS рд░рд╣рджрд╛рд░реАрдЪреА рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА. рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгрд╛рдВрдореБрд│реЗ, рдХреНрд▓рд╛рдпрдВрдЯ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рдордзреНрдпреЗ DoH рдкрд░реНрдпрд╛рдпрд╛рдВрд╕рд╛рдареА рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ рд╕рдорд░реНрдердирд╛рдЪреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рдпреЗрдд рдирд╛рд╣реА рдЖрдгрд┐ рддреЗ рдЕрдЬреВрдирд╣реА рд╕реБрд░рдХреНрд╖рд╛ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдЙрддреНрд╕рд╛рд╣реАрдВрдЪреЗ рдбреЛрдореЗрди рдЖрд╣реЗ.

рдкрд░рдВрддреБ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЖрддрд╛ DoH рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдХреЙрд░реНрдкреЛрд░реЗрд╢рдиреНрд╕рджреНрд╡рд╛рд░реЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рджреНрд╡рд╛рд░реЗ рдЖрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ DNS-over-HTTPS рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд╕рдВрднрд╛рд╡реНрдп рдкрд╛рд│рдд рдареЗрд╡рд▓реНрдпрд╛рдирдВрддрд░ рддреЗ рдХрд╛ рд╡рд╛рдкрд░реВ рдирдпреЗ?

2. DNS-рдУрд╡реНрд╣рд░-HTTPS рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рдкреНрд░рдорд╛рдг рдмрдШрд┐рддрд▓реЗ рддрд░ рдЖрд░рдПрдлрд╕реА 8484 DNS-over-HTTPS рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддрд╛рдирд╛, рддреБрдореНрд╣реА рдкрд╛рд╣реВ рд╢рдХрддрд╛ рдХреА, рддреЗ рдПрдХ рд╡реЗрдм API рдЖрд╣реЗ рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ HTTP/2 рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдордзреНрдпреЗ рдорд╛рдирдХ DNS рдкреЕрдХреЗрдЬ рдПрдиреНрдХреЕрдкреНрд╕реНрдпреБрд▓реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рд╣реЗ рд╡рд┐рд╢реЗрд╖ HTTP рд╢реАрд░реНрд╖рд▓реЗрдЦ, рддрд╕реЗрдЪ рдкреНрд░рд╕рд╛рд░рд┐рдд DNS рдбреЗрдЯрд╛рдЪреНрдпрд╛ рдмрд╛рдпрдирд░реА рд╕реНрд╡рд░реВрдкрд╛рдЪреЗ рд░реВрдкрд╛рдВрддрд░рдг (рдкрд╣рд╛. рдЖрд░рдПрдлрд╕реА 1035 рдЖрдгрд┐ рддреНрдпрд╛рдирдВрддрд░рдЪреЗ рджрд╕реНрддрдРрд╡рдЬ) рдПрдХрд╛ рдлреЙрд░реНрдордордзреНрдпреЗ рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдЖрдгрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕ рддрд╕реЗрдЪ рдЖрд╡рд╢реНрдпрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ.

рдорд╛рдирдХрд╛рдиреБрд╕рд╛рд░, рдлрдХреНрдд HTTP/2 рдЖрдгрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд TLS рдХрдиреЗрдХреНрд╢рди рд╕рдорд░реНрдерд┐рдд рдЖрд╣реЗрдд.

DNS рд╡рд┐рдирдВрддреА рдкрд╛рдард╡рдгреЗ рдорд╛рдирдХ GET рдЖрдгрд┐ POST рдкрджреНрдзрддреА рд╡рд╛рдкрд░реВрди рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рдкрд╣рд┐рд▓реНрдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рд╡рд┐рдирдВрддреАрдЪреЗ рд░реВрдкрд╛рдВрддрд░ рдмреЗрд╕64URL-рдПрдирдХреЛрдб рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧрдордзреНрдпреЗ рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рджреБрд╕рд▒реНрдпрд╛рдордзреНрдпреЗ, рдмрд╛рдпрдирд░реА рд╕реНрд╡рд░реВрдкрд╛рдд POST рд╡рд┐рдирдВрддреАрдЪреНрдпрд╛ рдореБрдЦреНрдп рднрд╛рдЧрд╛рджреНрд╡рд╛рд░реЗ. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, DNS рд╡рд┐рдирдВрддреА рдЖрдгрд┐ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рджрд░рдореНрдпрд╛рди рдПрдХ рд╡рд┐рд╢реЗрд╖ MIME рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ/dns-рд╕рдВрджреЗрд╢.

root@eprove:~ # curl -H 'accept: application/dns-message' 'https://my.domaint/dns-query?dns=q80BAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE' -v
*   Trying 2001:100:200:300::400:443...
* TCP_NODELAY set
* Connected to eprove.net (2001:100:200:300::400) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /usr/local/share/certs/ca-root-nss.crt
  CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=my.domain
*  start date: Jul 22 00:07:13 2019 GMT
*  expire date: Oct 20 00:07:13 2019 GMT
*  subjectAltName: host "my.domain" matched cert's "my.domain"
*  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x801441000)
> GET /dns-query?dns=q80BAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE HTTP/2
> Host: eprove.net
> User-Agent: curl/7.65.3
> accept: application/dns-message
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 200
< server: h2o/2.3.0-beta2
< content-type: application/dns-message
< cache-control: max-age=86274
< date: Thu, 12 Sep 2019 13:07:25 GMT
< strict-transport-security: max-age=15768000; includeSubDomains; preload
< content-length: 45
<
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.
* Failed writing body (0 != 45)
* stopped the pause stream!
* Connection #0 to host eprove.net left intact

рд╢реАрд░реНрд╖рдХрд╛рдХрдбреЗрд╣реА рд▓рдХреНрд╖ рджреНрдпрд╛ рдХреЕрд╢реЗ-рдирд┐рдпрдВрддреНрд░рдг: рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░рдЪреНрдпрд╛ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдд. рдкреЕрд░рд╛рдореАрдЯрд░ рдордзреНрдпреЗ рдХрдорд╛рд▓ рд╡рдп рдкрд░рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ DNS рд░реЗрдХреЙрд░реНрдбрд╕рд╛рдареА TTL рдореВрд▓реНрдп рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ (рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рдВрдЪрд╛ рд╕рдВрдЪ рдкрд░рдд рдХреЗрд▓рд╛ рдЬрд╛рдд рдЕрд╕рд▓реНрдпрд╛рд╕ рдХрд┐рдорд╛рди рдореВрд▓реНрдп).

рд╡рд░реАрд▓ рдЖрдзрд╛рд░рд╛рд╡рд░, DoH рд╕рд░реНрд╡реНрд╣рд░рдЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдордзреНрдпреЗ рдЕрдиреЗрдХ рдЯрдкреНрдкреЗ рдЕрд╕рддрд╛рдд.

  • HTTP рд╡рд┐рдирдВрддреА рдкреНрд░рд╛рдкреНрдд рдХрд░рд╛. рдЬрд░ рд╣реЗ GET рдЕрд╕реЗрд▓ рддрд░ рдмреЗрд╕64URL рдПрдиреНрдХреЛрдбрд┐рдВрдЧрдордзреВрди рдкреЕрдХреЗрдЯ рдбреАрдХреЛрдб рдХрд░рд╛.
  • рд╣реЗ рдкреЕрдХреЗрдЯ DNS рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдкрд╛рдард╡рд╛.
  • DNS рд╕рд░реНрд╡реНрд╣рд░рдХрдбреВрди рдкреНрд░рддрд┐рд╕рд╛рдж рдорд┐рд│рд╡рд╛
  • рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рдиреЛрдВрджреАрдВрдордзреНрдпреЗ рдХрд┐рдорд╛рди рдЯреАрдЯреАрдПрд▓ рдореВрд▓реНрдп рд╢реЛрдзрд╛.
  • HTTP рджреНрд╡рд╛рд░реЗ рдХреНрд▓рд╛рдпрдВрдЯрд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рдкрд░рдд рдХрд░рд╛.

3. рддреБрдордЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ DNS-over-HTTPS рд╕рд░реНрд╡реНрд╣рд░

рддреБрдордЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ DNS-over-HTTPS рд╕рд░реНрд╡реНрд╣рд░ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛, рдЬрд▓рдж рдЖрдгрд┐ рдкреНрд░рднрд╛рд╡реА рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ HTTP/2 рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░рдгреЗ H2O, рдЬреНрдпрд╛рдмрджреНрджрд▓ рд▓реЗрдЦрдХрд╛рдиреЗ рдЖрдзреАрдЪ рдереЛрдбрдХреНрдпрд╛рдд рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ (рдкрд╣рд╛ "рдЙрдЪреНрдЪ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ H2O рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░).

рд╣реА рдирд┐рд╡рдб рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрджреНрд╡рд╛рд░реЗ рд╕рдорд░реНрдерд┐рдд рдЖрд╣реЗ рдХреА рдЖрдкрд▓реНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ DoH рд╕рд░реНрд╡реНрд╣рд░рдЪреЗ рд╕рд░реНрд╡ рдХреЛрдб H2O рдордзреНрдпреЗрдЪ рд╕рдорд╛рдХрд▓рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рджреБрднрд╛рд╖реНрдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рдкреВрд░реНрдгрдкрдгреЗ рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд. mruby. рдорд╛рдирдХ рд▓рд╛рдпрдмреНрд░рд░реА рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, DNS рд╕рд░реНрд╡реНрд╣рд░рд╕рд╣ рдбреЗрдЯрд╛рдЪреА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ (mrbgem) рд╕реЙрдХреЗрдЯ рд▓рд╛рдпрдмреНрд░рд░реАрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ, рдЬреА рд╕реБрджреИрд╡рд╛рдиреЗ, H2O 2.3.0-beta2 рдЪреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдХрд╛рд╕ рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ. рдЙрдкрд╕реНрдерд┐рдд рдлреНрд░реАрдмреАрдПрд╕рдбреА рдкреЛрд░реНрдЯрдордзреНрдпреЗ. рддрдерд╛рдкрд┐, рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдХреНрд▓реЛрдирд┐рдВрдЧ рдХрд░реВрди рддреЗ рдХреЛрдгрддреНрдпрд╛рд╣реА рдорд╛рдЧреАрд▓ рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ рдЬреЛрдбрдгреЗ рдХрдареАрдг рдирд╛рд╣реА рд╕реЙрдХреЗрдЯ рд▓рд╛рдпрдмреНрд░рд░реА рдХреЕрдЯрд▓реЙрдЧ рд╡рд░ /deps рд╕рдВрдХрд▓рди рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА.

root@beta:~ # uname -v
FreeBSD 12.0-RELEASE-p10 GENERIC
root@beta:~ # cd /usr/ports/www/h2o
root@beta:/usr/ports/www/h2o # make extract
===>  License MIT BSD2CLAUSE accepted by the user
===>   h2o-2.2.6 depends on file: /usr/local/sbin/pkg - found
===> Fetching all distfiles required by h2o-2.2.6 for building
===>  Extracting for h2o-2.2.6.
=> SHA256 Checksum OK for h2o-h2o-v2.2.6_GH0.tar.gz.
===>   h2o-2.2.6 depends on file: /usr/local/bin/ruby26 - found
root@beta:/usr/ports/www/h2o # cd work/h2o-2.2.6/deps/
root@beta:/usr/ports/www/h2o/work/h2o-2.2.6/deps # git clone https://github.com/iij/mruby-socket.git
╨Ъ╨╗╨╛╨╜╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨▓ ┬лmruby-socket┬╗тАж
remote: Enumerating objects: 385, done.
remote: Total 385 (delta 0), reused 0 (delta 0), pack-reused 385
╨Я╨╛╨╗╤Г╤З╨╡╨╜╨╕╨╡ ╨╛╨▒╤К╨╡╨║╤В╨╛╨▓: 100% (385/385), 98.02 KiB | 647.00 KiB/s, ╨│╨╛╤В╨╛╨▓╨╛.
╨Ю╨┐╤А╨╡╨┤╨╡╨╗╨╡╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╨╣: 100% (208/208), ╨│╨╛╤В╨╛╨▓╨╛.
root@beta:/usr/ports/www/h2o/work/h2o-2.2.6/deps # ll
total 181
drwxr-xr-x   9 root  wheel  18 12 ╨░╨▓╨│.  16:09 brotli/
drwxr-xr-x   2 root  wheel   4 12 ╨░╨▓╨│.  16:09 cloexec/
drwxr-xr-x   2 root  wheel   5 12 ╨░╨▓╨│.  16:09 golombset/
drwxr-xr-x   4 root  wheel  35 12 ╨░╨▓╨│.  16:09 klib/
drwxr-xr-x   2 root  wheel   5 12 ╨░╨▓╨│.  16:09 libgkc/
drwxr-xr-x   4 root  wheel  26 12 ╨░╨▓╨│.  16:09 libyrmcds/
drwxr-xr-x  13 root  wheel  32 12 ╨░╨▓╨│.  16:09 mruby/
drwxr-xr-x   5 root  wheel  11 12 ╨░╨▓╨│.  16:09 mruby-digest/
drwxr-xr-x   5 root  wheel  10 12 ╨░╨▓╨│.  16:09 mruby-dir/
drwxr-xr-x   5 root  wheel  10 12 ╨░╨▓╨│.  16:09 mruby-env/
drwxr-xr-x   4 root  wheel   9 12 ╨░╨▓╨│.  16:09 mruby-errno/
drwxr-xr-x   5 root  wheel  14 12 ╨░╨▓╨│.  16:09 mruby-file-stat/
drwxr-xr-x   5 root  wheel  10 12 ╨░╨▓╨│.  16:09 mruby-iijson/
drwxr-xr-x   5 root  wheel  11 12 ╨░╨▓╨│.  16:09 mruby-input-stream/
drwxr-xr-x   6 root  wheel  11 12 ╨░╨▓╨│.  16:09 mruby-io/
drwxr-xr-x   5 root  wheel  10 12 ╨░╨▓╨│.  16:09 mruby-onig-regexp/
drwxr-xr-x   4 root  wheel  10 12 ╨░╨▓╨│.  16:09 mruby-pack/
drwxr-xr-x   5 root  wheel  10 12 ╨░╨▓╨│.  16:09 mruby-require/
drwxr-xr-x   6 root  wheel  10 12 ╤Б╨╡╨╜╤В. 16:10 mruby-socket/
drwxr-xr-x   2 root  wheel   9 12 ╨░╨▓╨│.  16:09 neverbleed/
drwxr-xr-x   2 root  wheel  13 12 ╨░╨▓╨│.  16:09 picohttpparser/
drwxr-xr-x   2 root  wheel   4 12 ╨░╨▓╨│.  16:09 picotest/
drwxr-xr-x   9 root  wheel  16 12 ╨░╨▓╨│.  16:09 picotls/
drwxr-xr-x   4 root  wheel   8 12 ╨░╨▓╨│.  16:09 ssl-conservatory/
drwxr-xr-x   8 root  wheel  18 12 ╨░╨▓╨│.  16:09 yaml/
drwxr-xr-x   2 root  wheel   8 12 ╨░╨▓╨│.  16:09 yoml/
root@beta:/usr/ports/www/h2o/work/h2o-2.2.6/deps # cd ../../..
root@beta:/usr/ports/www/h2o # make install clean
...

рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ рдорд╛рдирдХ рдЕрд╕рддреЗ.

root@beta:/usr/ports/www/h2o #  cd /usr/local/etc/h2o/
root@beta:/usr/local/etc/h2o # cat h2o.conf
# this sample config gives you a feel for how h2o can be used
# and a high-security configuration for TLS and HTTP headers
# see https://h2o.examp1e.net/ for detailed documentation
# and h2o --help for command-line options and settings

# v.20180207 (c)2018 by Max Kostikov http://kostikov.co e-mail: [email protected]

user: www
pid-file: /var/run/h2o.pid
access-log:
    path: /var/log/h2o/h2o-access.log
    format: "%h %v %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i""
error-log: /var/log/h2o/h2o-error.log

expires: off
compress: on
file.dirlisting: off
file.send-compressed: on

file.index: [ 'index.html', 'index.php' ]

listen:
    port: 80
listen:
    port: 443
    ssl:
        cipher-suite: ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
        cipher-preference: server
        dh-file: /etc/ssl/dhparams.pem
        certificate-file: /usr/local/etc/letsencrypt/live/eprove.net/fullchain.pem
        key-file: /usr/local/etc/letsencrypt/live/my.domain/privkey.pem

hosts:
    "*.my.domain":
        paths: &go_tls
            "/":
                redirect:
                    status: 301
                    url: https://my.domain/
    "my.domain:80":
        paths: *go_tls
    "my.domain:443":
        header.add: "Strict-Transport-Security: max-age=15768000; includeSubDomains; preload"
        paths:
            "/dns-query":
               mruby.handler-file: /usr/local/etc/h2o/h2odoh.rb

рдЕрдкрд╡рд╛рдж рдлрдХреНрдд URL рд╣рдБрдбрд▓рд░ рдЖрд╣реЗ /dns-query рдЬреНрдпрд╛рд╕рд╛рдареА рдЖрдордЪрд╛ DNS-over-HTTPS рд╕рд░реНрд╡реНрд╣рд░, mruby рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдЖрдгрд┐ рд╣рдБрдбрд▓рд░ рдкрд░реНрдпрд╛рдпрд╛рджреНрд╡рд╛рд░реЗ рдХреЙрд▓ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рддреЛ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдЬрдмрд╛рдмрджрд╛рд░ рдЖрд╣реЗ mruby.handler-file.

root@beta:/usr/local/etc/h2o # cat h2odoh.rb
# H2O HTTP/2 web server as DNS-over-HTTP service
# v.20190908 (c)2018-2019 Max Kostikov https://kostikov.co e-mail: [email protected]

proc {|env|
    if env['HTTP_ACCEPT'] == "application/dns-message"
        case env['REQUEST_METHOD']
            when "GET"
                req = env['QUERY_STRING'].gsub(/^dns=/,'')
                # base64URL decode
                req = req.tr("-_", "+/")
                if !req.end_with?("=") && req.length % 4 != 0
                    req = req.ljust((req.length + 3) & ~3, "=")
                end
                req = req.unpack1("m")
            when "POST"
                req = env['rack.input'].read
            else
                req = ""
        end
        if req.empty?
            [400, { 'content-type' => 'text/plain' }, [ "Bad Request" ]]
        else
            # --- ask DNS server
            sock = UDPSocket.new
            sock.connect("localhost", 53)
            sock.send(req, 0)
            str = sock.recv(4096)
            sock.close
            # --- find lowest TTL in response
            nans = str[6, 2].unpack1('n') # number of answers
            if nans > 0 # no DNS failure
                shift = 12
                ttl = 0
                while nans > 0
                    # process domain name compression
                    if str[shift].unpack1("C") < 192
                        shift = str.index("x00", shift) + 5
                        if ttl == 0 # skip question section
                            next
                        end
                    end
                    shift += 6
                    curttl = str[shift, 4].unpack1('N')
                    shift += str[shift + 4, 2].unpack1('n') + 6 # responce data size
                    if ttl == 0 or ttl > curttl
                        ttl = curttl
                    end
                    nans -= 1
                 end
                 cc = 'max-age=' + ttl.to_s
            else
                 cc = 'no-cache'
            end
            [200, { 'content-type' => 'application/dns-message', 'content-length' => str.size, 'cache-control' => cc }, [ str ] ]
        end
    else
        [415, { 'content-type' => 'text/plain' }, [ "Unsupported Media Type" ]]
    end
}

рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рд╕реНрдерд╛рдирд┐рдХ рдХреЕрд╢рд┐рдВрдЧ рд╕рд░реНрд╡реНрд╣рд░ рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд DNS рдкреЕрдХреЗрдЯрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬрдмрд╛рдмрджрд╛рд░ рдЖрд╣реЗ рдЕрдирдмрд╛рдЙрдВрдб рдорд╛рдирдХ рдлреНрд░реАрдмреАрдПрд╕рдбреА рд╡рд┐рддрд░рдгрд╛рддреВрди. рд╕реБрд░рдХреНрд╖реЗрдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди, рд╣рд╛ рдЗрд╖реНрдЯрддрдо рдЙрдкрд╛рдп рдЖрд╣реЗ. рддрдерд╛рдкрд┐, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдмрджрд▓рдгреНрдпрд╛рдкрд╛рд╕реВрди рдХрд╛рд╣реАрд╣реА рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдд рдирд╛рд╣реА localhost рддреБрдореНрд╣реА рд╡рд╛рдкрд░реВ рдЗрдЪреНрдЫрд┐рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡реЗрдЧрд│реНрдпрд╛ DNS рдкрддреНрддреНрдпрд╛рд╡рд░.

root@beta:/usr/local/etc/h2o # local-unbound verison
usage:  local-unbound [options]
        start unbound daemon DNS resolver.
-h      this help
-c file config file to read instead of /var/unbound/unbound.conf
        file format is described in unbound.conf(5).
-d      do not fork into the background.
-p      do not create a pidfile.
-v      verbose (more times to increase verbosity)
Version 1.8.1
linked libs: mini-event internal (it uses select), OpenSSL 1.1.1a-freebsd  20 Nov 2018
linked modules: dns64 respip validator iterator
BSD licensed, see LICENSE in source package for details.
Report bugs to [email protected]
root@eprove:/usr/local/etc/h2o # sockstat -46 | grep unbound
unbound  local-unbo 69749 3  udp6   ::1:53                *:*
unbound  local-unbo 69749 4  tcp6   ::1:53                *:*
unbound  local-unbo 69749 5  udp4   127.0.0.1:53          *:*
unbound  local-unbo 69749 6  tcp4   127.0.0.1:53          *:*

рдмрд╛рдХреА рдлрдХреНрдд H2O рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ рддреНрдпрд╛рддреВрди рдХрд╛рдп рд╣реЛрддреЗ рддреЗ рдкрд╣рд╛.

root@beta:/usr/local/etc/h2o # service h2o restart
Stopping h2o.
Waiting for PIDS: 69871.
Starting h2o.
start_server (pid:70532) starting now...

4. рдЪрд╛рдЪрдгреА

рддрд░, рдкреБрдиреНрд╣рд╛ рдЪрд╛рдЪрдгреА рд╡рд┐рдирдВрддреА рдкрд╛рдард╡реВрди рдЖрдгрд┐ рдпреБрдЯрд┐рд▓рд┐рдЯреА рд╡рд╛рдкрд░реВрди рдиреЗрдЯрд╡рд░реНрдХ рд░рд╣рджрд╛рд░реА рдкрд╛рд╣реВрди рдирд┐рдХрд╛рд▓ рддрдкрд╛рд╕реВрдпрд╛ tcpdump.

root@beta/usr/local/etc/h2o # curl -H 'accept: application/dns-message' 'https://my.domain/dns-query?dns=q80BAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE'
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.
...
root@beta:~ # tcpdump -n -i lo0 udp port 53 -xx -XX -vv
tcpdump: listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
16:32:40.420831 IP (tos 0x0, ttl 64, id 37575, offset 0, flags [none], proto UDP (17), length 57, bad cksum 0 (->e9ea)!)
    127.0.0.1.21070 > 127.0.0.1.53: [bad udp cksum 0xfe38 -> 0x33e3!] 43981+ A? example.com. (29)
        0x0000:  0200 0000 4500 0039 92c7 0000 4011 0000  ....E..9....@...
        0x0010:  7f00 0001 7f00 0001 524e 0035 0025 fe38  ........RN.5.%.8
        0x0020:  abcd 0100 0001 0000 0000 0000 0765 7861  .............exa
        0x0030:  6d70 6c65 0363 6f6d 0000 0100 01         mple.com.....
16:32:40.796507 IP (tos 0x0, ttl 64, id 37590, offset 0, flags [none], proto UDP (17), length 73, bad cksum 0 (->e9cb)!)
    127.0.0.1.53 > 127.0.0.1.21070: [bad udp cksum 0xfe48 -> 0x43fa!] 43981 q: A? example.com. 1/0/0 example.com. A 93.184.216.34 (45)
        0x0000:  0200 0000 4500 0049 92d6 0000 4011 0000  ....E..I....@...
        0x0010:  7f00 0001 7f00 0001 0035 524e 0035 fe48  .........5RN.5.H
        0x0020:  abcd 8180 0001 0001 0000 0000 0765 7861  .............exa
        0x0030:  6d70 6c65 0363 6f6d 0000 0100 01c0 0c00  mple.com........
        0x0040:  0100 0100 0151 8000 045d b8d8 22         .....Q...].."
^C
2 packets captured
23 packets received by filter
0 packets dropped by kernel

рдЖрдЙрдЯрдкреБрдЯ рдкрддреНрддреНрдпрд╛рдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдЪреА рд╡рд┐рдирдВрддреА рдХрд╢реА рджрд░реНрд╢рд╡рддреЗ Example.com DNS рд╕рд░реНрд╡реНрд╣рд░рджреНрд╡рд╛рд░реЗ рдкреНрд░рд╛рдкреНрдд рдЖрдгрд┐ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реА рдЧреЗрд▓реА.

рдЖрддрд╛ рдлрдХреНрдд рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рдЖрдордЪреЗ рд╕рд░реНрд╡реНрд╣рд░ рд╕рдХреНрд░рд┐рдп рдХрд░рдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреГрд╖реНрдард╛рдВрд╡рд░ рдЕрдиреЗрдХ рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рдмрджрд▓рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ about: config.

рдЖрдореНрд╣реА рдЖрдордЪрд╛ DNS-over-HTTPS рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдврд╡рддреЛ

рдкреНрд░рдердо, рд╣рд╛ рдЖрдордЪреНрдпрд╛ API рдЪрд╛ рдкрддреНрддрд╛ рдЖрд╣реЗ рдЬреНрдпрд╛рд╡рд░ рдмреНрд░рд╛рдЙрдЭрд░ DNS рдорд╛рд╣рд┐рддреАрдЪреА рд╡рд┐рдирдВрддреА рдХрд░реЗрд▓ network.trr.uri. DNS рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рди рдХрд░рддрд╛ рдмреНрд░рд╛рдЙрдЭрд░рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рд╕реБрд░рдХреНрд╖рд┐рдд IP рд░рд┐рдЭреЛрд▓реНрдпреВрд╢рдирд╕рд╛рдареА рдпрд╛ URL рд╡рд░реВрди рдбреЛрдореЗрди IP рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рджреЗрдЦреАрд▓ рд╢рд┐рдлрд╛рд░рд╕ рдХреЗрд▓реА рдЬрд╛рддреЗ network.trr.bootstrapAddress. рдЖрдгрд┐ рд╢реЗрд╡рдЯреА, рдкреЕрд░рд╛рдореАрдЯрд░ рд╕реНрд╡рддрдГ network.trr.mode DoH рдЪреНрдпрд╛ рд╡рд╛рдкрд░рд╛рд╕рд╣. рдореВрд▓реНрдп "3" рд╡рд░ рд╕реЗрдЯ рдХреЗрд▓реНрдпрд╛рдиреЗ рдмреНрд░рд╛рдЙрдЭрд░рд▓рд╛ рдирд╛рд╡ рд░рд┐рдЭреЛрд▓реНрдпреВрд╢рдирд╕рд╛рдареА рдХреЗрд╡рд│ DNS-over-HTTPS рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рднрд╛рдЧ рдкрд╛рдбрд▓реЗ рдЬрд╛рдИрд▓, рддрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдЖрдгрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд "2" DoH рд▓рд╛ рдкреНрд░рд╛рдзрд╛рдиреНрдп рджреЗрдИрд▓, рдлреЙрд▓рдмреЕрдХ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгреВрди рдорд╛рдирдХ DNS рд▓реБрдХрдЕрдк рд╕реЛрдбреВрди рджреЗрдИрд▓.

5. рдирдлрд╛!

рд▓реЗрдЦ рдЙрдкрдпреБрдХреНрдд рд╣реЛрддрд╛ рдХрд╛? рдордЧ рдХреГрдкрдпрд╛ рд▓рд╛рдЬреВ рдирдХрд╛ рдЖрдгрд┐ рджреЗрдгрдЧреА рдлреЙрд░реНрдорджреНрд╡рд╛рд░реЗ (рдЦрд╛рд▓реА) рдкреИрд╢рд╛рдЪреЗ рд╕рдорд░реНрдерди рдХрд░рд╛.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛