рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ DNS-over-HTTPS рд╕рд░реНрднрд░ рдмрдврд╛рдЙрдБрдЫреМрдВ

DNS рд╕рдЮреНрдЪрд╛рд▓рдирдХрд╛ рд╡рд┐рднрд┐рдиреНрди рдкрдХреНрд╖рд╣рд░реВ рдкрд╣рд┐рд▓реЗ рдиреИ рдзреЗрд░реИ рдкрдЯрдХ рд▓реЗрдЦрдХрджреНрд╡рд╛рд░рд╛ рдмрд╛рд░рдореНрдмрд╛рд░ рдЫреЛрдЗрдПрдХрд╛ рдЫрдиреН рд▓реЗрдЦрд╣рд░реВ рдмреНрд▓рдЧ рдХреЛ рднрд╛рдЧ рдХреЛ рд░реВрдк рдорд╛ рдкреНрд░рдХрд╛рд╢рд┐рддред рдПрдХреИ рд╕рдордпрдорд╛, рдореБрдЦреНрдп рдЬреЛрдб рд╕рдзреИрдВ рдпрд╕ рдкреНрд░рдореБрдЦ рдЗрдиреНрдЯрд░рдиреЗрдЯ рд╕реЗрд╡рд╛рдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдзрд╛рд░ рдЧрд░реНрди рд░рд╣реЗрдХреЛ рдЫред

рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ DNS-over-HTTPS рд╕рд░реНрднрд░ рдмрдврд╛рдЙрдБрдЫреМрдВ

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

рд╕реМрднрд╛рдЧреНрдп рджреЗрдЦрд┐, рд╕реНрдерд┐рддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдБрджреИрдЫред рд╡рд┐рд╢реЗрд╖ рдЧрд░реА, рд▓реЛрдХрдкреНрд░рд┐рдп рдлрд╛рдпрд░рдлрдХреНрд╕ рдмреНрд░рд╛рдЙрдЬрд░ рдХреЛ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдмрддрд╛рдП рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рд╕рдорд░реНрдерди рдореЛрдб рд╕рдХреНрд╖рдо рдЧрд░реНрдиреЗ рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ DNS-over-HTTPS (DoH) рдЪрд╛рдБрдбреИред рдпрд╕рд▓реЗ WWW рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ DNS рдЯреНрд░рд╛рдлрд┐рдХрд▓рд╛рдИ рдорд╛рдерд┐рдХрд╛ рдЦрддрд░рд╛рд╣рд░реВрдмрд╛рдЯ рдЬреЛрдЧрд╛рдЙрди рдорджреНрджрдд рдЧрд░реНрдиреБрдкрд░реНрдЫ, рддрд░ рд╕рдореНрднрд╛рд╡рд┐рдд рд░реВрдкрдорд╛ рдирдпрд╛рдБрд╣рд░реВ рдкрд░рд┐рдЪрдп рдЧрд░рд╛рдЙрди рд╕рдХреНрдЫред

1. DNS-over-HTTPS рд╕рдорд╕реНрдпрд╛рд╣рд░реВ

рдкрд╣рд┐рд▓реЛ рдирдЬрд░рдорд╛, рдЗрдиреНрдЯрд░рдиреЗрдЯ рд╕рдлреНрдЯрд╡реЗрдпрд░рдорд╛ DNS-over-HTTPS рдХреЛ рд╢реБрд░реБрд╡рд╛рддреА рд╕рд╛рдореВрд╣рд┐рдХ рдкрд░рд┐рдЪрдпрд▓реЗ рдорд╛рддреНрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рдореНрддреНрдпрд╛рдЙрдБрдЫред рдпрджреНрдпрдкрд┐, рд╢реИрддрд╛рди, рддрд┐рдиреАрд╣рд░реВрд▓реЗ рднрдиреЗ, рд╡рд┐рд╡рд░рдгрд╣рд░реВрдорд╛ рдЫред

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

рджреЛрд╕реНрд░реЛ рд╕рдорд╕реНрдпрд╛, рдЬреБрди рд╕рдореНрднрд╛рд╡рд┐рдд рд░реВрдкрдорд╛ рдкрд╣рд┐рд▓реЛ рднрдиреНрджрд╛ рдзреЗрд░реИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ, рдмреНрд░рд╛рдЙрдЬрд░ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдПрдХрд▓ DoH рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкрдХреНрд╖рдорд╛ рдбрд┐рдЬрд╛рдЗрдирджреНрд╡рд╛рд░рд╛ DNS рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХрд░рдгрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рддреНрдпрд╛рдЧ рд╣реЛред рд╡рд┐рд╢реЗрд╖ рдЧрд░реА, рдореЛрдЬрд┐рд▓рд╛рд▓реЗ рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЗрдпрд░рдмрд╛рдЯ рд╕реЗрд╡рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕реБрдЭрд╛рд╡ рджрд┐рдиреНрдЫред рдпрд╕реНрддреИ рд╕реЗрд╡рд╛ рдЕрдиреНрдп рдкреНрд░рдЦреНрдпрд╛рдд рдЗрдиреНрдЯрд░рдиреЗрдЯ рд╡реНрдпрдХреНрддрд┐рддреНрд╡рд╣рд░реВ, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА Google рджреНрд╡рд╛рд░рд╛ рдкрдирд┐ рд╕реБрд░реБ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред рдпреЛ рдмрд╛рд╣рд┐рд░ рдирд┐рд╕реНрдХрдиреНрдЫ рдХрд┐ DNS-over-HTTPS рдХреЛ рд░реВрдк рдорд╛ рдпреЛ рд╣рд╛рд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд▓реЗ рдорд╛рддреНрд░ рд╕рдмреИрднрдиреНрджрд╛ рдареВрд▓реЛ рд╕реЗрд╡рд╛рд╣рд░реВрдорд╛ рдЕрдиреНрдд рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдмрдврд╛рдЙрдБрдЫред рдпреЛ рдХреБрдиреИ рдЧреЛрдкреНрдп рдХреБрд░рд╛ рдЫреИрди рдХрд┐ DNS рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд▓реЗ рдкреНрд░рджрд╛рди рдЧрд░реНрди рд╕рдХреНрдиреЗ рдЬрд╛рдирдХрд╛рд░реАрд▓реЗ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдЕрдЭ рдмрдвреА рдбрд╛рдЯрд╛ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрди рд╕рдХреНрдЫ, рд╕рд╛рдереИ рдпрд╕рдХреЛ рд╢реБрджреНрдзрддрд╛ рд░ рд╕рд╛рдиреНрджрд░реНрднрд┐рдХрддрд╛ рдмрдврд╛рдЙрди рд╕рдХреНрдЫред

рдпрд╕ рд╕рдиреНрджрд░реНрднрдорд╛, рд▓реЗрдЦрдХ DNS-over-HTTPS рдХреЛ рд╣реЛрдЗрди, рддрд░ DNS-over-TLS рдХреЛ DNSSEC/DANE рд╕рдБрдЧ рдПрдХ рд╡рд┐рд╢реНрд╡рд╡реНрдпрд╛рдкреА, рд╕реБрд░рдХреНрд╖рд┐рдд рд░ рдЗрдиреНрдЯрд░рдиреЗрдЯ рдорд╛рдзреНрдпрдордХреЛ рдердк рдХреЗрдиреНрджреНрд░реАрдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреБрдХреВрд▓ рдирднрдПрдХреЛ рд░реВрдкрдорд╛ рд╡реНрдпрд╛рдкрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд╕рдорд░реНрдердХ рдерд┐рдП рд░ рдЫрдиреНред DNS рдпрд╛рддрд╛рдпрд╛рдд рдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреАред рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐, рдЧреНрд░рд╛рд╣рдХ рд╕рдлреНрдЯрд╡реЗрдпрд░рдорд╛ DoH рд╡рд┐рдХрд▓реНрдкрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдореВрд╣рд┐рдХ рд╕рдорд░реНрдердирдХреЛ рджреНрд░реБрдд рдкрд░рд┐рдЪрдпрдХреЛ рдЖрд╢рд╛ рдЧрд░реНрди рд╕рдХреНрджреИрди, рд░ рдпреЛ рдЕрдЭреИ рдкрдирд┐ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рд╡рд┐рдзрд┐ рдЙрддреНрд╕рд╛рд╣реАрд╣рд░реВрдХреЛ рдбреЛрдореЗрди рд╣реЛред

рддрд░ рд╣рд╛рдореАрд╕рдБрдЧ рдЕрдм DoH рдЫ, рдирд┐рдЧрдорд╣рд░реВрд▓реЗ рдЙрдиреАрд╣рд░реВрдХреЛ рд╕рд░реНрднрд░рд╣рд░реВ рдорд╛рд░реНрдлрдд рд╣рд╛рдореНрд░реЛ рдЖрдлреНрдиреИ DNS-over-HTTPS рд╕рд░реНрднрд░рдорд╛ рд╕рдореНрднрд╛рд╡рд┐рдд рдирд┐рдЧрд░рд╛рдиреАрдмрд╛рдЯ рднрд╛рдЧреЗрд░ рдХрд┐рди рдпрд╕рд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ рдирдЧрд░реНрдиреЗ?

2. DNS-over-HTTPS рдкреНрд░реЛрдЯреЛрдХрд▓

рдорд╛рдкрджрдгреНрдб рд╣реЗрд░реНрдиреЗ рд╣реЛ рднрдиреЗ RFC8484 DNS-over-HTTPS рдкреНрд░реЛрдЯреЛрдХрд▓рдХреЛ рд╡рд░реНрдгрди рдЧрд░реНрджреИ, рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдХрд┐ рдпреЛ, рд╡рд╛рд╕реНрддрд╡рдорд╛, рдПрдХ рд╡реЗрдм рдПрдкреАрдЖрдИ рд╣реЛ рдЬрд╕рд▓реЗ рддрдкрд╛рдЗрдБрд▓рд╛рдИ HTTP/2 рдкреНрд░реЛрдЯреЛрдХрд▓рдорд╛ рдорд╛рдирдХ DNS рдкреНрдпрд╛рдХреЗрдЬ рдЗрдиреНрдХреНрдпрд╛рдкреНрд╕реБрд▓реЗрдЯ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдпреЛ рд╡рд┐рд╢реЗрд╖ HTTP рд╣реЗрдбрд░рд╣рд░реВ рдорд╛рд░реНрдлрдд рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫ, рд╕рд╛рдереИ рдкреНрд░рд╕рд╛рд░рд┐рдд DNS рдбрд╛рдЯрд╛рдХреЛ рдмрд╛рдЗрдирд░реА рдврд╛рдБрдЪрд╛рдХреЛ рд░реВрдкрд╛рдиреНрддрд░рдг (рд╣реЗрд░реНрдиреБрд╣реЛрд╕реНред RFC1035 рд░ рддреНрдпрд╕рдкрдЫрд┐рдХрд╛ рдХрд╛рдЧрдЬрд╛рддрд╣рд░реВ) рдПрдХ рдлрд╛рд░рдордорд╛ рдЬреБрди рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреНрд░рд╕рд╛рд░рдг рдЧрд░реНрди рд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ, рд╕рд╛рдереИ рдЖрд╡рд╢реНрдпрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджрдЫред

рдорд╛рдирдХ рдЕрдиреБрд╕рд╛рд░, рдХреЗрд╡рд▓ 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 рд╕рд░реНрднрд░рдмрд╛рдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН
  • рдкреНрд░рд╛рдкреНрдд рд░реЗрдХрд░реНрдбрд╣рд░реВрдорд╛ рдиреНрдпреВрдирддрдо TTL рдорд╛рди рдлреЗрд▓рд╛ рдкрд╛рд░реНрдиреБрд╣реЛрд╕реНред
  • HTTP рдорд╛рд░реНрдлрдд рдЧреНрд░рд╛рд╣рдХрд▓рд╛рдИ рдЬрд╡рд╛рдл рдлрд░реНрдХрд╛рдЙрдиреБрд╣реЛрд╕реНред

3. рддрдкрд╛рдИрдВрдХреЛ рдЖрдлреНрдиреИ DNS-over-HTTPS рд╕рд░реНрднрд░

рддрдкрд╛рдИрдХреЛ рдЖрдлреНрдиреИ DNS-over-HTTPS рд╕рд░реНрднрд░ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рд░рд▓, рдЫрд┐рдЯреЛ рд░ рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рддрд░рд┐рдХрд╛ HTTP/2 рд╡реЗрдм рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рд╣реЛред H2O, рдЬрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рд▓реЗрдЦрдХрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдкрдорд╛ рд▓реЗрдЦреЗрдХрд╛ рдЫрдиреН (рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН "рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди H2O рд╡реЗрдм рд╕рд░реНрднрд░┬л)ред

рдпреЛ рдЫрдиреЛрдЯ рдпрд╕ рддрдереНрдпрджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдЫ рдХрд┐ рддрдкрд╛рдИрдХреЛ рдЖрдлреНрдиреИ DoH рд╕рд░реНрднрд░рдХреЛ рд╕рдмреИ рдХреЛрдб H2O рдорд╛ рдПрдХреАрдХреГрдд рдЕрдиреБрд╡рд╛рджрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред mrubyред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд, DNS рд╕рд░реНрднрд░рд╕рдБрдЧ рдбрд╛рдЯрд╛ рдЖрджрд╛рдирдкреНрд░рджрд╛рди рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓рд╛рдИ (mrbgem) рд╕рдХреЗрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЪрд╛рд╣рд┐рдиреНрдЫ, рдЬреБрди, рд╕реМрднрд╛рдЧреНрдпрд╡рд╢, H2O 2.3.0-beta2 рдХреЛ рд╣рд╛рд▓рдХреЛ рд╡рд┐рдХрд╛рд╕ рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░рд┐рдПрдХреЛ рдЫред рд╡рд░реНрддрдорд╛рди FreeBSD рдкреЛрд░реНрдЯрд╣рд░реВрдорд╛ред рдпрджреНрдпрдкрд┐, рднрдгреНрдбрд╛рд░ рдХреНрд▓реЛрди рдЧрд░реЗрд░ рдпрд╕рд▓рд╛рдИ рдЕрдШрд┐рд▓реНрд▓реЛ рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рдердкреНрди рдЧрд╛рд╣реНрд░реЛ рдЫреИрди рд╕рдХреЗрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рд╕реВрдЪреАрдорд╛ /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 рдкреНрдпрд╛рдХреЗрдЯрд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрди рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫ рдирдмрд╛рдБрдзрд┐рдПрдХреЛ рдорд╛рдирдХ FreeBSD рд╡рд┐рддрд░рдгрдмрд╛рдЯред рд╕реБрд░рдХреНрд╖рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ, рдпреЛ рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рди рд╣реЛред рдпрджреНрдпрдкрд┐, рдХреБрдиреИ рдкрдирд┐ рдХреБрд░рд╛рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрдирдмрд╛рдЯ рд░реЛрдХреНрджреИрди рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЪрд╛рд╣рдиреБрднрдПрдХреЛ рдлрд░рдХ 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 рд╕рд░реНрднрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╢реЛрдзрди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред

рдЕрдм рдмрд╛рдБрдХреА рд╕рдмреИ рдлрд╛рдпрд░рдлрдХреНрд╕ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рд╣рд╛рдореНрд░реЛ рд╕рд░реНрднрд░ рд╕рдХреНрд░рд┐рдп рдЧрд░реНрди рд╣реЛред рдпреЛ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреГрд╖реНрдард╣рд░реВрдорд╛ рдзреЗрд░реИ рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдмрд╛рд░реЗрдорд╛: рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН.

рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ DNS-over-HTTPS рд╕рд░реНрднрд░ рдмрдврд╛рдЙрдБрдЫреМрдВ

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

5. рд▓рд╛рдн!

рд▓реЗрдЦ рдЙрдкрдпреЛрдЧреА рдерд┐рдпреЛ? рддреНрдпрд╕реЛрднрдП рдХреГрдкрдпрд╛ рд▓рд╛рдЬ рдирдорд╛рдиреНрдиреБрд╣реЛрд╕реН рд░ рджрд╛рди рдлрд╛рд░рдо (рддрд▓) рдорд╛рд░реНрдлрдд рдкреИрд╕рд╛рдХреЛ рд╕рд╛рде рд╕рд╣рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН ред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди