From 2d01ed8a042ce3b0aea8c9ce7ed9de9a7dc68a2e Mon Sep 17 00:00:00 2001 From: Nick Peng Date: Sat, 30 Mar 2019 20:10:27 +0800 Subject: [PATCH] Support DNS Over HTTPS --- ReadMe.md | 5 +- ReadMe_zh-CN.md | 5 +- doc/architecture.png | Bin 82613 -> 77456 bytes doc/architecture.vsdx | Bin 27070 -> 27467 bytes etc/smartdns/smartdns.conf | 6 + .../luci/model/cbi/smartdns/smartdns.lua | 6 +- .../luci/model/cbi/smartdns/upstream.lua | 11 +- package/openwrt/control/postinst | 13 + package/openwrt/files/etc/init.d/smartdns | 8 +- src/Makefile | 2 +- src/dns_client.c | 290 +++++++++--- src/dns_client.h | 34 +- src/dns_conf.c | 30 +- src/dns_conf.h | 7 + src/dns_server.c | 114 ++++- src/dns_server.h | 8 + src/http_parse.c | 445 ++++++++++++++++++ src/http_parse.h | 69 +++ src/smartdns.c | 34 +- src/util.c | 248 +++++++++- src/util.h | 17 + 21 files changed, 1264 insertions(+), 88 deletions(-) create mode 100644 src/http_parse.c create mode 100644 src/http_parse.h diff --git a/ReadMe.md b/ReadMe.md index a62d04b..c4d317e 100755 --- a/ReadMe.md +++ b/ReadMe.md @@ -94,7 +94,7 @@ From the comparison, smartdns found the fastest IP address to visit www.baidu.co Supports finding the fastest access IP address from the IP address list of the domain name and returning it to the client to avoid DNS pollution and improve network access speed. 3. **Support for multiple query protocols** - Support UDP, TCP, TLS queries, and non-53 port queries, effectively avoiding DNS pollution. + Support UDP, TCP, TLS, HTTPS queries, and non-53 port queries, effectively avoiding DNS pollution. 4. **Domain IP address specification** Support configuring IP address of specific domain to achieve the effect of advertising filtering, and avoid malicious websites. @@ -549,6 +549,7 @@ Note: Merlin firmware is derived from ASUS firmware and can theoretically be use |server|Upstream UDP DNS server|None|Repeatable
`[ip][:port]`: Server IP, port optional.
`[-blacklist-ip]`: The "-blacklist-ip" parameter is to filtering IPs which is configured by "blacklist-ip".
`[-check-edns]`: edns filter.
`[-group [group] ...]`: The group to which the DNS server belongs, such as office, foreign, use with nameserver.
`[-exclude-default-group]`: Exclude DNS servers from the default group| server 8.8.8.8:53 -blacklist-ip -check-edns |server-tcp|Upstream TCP DNS server|None|Repeatable
`[ip][:port]`: Server IP, port optional.
`[-blacklist-ip]`: The "-blacklist-ip" parameter is to filtering IPs which is configured by "blacklist-ip".
`[-group [group] ...]`: The group to which the DNS server belongs, such as office, foreign, use with nameserver.
`[-exclude-default-group]`: Exclude DNS servers from the default group| server-tcp 8.8.8.8:53 |server-tls|Upstream TLS DNS server|None|Repeatable
`[ip][:port]`: Server IP, port optional.
`[-spki-pin [sha256-pin]]`: TLS verify SPKI value, a base64 encoded SHA256 hash
`[-blacklist-ip]`: The "-blacklist-ip" parameter is to filtering IPs which is configured by "blacklist-ip".
`[-group [group] ...]`: The group to which the DNS server belongs, such as office, foreign, use with nameserver.
`[-exclude-default-group]`: Exclude DNS servers from the default group| server-tls 8.8.8.8:853 +|server-https|Upstream HTTPS DNS server|None|Repeatable
`https://[host][:port]/path`: Server IP, port optional.
`[-spki-pin [sha256-pin]]`: TLS verify SPKI value, a base64 encoded SHA256 hash
`[-blacklist-ip]`: The "-blacklist-ip" parameter is to filtering IPs which is configured by "blacklist-ip".
`[-group [group] ...]`: The group to which the DNS server belongs, such as office, foreign, use with nameserver.
`[-exclude-default-group]`: Exclude DNS servers from the default group| server-https https://cloudflare-dns.com/dns-query |address|Domain IP address|None|address /domain/[ip\|-\|-4\|-6\|#\|#4\|#6], `-` for ignore, `#` for return SOA, `4` for IPV4, `6` for IPV6| address /www.example.com/1.2.3.4 |nameserver|To query domain with specific server group|None|nameserver /domain/[group\|-], `group` is the group name, `-` means ignore this rule, use the `-group` parameter in the related server|nameserver /www.example.com/office |ipset|Domain IPSet|None|ipset /domain/[ipset\|-], `-` for ignore|ipset /www.example.com/pass @@ -570,7 +571,7 @@ Note: Merlin firmware is derived from ASUS firmware and can theoretically be use * Domain name matching supports ignoring specific domain names, and can be individually matched to IPv4, IPV6, and supports diversified customization. * Enhance the ad blocking feature, return SOA record, this block ads better; * IPV4, IPV6 dual stack IP optimization mechanism, in the case of dual network, choose the fastest network. - * Supports the latest TLS protocol and provides secure DNS query capabilities. + * Supports the latest TLS, HTTPS protocol and provides secure DNS query capabilities. * DNS anti-poison mechanism, and a variety of mechanisms to avoid DNS pollution. * ECS support, the query results are better and more accurate. * IP blacklist support, ignoring the blacklist IP to make domain name queries better and more accurate. diff --git a/ReadMe_zh-CN.md b/ReadMe_zh-CN.md index 8ff2091..9245e43 100644 --- a/ReadMe_zh-CN.md +++ b/ReadMe_zh-CN.md @@ -94,7 +94,7 @@ rtt min/avg/max/mdev = 5.954/6.133/6.313/0.195 ms 支持从域名所属IP地址列表中查找到访问速度最快的IP地址,并返回给客户端,避免DNS污染,提高网络访问速度。 1. **支持多种查询协议** - 支持UDP,TCP,TLS查询,以及非53端口查询,有效避免DNS污染。 + 支持UDP,TCP,TLS, HTTPS查询,以及非53端口查询,有效避免DNS污染。 1. **特定域名IP地址指定** 支持指定域名的IP地址,达到广告过滤效果,避免恶意网站的效果。 @@ -552,6 +552,7 @@ https://github.com/pymumu/smartdns/releases |server|上游UDP DNS|无|可重复
`[ip][:port]`:服务器IP,端口可选。
`[-blacklist-ip]`:blacklist-ip参数指定使用blacklist-ip配置IP过滤结果。
`[-check-edns]`:edns过滤。
`[-group [group] ...]`:DNS服务器所属组,比如office, foreign,和nameserver配套使用。
`[-exclude-default-group]`:将DNS服务器从默认组中排除| server 8.8.8.8:53 -blacklist-ip -check-edns -group g1 |server-tcp|上游TCP DNS|无|可重复
`[ip][:port]`:服务器IP,端口可选。
`[-blacklist-ip]`:blacklist-ip参数指定使用blacklist-ip配置IP过滤结果。
`[-group [group] ...]`:DNS服务器所属组,比如office, foreign,和nameserver配套使用。
`[-exclude-default-group]`:将DNS服务器从默认组中排除| server-tcp 8.8.8.8:53 |server-tls|上游TLS DNS|无|可重复
`[ip][:port]`:服务器IP,端口可选。
`[-spki-pin [sha256-pin]]`: TLS合法性校验SPKI值,base64编码的sha256 SPKI pin值
`[-blacklist-ip]`:blacklist-ip参数指定使用blacklist-ip配置IP过滤结果。
`[-group [group] ...]`:DNS服务器所属组,比如office, foreign,和nameserver配套使用。
`[-exclude-default-group]`:将DNS服务器从默认组中排除| server-tls 8.8.8.8:853 +|server-https|上游HTTPS DNS|无|可重复
`https://[host][:port]/path`:服务器IP,端口可选。
`[-spki-pin [sha256-pin]]`: TLS合法性校验SPKI值,base64编码的sha256 SPKI pin值
`[-blacklist-ip]`:blacklist-ip参数指定使用blacklist-ip配置IP过滤结果。
`[-group [group] ...]`:DNS服务器所属组,比如office, foreign,和nameserver配套使用。
`[-exclude-default-group]`:将DNS服务器从默认组中排除| server-https https://cloudflare-dns.com/dns-query |address|指定域名IP地址|无|address /domain/[ip\|-\|-4\|-6\|#\|#4\|#6]
`-`表示忽略
`#`表示返回SOA
`4`表示IPV4
`6`表示IPV6| address /www.example.com/1.2.3.4 |nameserver|指定域名使用server组解析|无|nameserver /domain/[group\|-], `group`为组名,`-`表示忽略此规则,配套server中的`-group`参数使用| nameserver /www.example.com/office |ipset|域名IPSET|None|ipset /domain/[ipset\|-], `-`表示忽略|ipset /www.example.com/pass @@ -573,7 +574,7 @@ https://github.com/pymumu/smartdns/releases * 域名匹配支持忽略特定域名,可单独匹配IPv4, IPV6,支持多样化定制。 * 针对广告屏蔽功能做增强,返回SOA,屏蔽广告效果更佳; * IPV4,IPV6双栈IP优选机制,在双网情况下,选择最快的网络通讯。 - * 支持最新的TLS协议,提供安全的DNS查询能力。 + * 支持最新的TLS, HTTPS协议,提供安全的DNS查询能力。 * DNS防抢答机制,及多种机制避免DNS污染。 * ECS支持,是查询结果更佳准确。 * IP黑名单,忽略IP机制,使域名查询更佳准确。 diff --git a/doc/architecture.png b/doc/architecture.png index b6ec43db452418bf687dffed44fa7b73a012676b..cdd33d451aea1f3a22fa87b56302686d3aa10c57 100644 GIT binary patch literal 77456 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 KDHh9{`TZZe+Q{Po literal 82613 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 CG`Zsd diff --git a/doc/architecture.vsdx b/doc/architecture.vsdx index 69ba283da7aa7210e912b3fd9a813dc0ef6312f8..4e6bdc84726e38228e617b5c324b3fd0bf10f6ef 100644 GIT binary patch delta 13085 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 Xe-7yXL;v+4&4EB0N~lW9|9t&FZAlJ| delta 12719 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 z zq&FR<$hY}!S$=4zF9_*vz=1|$7p#w&nnwkHZf&6z%6T^qS`xmj`XTXd=@yS;TzE$t zH`WQVKIstD&q{8ovcv7w`_k2BbMXbfC~+Rha|pE?B2! z9)=*l#@nZE0?s7o;@V04&t%z>e{tXj8raA^?PKsMIE;OpL&LK@l29Ic*2x9vBZP$6 zWLDlJYv%%kgZ`e33||HJk@X2hG7N1>BF7#OIv9N`3^yEJj`y;sZAcGUUf5o}2<|U3 zCxfB>k+wBG8Zp7Z(E-|g%}tDE98dslCo|KWGlTj9wshJ@t--0E^EGzn27j3B_}q6f zecug6^D?;1MK{U&49!e&-c0ds1?DfV7-`ZL^dmS;W$!n|QJa=(uWC8`arQ`N(Zftfll$ncS649*E*CGg@Op-8h zqur~m44G*X889I--v_PO zo)VvZ%Lo{)-BZh*^$}O?YjLtUqZlW9;Rk?+M<+w>#qxUvXhvNHyvl|M_aV}PTjb8f z0d}szabm&@E0C;hGI|B}1?oArpCjSI)Ni6HvLEn)`FVv99)qVKEiZ&^WB(Y4f zO&#<*9{#TJcO=zrs_2)O`kr6o4q=7ke(9|9r+xx6JP&rs%rVbgC=d%MMc|7slx_Vle#f z?3d=3-ZN)bYA$JF>UEsI;hlS<$GsQsfn5KaIJoss2Az&g1eRP-FmfoxU{x!2ppXO> z-WrY-X)R)#Iwy4wy*JIZ6v=|I?5cKO8UJf*((|-OxW&dnA4C@;rmKAhyUN(GZZv42nPgi zunzqne;x?gXhC6vlWi2B)lk48)CAxJ6lCz54Fj~yJFw$B8ZeC=23QXj1Lf~5|7GIf zKwD~}f27@uFd&c{5(q^2|6cujR{?j~%0TN=|DBEEFPs5N8?0`}MD)Lvq5r{{f-~(T zpxH#g>vnX+|9?~YKTaS}ko?~kGad2&rkDS?Btype) { + case DNS_SERVER_UDP: { + } break; + case DNS_SERVER_HTTPS: { + struct client_dns_server_flag_https *flag_https = &server_info->flags.https; + spki = flag_https->spki; + *spki_len = flag_https->spi_len; + } break; + case DNS_SERVER_TLS: { + struct client_dns_server_flag_tls *flag_tls = &server_info->flags.tls; + spki = flag_tls->spki; + *spki_len = flag_tls->spi_len; + } break; + break; + case DNS_SERVER_TCP: + break; + default: + return NULL; + break; + } + + if (*spki_len <= 0) { + return NULL; + } + + return spki; +} + /* add dns server information */ -static int _dns_client_server_add(char *server_ip, struct addrinfo *gai, dns_server_type_t server_type, unsigned int server_flag, unsigned int result_flag, - int ttl, char *spki) +static int _dns_client_server_add(char *server_ip, struct addrinfo *gai, dns_server_type_t server_type, struct client_dns_server_flags *flags) { struct dns_server_info *server_info = NULL; unsigned char *spki_data = NULL; int spki_data_len = 0; + int ttl = 0; - /* read SPKI value, base64 sha256 value */ - if (spki && (strlen(spki) < DNS_MAX_SPKI_LEN)) { - spki_data = malloc(DNS_MAX_SPKI_LEN); - if (spki_data) { - memset(spki_data, 0, DNS_MAX_SPKI_LEN); - spki_data_len = SSL_base64_decode(spki, spki_data); - if (spki_data_len != SHA256_DIGEST_LENGTH) { - free(spki_data); - spki_data = NULL; - spki_data_len = 0; - } + switch (server_type) { + case DNS_SERVER_UDP: { + struct client_dns_server_flag_udp *flag_udp = &flags->udp; + ttl = flag_udp->ttl; + if (ttl > 255) { + ttl = 255; + } else if (ttl < -32) { + ttl = -32; } + } break; + case DNS_SERVER_HTTPS: { + struct client_dns_server_flag_https *flag_https = &flags->https; + spki_data_len = flag_https->spi_len; + } break; + case DNS_SERVER_TLS: { + struct client_dns_server_flag_tls *flag_tls = &flags->tls; + spki_data_len = flag_tls->spi_len; + } break; + break; + case DNS_SERVER_TCP: + break; + default: + return -1; + break; + } + + if (spki_data_len > DNS_SERVER_SPKI_LEN) { + tlog(TLOG_ERROR, "spki data length is invalid."); + return -1; } /* if server exist, return */ @@ -605,7 +667,7 @@ static int _dns_client_server_add(char *server_ip, struct addrinfo *gai, dns_ser } if (server_type != DNS_SERVER_UDP) { - result_flag &= (~DNSSERVER_FLAG_CHECK_TTL); + flags->result_flag &= (~DNSSERVER_FLAG_CHECK_TTL); } memset(server_info, 0, sizeof(*server_info)); @@ -615,14 +677,12 @@ static int _dns_client_server_add(char *server_ip, struct addrinfo *gai, dns_ser server_info->type = server_type; server_info->fd = 0; server_info->status = DNS_SERVER_STATUS_INIT; - server_info->result_flag = result_flag; server_info->ttl = ttl; server_info->ttl_range = 0; - server_info->spki = spki_data; - server_info->spki_len = spki_data_len; + memcpy(&server_info->flags, flags, sizeof(server_info->flags)); /* exclude this server from default group */ - if ((server_flag & SERVER_FLAG_EXCLUDE_DEFAULT) == 0) { + if ((server_info->flags.server_flag & SERVER_FLAG_EXCLUDE_DEFAULT) == 0) { if (_dns_client_add_to_group(DNS_SERVER_GROUP_DEFAULT, server_info) != 0) { tlog(TLOG_ERROR, "add server to default group failed."); goto errout; @@ -630,7 +690,7 @@ static int _dns_client_server_add(char *server_ip, struct addrinfo *gai, dns_ser } /* if server type is TLS, create ssl context */ - if (server_type == DNS_SERVER_TLS) { + if (server_type == DNS_SERVER_TLS || server_type == DNS_SERVER_HTTPS) { server_info->ssl_ctx = SSL_CTX_new(SSLv23_client_method()); if (server_info->ssl_ctx == NULL) { tlog(TLOG_ERROR, "init ssl failed."); @@ -646,15 +706,17 @@ static int _dns_client_server_add(char *server_ip, struct addrinfo *gai, dns_ser memcpy(&server_info->addr, gai->ai_addr, gai->ai_addrlen); /* start ping task */ - if (ttl <= 0 && (result_flag & DNSSERVER_FLAG_CHECK_TTL)) { - server_info->ping_host = fast_ping_start(PING_TYPE_DNS, server_ip, 0, 60000, 1000, _dns_client_server_update_ttl, server_info); - if (server_info->ping_host == NULL) { - tlog(TLOG_ERROR, "start ping failed."); - goto errout; - } + if (server_type == DNS_SERVER_UDP) { + if (ttl <= 0 && (server_info->flags.result_flag & DNSSERVER_FLAG_CHECK_TTL)) { + server_info->ping_host = fast_ping_start(PING_TYPE_DNS, server_ip, 0, 60000, 1000, _dns_client_server_update_ttl, server_info); + if (server_info->ping_host == NULL) { + tlog(TLOG_ERROR, "start ping failed."); + goto errout; + } - if (ttl < 0) { - server_info->ttl_range = -ttl; + if (ttl < 0) { + server_info->ttl_range = -ttl; + } } } @@ -741,10 +803,6 @@ static void _dns_client_server_remove_all(void) { list_del(&server_info->list); _dns_client_server_close(server_info); - if (server_info->spki) { - free(server_info->spki); - server_info->spki = NULL; - } free(server_info); } pthread_mutex_unlock(&client.server_list_lock); @@ -779,8 +837,7 @@ static int _dns_client_server_remove(char *server_ip, struct addrinfo *gai, dns_ return -1; } -static int _dns_client_server_operate(char *server_ip, int port, dns_server_type_t server_type, unsigned int server_flag, unsigned int result_flag, int ttl, - char *spki, int operate) +static int _dns_client_server_operate(char *server_ip, int port, dns_server_type_t server_type, struct client_dns_server_flags *flags, int operate) { char port_s[8]; int sock_type; @@ -796,8 +853,9 @@ static int _dns_client_server_operate(char *server_ip, int port, dns_server_type case DNS_SERVER_UDP: sock_type = SOCK_DGRAM; break; - case DNS_SERVER_TLS: case DNS_SERVER_TCP: + case DNS_SERVER_TLS: + case DNS_SERVER_HTTPS: sock_type = SOCK_STREAM; break; default: @@ -815,7 +873,7 @@ static int _dns_client_server_operate(char *server_ip, int port, dns_server_type if (operate == 0) { /* add server */ - ret = _dns_client_server_add(server_ip, gai, server_type, server_flag, result_flag, ttl, spki); + ret = _dns_client_server_add(server_ip, gai, server_type, flags); if (ret != 0) { goto errout; } @@ -835,14 +893,14 @@ errout: return -1; } -int dns_client_add_server(char *server_ip, int port, dns_server_type_t server_type, unsigned server_flag, unsigned int result_flag, int ttl, char *spki) +int dns_client_add_server(char *server_ip, int port, dns_server_type_t server_type, struct client_dns_server_flags *flags) { - return _dns_client_server_operate(server_ip, port, server_type, server_flag, result_flag, ttl, spki, 0); + return _dns_client_server_operate(server_ip, port, server_type, flags, 0); } int dns_client_remove_server(char *server_ip, int port, dns_server_type_t server_type) { - return _dns_client_server_operate(server_ip, port, server_type, 0, 0, 0, NULL, 1); + return _dns_client_server_operate(server_ip, port, server_type, NULL, 1); } int dns_server_num(void) @@ -1101,7 +1159,7 @@ static int _dns_client_recv(struct dns_server_info *server_info, unsigned char * /* get query reference */ query = _dns_client_get_request(packet->head.id, domain); - if (query == NULL || (query && has_opt == 0 && server_info->result_flag & DNSSERVER_FLAG_CHECK_EDNS)) { + if (query == NULL || (query && has_opt == 0 && server_info->flags.result_flag & DNSSERVER_FLAG_CHECK_EDNS)) { if (query) { _dns_client_query_release(query); } @@ -1123,7 +1181,7 @@ static int _dns_client_recv(struct dns_server_info *server_info, unsigned char * /* notify caller dns query result */ if (query->callback) { - ret = query->callback(query->domain, DNS_QUERY_RESULT, server_info->result_flag, packet, inpacket, inpacket_len, query->user_ptr); + ret = query->callback(query->domain, DNS_QUERY_RESULT, server_info->flags.result_flag, packet, inpacket, inpacket_len, query->user_ptr); if (request_num == 0 || ret) { /* if all server replied, or done, stop query, release resource */ _dns_client_query_remove(query); @@ -1326,7 +1384,7 @@ static int _dns_client_create_socket(struct dns_server_info *server_info) return _dns_client_create_socket_udp(server_info); } else if (server_info->type == DNS_SERVER_TCP) { return _DNS_client_create_socket_tcp(server_info); - } else if (server_info->type == DNS_SERVER_TLS) { + } else if (server_info->type == DNS_SERVER_TLS || server_info->type == DNS_SERVER_HTTPS) { return _DNS_client_create_socket_tls(server_info); } else { return -1; @@ -1382,7 +1440,7 @@ static int _dns_client_process_udp(struct dns_server_info *server_info, struct e tlog(TLOG_DEBUG, "recv udp packet from %s, len: %d, ttl: %d", gethost_by_addr(from_host, sizeof(from_host), (struct sockaddr *)&from), len, ttl); - if ((ttl != server_info->ttl) && (server_info->ttl > 0) && (server_info->result_flag & DNSSERVER_FLAG_CHECK_TTL)) { + if ((ttl != server_info->ttl) && (server_info->ttl > 0) && (server_info->flags.result_flag & DNSSERVER_FLAG_CHECK_TTL)) { /* If TTL check is enabled but the TTL is inconsistent, it is considered to be a fake dns packet */ if ((ttl < server_info->ttl - server_info->ttl_range) || (ttl > server_info->ttl + server_info->ttl_range)) { /* tlog(TLOG_DEBUG, "TTL mismatch, from:%d, local %d, discard result", ttl, server_info->ttl); */ @@ -1521,7 +1579,7 @@ static int _dns_client_socket_send(struct dns_server_info *server_info) return -1; } else if (server_info->type == DNS_SERVER_TCP) { return send(server_info->fd, server_info->send_buff.data, server_info->send_buff.len, MSG_NOSIGNAL); - } else if (server_info->type == DNS_SERVER_TLS) { + } else if (server_info->type == DNS_SERVER_TLS || server_info->type == DNS_SERVER_HTTPS) { return _dns_client_socket_ssl_send(server_info->ssl, server_info->send_buff.data, server_info->send_buff.len); } else { return -1; @@ -1534,7 +1592,7 @@ static int _dns_client_socket_recv(struct dns_server_info *server_info) return -1; } else if (server_info->type == DNS_SERVER_TCP) { return recv(server_info->fd, server_info->recv_buff.data + server_info->recv_buff.len, DNS_TCP_BUFFER - server_info->recv_buff.len, 0); - } else if (server_info->type == DNS_SERVER_TLS) { + } else if (server_info->type == DNS_SERVER_TLS || server_info->type == DNS_SERVER_HTTPS) { return _dns_client_socket_ssl_recv(server_info->ssl, server_info->recv_buff.data + server_info->recv_buff.len, DNS_TCP_BUFFER - server_info->recv_buff.len); } else { @@ -1545,7 +1603,9 @@ static int _dns_client_socket_recv(struct dns_server_info *server_info) static int _dns_client_process_tcp(struct dns_server_info *server_info, struct epoll_event *event, unsigned long now) { int len; + int dns_packet_len = 0; int ret = -1; + struct http_head *http_head = NULL; unsigned char *inpacket_data = NULL; if (event->events & EPOLLIN) { @@ -1591,29 +1651,61 @@ static int _dns_client_process_tcp(struct dns_server_info *server_info, struct e } while (1) { - /* tcp result format - * | len (short) | dns query result | - */ - inpacket_data = server_info->recv_buff.data; - len = ntohs(*((unsigned short *)(inpacket_data))); - if (len <= 0 || len >= DNS_IN_PACKSIZE) { - /* data len is invalid */ - goto errout; - } + if (server_info->type == DNS_SERVER_HTTPS) { + http_head = http_head_init(4096); + if (http_head == NULL) { + goto errout; + } - if (len > server_info->recv_buff.len - 2) { - /* len is not expceded, wait and recv */ - break; - } + len = http_head_parse(http_head, (char *)server_info->recv_buff.data, server_info->recv_buff.len); + if (len < 0) { + http_head_destroy(http_head); + if (len == -1) { + break; + } + goto errout; + } - inpacket_data = server_info->recv_buff.data + 2; + if (http_head_get_httpcode(http_head) != 200) { + tlog(TLOG_WARN, "http server query failed, server return http code : %d, %s", http_head_get_httpcode(http_head), + http_head_get_httpcode_msg(http_head)); + goto errout; + } + + dns_packet_len = http_head_get_data_len(http_head); + inpacket_data = (unsigned char *)http_head_get_data(http_head); + } else { + /* tcp result format + * | len (short) | dns query result | + */ + inpacket_data = server_info->recv_buff.data; + len = ntohs(*((unsigned short *)(inpacket_data))); + if (len <= 0 || len >= DNS_IN_PACKSIZE) { + /* data len is invalid */ + goto errout; + } + + if (len > server_info->recv_buff.len - 2) { + /* len is not expceded, wait and recv */ + break; + } + + inpacket_data = server_info->recv_buff.data + 2; + dns_packet_len = len; + len += 2; + } tlog(TLOG_DEBUG, "recv tcp packet from %s, len = %d", server_info->ip, len); /* process result */ - if (_dns_client_recv(server_info, inpacket_data, len, &server_info->addr, server_info->ai_addrlen) != 0) { + if (_dns_client_recv(server_info, inpacket_data, dns_packet_len, &server_info->addr, server_info->ai_addrlen) != 0) { goto errout; } - len += 2; + + if (http_head) { + http_head_destroy(http_head); + http_head = NULL; + } + server_info->recv_buff.len -= len; /* move to next result */ @@ -1677,6 +1769,10 @@ static int _dns_client_process_tcp(struct dns_server_info *server_info, struct e return 0; errout: + if (http_head) { + http_head_destroy(http_head); + } + pthread_mutex_lock(&client.server_list_lock); server_info->recv_buff.len = 0; server_info->send_buff.len = 0; @@ -1705,6 +1801,8 @@ static int _dns_client_tls_verify(struct dns_server_info *server_info) unsigned char *key_data = NULL; unsigned char *key_data_tmp = NULL; unsigned char *key_sha256 = NULL; + char *spki = NULL; + int spki_len = 0; cert = SSL_get_peer_certificate(server_info->ssl); if (cert == NULL) { @@ -1751,9 +1849,10 @@ static int _dns_client_tls_verify(struct dns_server_info *server_info) *ptr = 0; tlog(TLOG_DEBUG, "cert SPKI pin(%s): %s", "sha256", cert_fingerprint); - if (server_info->spki) { + spki = _dns_client_server_get_spki(server_info, &spki_len); + if (spki) { /* check SPKI */ - if (memcmp(server_info->spki, key_sha256, server_info->spki_len) != 0) { + if (memcmp(spki, key_sha256, spki_len) != 0) { tlog(TLOG_INFO, "server %s cert spki is invalid", server_info->ip); goto errout; } else { @@ -1858,7 +1957,7 @@ static int _dns_client_process(struct dns_server_info *server_info, struct epoll } else if (server_info->type == DNS_SERVER_TCP) { /* receive from tcp */ return _dns_client_process_tcp(server_info, event, now); - } else if (server_info->type == DNS_SERVER_TLS) { + } else if (server_info->type == DNS_SERVER_TLS || server_info->type == DNS_SERVER_HTTPS) { /* recive from tls */ return _dns_client_process_tls(server_info, event, now); } else { @@ -1992,6 +2091,56 @@ static int _dns_client_send_tls(struct dns_server_info *server_info, void *packe return 0; } +static int _dns_client_send_https(struct dns_server_info *server_info, void *packet, unsigned short len) +{ + int send_len = 0; + int http_len = 0; + unsigned char inpacket_data[DNS_IN_PACKSIZE]; + unsigned char *inpacket = inpacket_data; + struct client_dns_server_flag_https *https_flag = NULL; + + if (len > sizeof(inpacket_data) - 2) { + tlog(TLOG_ERROR, "packet size is invalid."); + return -1; + } + + https_flag = &server_info->flags.https; + + http_len = snprintf((char *)inpacket, DNS_IN_PACKSIZE, + "POST %s HTTP/1.1\r\n" + "Host: %s\r\n" + "content-type: application/dns-message\r\n" + "Content-Length: %d\r\n" + "\r\n", + https_flag->path, https_flag->host, len); + memcpy(inpacket + http_len, packet, len); + http_len += len; + + if (server_info->status != DNS_SERVER_STATUS_CONNECTED) { + return _dns_client_send_data_to_buffer(server_info, inpacket, http_len); + } + + if (server_info->ssl == NULL) { + return -1; + } + + send_len = _dns_client_socket_ssl_send(server_info->ssl, inpacket, http_len); + if (send_len < 0) { + if (errno == EAGAIN || server_info->ssl == NULL) { + /* save data to buffer, and retry when EPOLLOUT is available */ + return _dns_client_send_data_to_buffer(server_info, inpacket, http_len); + } else if (server_info->ssl && errno != ENOMEM) { + SSL_shutdown(server_info->ssl); + } + return -1; + } else if (send_len < http_len) { + /* save remain data to buffer, and retry when EPOLLOUT is available */ + return _dns_client_send_data_to_buffer(server_info, inpacket + send_len, http_len - send_len); + } + + return 0; +} + static int _dns_client_send_packet(struct dns_query_struct *query, void *packet, int len) { struct dns_server_info *server_info = NULL; @@ -2031,6 +2180,11 @@ static int _dns_client_send_packet(struct dns_query_struct *query, void *packet, ret = _dns_client_send_tls(server_info, packet, len); send_err = errno; break; + case DNS_SERVER_HTTPS: + /* https query */ + ret = _dns_client_send_https(server_info, packet, len); + send_err = errno; + break; default: /* unsupport query type */ ret = -1; diff --git a/src/dns_client.h b/src/dns_client.h index 3f65090..c921a53 100644 --- a/src/dns_client.h +++ b/src/dns_client.h @@ -2,6 +2,7 @@ #define _SMART_DNS_CLIENT_H #include "dns.h" +#define DNS_SERVER_SPKI_LEN 64 #define DNS_SERVER_GROUP_DEFAULT "default" typedef enum { @@ -35,8 +36,39 @@ int dns_client_query(char *domain, int qtype, dns_client_callback callback, void void dns_client_exit(void); +struct client_dns_server_flag_udp { + int ttl; +}; + +struct client_dns_server_flag_tls { + char spki[DNS_SERVER_SPKI_LEN]; + int spi_len; + char host[DNS_MAX_CNAME_LEN]; +}; + +struct client_dns_server_flag_https { + char spki[DNS_SERVER_SPKI_LEN]; + int spi_len; + char host[DNS_MAX_CNAME_LEN]; + char path[DNS_MAX_CNAME_LEN]; +}; + +struct client_dns_server_flags { + dns_server_type_t type; + unsigned int server_flag; + unsigned int result_flag; + + union { + struct client_dns_server_flag_udp udp; + struct client_dns_server_flag_tls tls; + struct client_dns_server_flag_https https; + }; +}; + +int dns_client_spki_decode(const char *spki, unsigned char *spki_data_out); + /* add remote dns server */ -int dns_client_add_server(char *server_ip, int port, dns_server_type_t server_type, unsigned int server_flag, unsigned int result_flag, int ttl, char *spki); +int dns_client_add_server(char *server_ip, int port, dns_server_type_t server_type, struct client_dns_server_flags *flags); /* remove remote dns server */ int dns_client_remove_server(char *server_ip, int port, dns_server_type_t server_type); diff --git a/src/dns_conf.c b/src/dns_conf.c index ceaea6e..6d439fa 100644 --- a/src/dns_conf.c +++ b/src/dns_conf.c @@ -68,6 +68,8 @@ int dns_conf_ipset_timeout_enable; struct dns_edns_client_subnet dns_conf_ipv4_ecs; struct dns_edns_client_subnet dns_conf_ipv6_ecs; +char dns_conf_sni_proxy_ip[DNS_MAX_IPLEN]; + /* create and get dns server group */ static struct dns_server_groups *_dns_conf_get_group(const char *group_name) { @@ -186,11 +188,24 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de server = &dns_conf_servers[index]; server->spki[0] = '\0'; + server->path[0] = '\0'; + server->hostname[0] = '\0'; + ip = argv[1]; - /* parse ip, port from ip */ - if (parse_ip(ip, server->server, &port) != 0) { - return -1; + if (type == DNS_SERVER_HTTPS) { + if (parse_uri(ip, NULL, server->server, &port, server->path) != 0) { + return -1; + } + strncpy(server->hostname, server->server, sizeof(server->hostname)); + if (server->path[0] == 0) { + strcpy(server->path, "/"); + } + } else { + /* parse ip, port from ip */ + if (parse_ip(ip, server->server, &port) != 0) { + return -1; + } } /* if port is not defined, set port to default 53 */ @@ -706,6 +721,14 @@ static int _config_server_tls(void *data, int argc, char *argv[]) return _config_server(argc, argv, DNS_SERVER_TLS, DEFAULT_DNS_TLS_PORT); } +static int _config_server_https(void *data, int argc, char *argv[]) +{ + int ret = 0; + ret = _config_server(argc, argv, DNS_SERVER_HTTPS, DEFAULT_DNS_HTTPS_PORT); + + return ret; +} + static int _config_nameserver(void *data, int argc, char *argv[]) { struct dns_nameserver_rule *nameserver_rule = NULL; @@ -954,6 +977,7 @@ static struct config_item _config_item[] = { CONF_CUSTOM("server", _config_server_udp, NULL), CONF_CUSTOM("server-tcp", _config_server_tcp, NULL), CONF_CUSTOM("server-tls", _config_server_tls, NULL), + CONF_CUSTOM("server-https", _config_server_https, NULL), CONF_CUSTOM("nameserver", _config_nameserver, NULL), CONF_CUSTOM("address", _config_address, NULL), CONF_YESNO("ipset-timeout", &dns_conf_ipset_timeout_enable), diff --git a/src/dns_conf.h b/src/dns_conf.h index 7c65797..c3824e4 100644 --- a/src/dns_conf.h +++ b/src/dns_conf.h @@ -16,9 +16,11 @@ #define DNS_NAX_GROUP_NUMBER 16 #define DNS_MAX_IPLEN 64 #define DNS_MAX_SPKI_LEN 64 +#define DNS_MAX_URL_LEN 256 #define DNS_MAX_PATH 1024 #define DEFAULT_DNS_PORT 53 #define DEFAULT_DNS_TLS_PORT 853 +#define DEFAULT_DNS_HTTPS_PORT 443 #define DNS_MAX_CONF_CNAME_LEN 128 #define SMARTDNS_CONF_FILE "/etc/smartdns/smartdns.conf" #define SMARTDNS_LOG_FILE "/var/log/smartdns.log" @@ -93,6 +95,8 @@ struct dns_servers { int ttl; dns_server_type_t type; char spki[DNS_MAX_SPKI_LEN]; + char hostname[DNS_MAX_CNAME_LEN]; + char path[DNS_MAX_URL_LEN]; }; /* ip address lists of domain */ @@ -131,6 +135,7 @@ struct dns_conf_address_rule { extern char dns_conf_server_ip[DNS_MAX_IPLEN]; extern char dns_conf_server_tcp_ip[DNS_MAX_IPLEN]; + extern int dns_conf_tcp_idle_time; extern int dns_conf_cachesize; extern int dns_conf_prefetch; @@ -166,6 +171,8 @@ extern int dns_conf_ipset_timeout_enable; extern struct dns_edns_client_subnet dns_conf_ipv4_ecs; extern struct dns_edns_client_subnet dns_conf_ipv6_ecs; +extern char dns_conf_sni_proxy_ip[DNS_MAX_IPLEN]; + void dns_server_load_exit(void); int dns_server_load_conf(const char *file); diff --git a/src/dns_server.c b/src/dns_server.c index de8f131..c7ec1c6 100644 --- a/src/dns_server.c +++ b/src/dns_server.c @@ -119,6 +119,9 @@ struct dns_request { struct sockaddr addr; }; + dns_result_callback result_callback; + void *user_ptr; + int has_ping_result; int has_ping_tcp; int has_ptr; @@ -522,6 +525,45 @@ static int _dns_setup_ipset(struct dns_request *request) return ret; } +static int _dns_result_callback(struct dns_request *request) +{ + char ip[DNS_MAX_CNAME_LEN]; + + if (request->result_callback == NULL) { + return 0; + } + + ip[0] = 0; + if (request->qtype == DNS_T_A) { + if (request->has_ipv4 == 0) { + goto out; + } + + sprintf(ip, "%d.%d.%d.%d", request->ipv4_addr[0], request->ipv4_addr[1], request->ipv4_addr[2], request->ipv4_addr[3]); + + return request->result_callback(request->domain, request->rcode, request->qtype, ip, request->user_ptr); + } else if (request->qtype == DNS_T_AAAA) { + if (request->has_ipv6 == 0) { + goto out; + } + + sprintf(ip, "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", + request->ipv6_addr[0], request->ipv6_addr[1], request->ipv6_addr[2], request->ipv6_addr[3], request->ipv6_addr[4], request->ipv6_addr[5], + request->ipv6_addr[6], request->ipv6_addr[7], request->ipv6_addr[8], request->ipv6_addr[9], request->ipv6_addr[10], request->ipv6_addr[11], + request->ipv6_addr[12], request->ipv6_addr[13], request->ipv6_addr[14], request->ipv6_addr[15]); + + return request->result_callback(request->domain, request->rcode, request->qtype, ip, request->user_ptr); + } + + request->result_callback(request->domain, DNS_RC_NXDOMAIN, request->qtype, ip, request->user_ptr); + + return 0; +out: + + request->result_callback(request->domain, DNS_RC_NXDOMAIN, request->qtype, ip, request->user_ptr); + return 0; +} + static int _dns_server_request_complete(struct dns_request *request) { char *cname = NULL; @@ -610,6 +652,8 @@ static int _dns_server_request_complete(struct dns_request *request) /* update ipset */ _dns_setup_ipset(request); + _dns_result_callback(request); + if (request->prefetch) { return 0; } @@ -1514,7 +1558,13 @@ static int _dns_server_process_cache(struct dns_request *request, struct dns_pac } request->rcode = DNS_RC_NOERROR; - _dns_reply(request); + + _dns_result_callback(request); + + if (request->prefetch == 0) { + _dns_reply(request); + } + dns_cache_update(dns_cache); dns_cache_release(dns_cache); @@ -1781,6 +1831,68 @@ static int _dns_server_process_udp(struct dns_server_conn *dnsserver, struct epo return _dns_server_recv(dnsserver, inpacket, len, &from, from_len); } +int dns_server_query(char *domain, int qtype, dns_result_callback callback, void *user_ptr) +{ + int ret = -1; + struct dns_request *request = NULL; + const char *group_name = NULL; + + request = malloc(sizeof(*request)); + if (request == NULL) { + tlog(TLOG_ERROR, "malloc failed.\n"); + goto errout; + } + memset(request, 0, sizeof(*request)); + pthread_mutex_init(&request->ip_map_lock, NULL); + atomic_set(&request->adblock, 0); + request->ping_ttl_v4 = -1; + request->ping_ttl_v6 = -1; + request->prefetch = 1; + request->qtype = qtype; + request->rcode = DNS_RC_SERVFAIL; + request->result_callback = callback; + request->user_ptr = user_ptr; + + request->id = 0; + hash_init(request->ip_map); + strncpy(request->domain, domain, DNS_MAX_CNAME_LEN); + + /* lookup domain rule */ + request->domain_rule = _dns_server_get_domain_rule(request->domain); + + tlog(TLOG_INFO, "query domain %s, qtype = %d\n", request->domain, qtype); + + /* process cache */ + if (_dns_server_process_cache(request, NULL) == 0) { + ret = 0; + goto clean_exit; + } + + _dns_server_request_get(request); + pthread_mutex_lock(&server.request_list_lock); + list_add_tail(&request->list, &server.request_list); + pthread_mutex_unlock(&server.request_list_lock); + + _dns_server_request_get(request); + request->send_tick = get_tick_count(); + request->request_wait++; + + if (request->domain_rule) { + /* get nameserver rule */ + if (request->domain_rule->rules[DOMAIN_RULE_NAMESERVER]) { + struct dns_nameserver_rule *nameserver_rule = request->domain_rule->rules[DOMAIN_RULE_NAMESERVER]; + group_name = nameserver_rule->group_name; + } + } + + /* send request */ + ret = dns_client_query(request->domain, qtype, dns_server_resolve_callback, request, group_name); +clean_exit: + return ret; +errout: + return ret; +} + static void _dns_server_client_touch(struct dns_server_conn *client) { time(&client->last_request_time); diff --git a/src/dns_server.h b/src/dns_server.h index 1075b1a..d633c6c 100644 --- a/src/dns_server.h +++ b/src/dns_server.h @@ -1,6 +1,8 @@ #ifndef _SMART_DNS_SERVER_H #define _SMART_DNS_SERVER_H +#include "dns.h" + #ifdef __cpluscplus extern "C" { #endif @@ -15,6 +17,12 @@ void dns_server_stop(void); void dns_server_exit(void); +/* query result notify function */ +typedef int (*dns_result_callback)(char *domain, dns_rtcode_t rtcode, dns_type_t addr_type, char *ip, void *user_ptr); + +/* query domain */ +int dns_server_query(char *domain, int qtype, dns_result_callback callback, void *user_ptr); + #ifdef __cpluscplus } #endif diff --git a/src/http_parse.c b/src/http_parse.c new file mode 100644 index 0000000..ab6fa52 --- /dev/null +++ b/src/http_parse.c @@ -0,0 +1,445 @@ +#include "http_parse.h" +#include "hash.h" +#include "hashtable.h" +#include "jhash.h" +#include "list.h" +#include +#include +#include + +struct http_head_fields { + struct hlist_node node; + struct list_head list; + + char *name; + char *value; +}; + +struct http_head { + HTTP_HEAD_TYPE head_type; + HTTP_METHOD method; + char *url; + char *version; + int code; + char *code_msg; + int buff_size; + int buff_len; + char *buff; + int head_ok; + int head_len; + char *data; + int data_len; + int expect_data_len; + struct http_head_fields field_head; + DECLARE_HASHTABLE(field_map, 4); +}; + +/* + * Returns: + * >=0 - success http data len + * -1 - Incomplete request + * -2 - parse failed + */ +struct http_head *http_head_init(int buffsize) +{ + struct http_head *http_head = NULL; + char *buffer = NULL; + + http_head = malloc(sizeof(*http_head)); + if (http_head == NULL) { + goto errout; + } + memset(http_head, 0, sizeof(*http_head)); + INIT_LIST_HEAD(&http_head->field_head.list); + hash_init(http_head->field_map); + + buffer = malloc(buffsize); + if (buffer == NULL) { + goto errout; + } + + http_head->buff = buffer; + http_head->buff_size = buffsize; + + return http_head; + +errout: + if (buffer) { + free(buffer); + } + + if (http_head) { + free(http_head); + } + + return NULL; +} + +struct http_head_fields *http_head_first_fields(struct http_head *http_head) +{ + struct http_head_fields *first = NULL; + first = list_first_entry(&http_head->field_head.list, struct http_head_fields, list); + + if (first->name == NULL && first->value == NULL) { + return NULL; + } + + return first; +} + +const char *http_head_get_fields_value(struct http_head *http_head, const char *name) +{ + unsigned long key; + struct http_head_fields *filed; + + key = hash_string(name); + hash_for_each_possible(http_head->field_map, filed, node, key) + { + if (strncmp(filed->name, name, 128) == 0) { + return filed->value; + } + } + + return NULL; +} + +struct http_head_fields *http_head_next_fields(struct http_head_fields *fields) +{ + struct http_head_fields *next = NULL; + next = list_next_entry(fields, list); + + if (next->name == NULL && next->value == NULL) { + return NULL; + } + + return next; +} + +int http_head_lookup_fields(struct http_head_fields *fields, const char **name, const char **value) +{ + if (fields == NULL) { + return -1; + } + + if (name) { + *name = fields->name; + } + + if (value) { + *value = fields->value; + } + + return 0; +} + +HTTP_METHOD http_head_get_method(struct http_head *http_head) +{ + return http_head->method; +} + +const char *http_head_get_url(struct http_head *http_head) +{ + return http_head->url; +} + +const char *http_head_get_httpversion(struct http_head *http_head) +{ + return http_head->version; +} + +int http_head_get_httpcode(struct http_head *http_head) +{ + return http_head->code; +} + +char *http_head_get_httpcode_msg(struct http_head *http_head) +{ + return http_head->code_msg; +} + +HTTP_HEAD_TYPE http_head_get_head_type(struct http_head *http_head) +{ + return http_head->head_type; +} + +char *http_head_get_data(struct http_head *http_head) +{ + return http_head->data; +} + +int http_head_get_data_len(struct http_head *http_head) +{ + return http_head->data_len; +} + +static int _http_head_add_fields(struct http_head *http_head, char *name, char *value) +{ + unsigned long key = 0; + struct http_head_fields *fields = NULL; + fields = malloc(sizeof(*fields)); + if (fields == NULL) { + return -1; + } + memset(fields, 0, sizeof(*fields)); + + fields->name = name; + fields->value = value; + + list_add_tail(&fields->list, &http_head->field_head.list); + key = hash_string(name); + hash_add(http_head->field_map, &fields->node, key); + + return 0; +} + +static int _http_head_parse_response(struct http_head *http_head, char *key, char *value) +{ + char *field_start = NULL; + char *tmp_ptr = NULL; + char *result = NULL; + char *ret_code = NULL; + + if (strstr(key, "HTTP/") == NULL) { + return -1; + } + + for (tmp_ptr = value; *tmp_ptr != 0; tmp_ptr++) { + if (field_start == NULL) { + field_start = tmp_ptr; + } + + if (*tmp_ptr == ' ') { + *tmp_ptr = '\0'; + if (ret_code == NULL) { + ret_code = field_start; + } else if (result == NULL) { + result = field_start; + break; + } + + field_start = NULL; + } + } + + if (field_start && result == NULL) { + result = field_start; + } + + if (ret_code == NULL || result == NULL) { + return -1; + } + + http_head->code = atol(ret_code); + http_head->code_msg = result; + http_head->version = key; + http_head->head_type = HTTP_HEAD_RESPONSE; + + return 0; +} + +static int _http_head_parse_request(struct http_head *http_head, char *key, char *value) +{ + int method = HTTP_METHOD_INVALID; + char *url = NULL; + char *version = NULL; + char *tmp_ptr = value; + char *field_start = NULL; + + if (strncmp(key, "GET", sizeof("GET")) == 0) { + method = HTTP_METHOD_GET; + } else if (strncmp(key, "POST", sizeof("POST")) == 0) { + method = HTTP_METHOD_POST; + } else if (strncmp(key, "PUT", sizeof("PUT")) == 0) { + method = HTTP_METHOD_PUT; + } else if (strncmp(key, "DELETE", sizeof("DELETE")) == 0) { + method = HTTP_METHOD_DELETE; + } else if (strncmp(key, "TRACE", sizeof("TRACE")) == 0) { + method = HTTP_METHOD_TRACE; + } else if (strncmp(key, "CONNECT", sizeof("CONNECT")) == 0) { + method = HTTP_METHOD_CONNECT; + } else { + return _http_head_parse_response(http_head, key, value); + } + + for (tmp_ptr = value; *tmp_ptr != 0; tmp_ptr++) { + if (field_start == NULL) { + field_start = tmp_ptr; + } + if (*tmp_ptr == ' ') { + *tmp_ptr = '\0'; + if (url == NULL) { + url = field_start; + } + + field_start = NULL; + } + } + + if (field_start && version == NULL) { + version = field_start; + } + + http_head->method = method; + http_head->url = url; + http_head->version = version; + http_head->head_type = HTTP_HEAD_REQUEST; + + return 0; +} + +static int _http_head_parse(struct http_head *http_head) +{ + int i = 0; + char *key = NULL; + char *value = NULL; + char *data; + int has_first_line = 0; + + int inkey = 1; + int invalue = 0; + + data = http_head->buff; + for (i = 0; i < http_head->head_len; i++, data++) { + if (inkey) { + if (key == NULL && *data != ' ' && *data != '\r' && *data != '\n') { + key = data; + continue; + } + + if (*data == ':' || *data == ' ') { + *data = '\0'; + inkey = 0; + invalue = 1; + continue; + } + } + + if (invalue) { + if (value == NULL && *data != ' ') { + value = data; + continue; + } + + if (*data == '\r' || *data == '\n') { + *data = '\0'; + inkey = 1; + invalue = 0; + } + } + + if (key && value && invalue == 0) { + if (has_first_line == 0) { + if (_http_head_parse_request(http_head, key, value) != 0) { + return -2; + } + + has_first_line = 1; + } else { + if (_http_head_add_fields(http_head, key, value) != 0) { + return -2; + } + } + + key = NULL; + value = NULL; + inkey = 1; + invalue = 0; + } + } + + return 0; +} + +int http_head_parse(struct http_head *http_head, const char *data, int data_len) +{ + int i = 0; + char *buff_end = NULL; + int left_size = 0; + int process_data_len = 0; + + left_size = http_head->buff_size - http_head->buff_len; + + if (left_size < data_len) { + return -3; + } + + buff_end = http_head->buff + http_head->buff_len; + if (http_head->head_ok == 0) { + for (i = 0; i < data_len; i++, data++) { + *(buff_end + i) = *data; + if (*data == '\n') { + if (http_head->buff_len + i < 2) { + continue; + } + + if (*(buff_end + i - 2) == '\n') { + http_head->head_ok = 1; + http_head->head_len = http_head->buff_len + i - 2; + i++; + buff_end += i; + data_len -= i; + data++; + if (_http_head_parse(http_head) != 0) { + return -2; + } + + const char *content_len = NULL; + content_len = http_head_get_fields_value(http_head, "Content-Length"); + if (content_len) { + http_head->expect_data_len = atol(content_len); + } else { + http_head->expect_data_len = 0; + } + + if (http_head->expect_data_len < 0) { + return -2; + } + + break; + } + } + } + + process_data_len += i; + if (http_head->head_ok == 0) { + // Read data again */ + http_head->buff_len += process_data_len; + return -1; + } + } + + if (http_head->head_ok == 1) { + int get_data_len = (http_head->expect_data_len > data_len) ? data_len : http_head->expect_data_len; + if (http_head->data == NULL) { + http_head->data = buff_end; + } + + memcpy(buff_end, data, get_data_len); + process_data_len += get_data_len; + http_head->data_len += get_data_len; + } + + http_head->buff_len += process_data_len; + if (http_head->data_len < http_head->expect_data_len) { + return -1; + } + + return process_data_len; +} + +void http_head_destroy(struct http_head *http_head) +{ + struct http_head_fields *fields, *tmp; + + list_for_each_entry_safe(fields, tmp, &http_head->field_head.list, list) + { + list_del(&fields->list); + free(fields); + } + + if (http_head->buff) { + free(http_head->buff); + } + + free(http_head); +} diff --git a/src/http_parse.h b/src/http_parse.h new file mode 100644 index 0000000..c822dd7 --- /dev/null +++ b/src/http_parse.h @@ -0,0 +1,69 @@ +#ifndef HTTP_PARSER_H +#define HTTP_PARSER_H + +#ifdef __cpluscplus +extern "C" { +#endif + +struct http_head; +struct http_head_fields; + +typedef enum HTTP_METHOD { + HTTP_METHOD_INVALID = 0, + HTTP_METHOD_GET, + HTTP_METHOD_HEAD, + HTTP_METHOD_POST, + HTTP_METHOD_PUT, + HTTP_METHOD_DELETE, + HTTP_METHOD_TRACE, + HTTP_METHOD_CONNECT, +} HTTP_METHOD; + +typedef enum HTTP_HEAD_TYPE { + HTTP_HEAD_INVALID = 0, + HTTP_HEAD_REQUEST = 1, + HTTP_HEAD_RESPONSE = 2, +} HTTP_HEAD_TYPE; + +struct http_head *http_head_init(int buffsize); + +HTTP_HEAD_TYPE http_head_get_head_type(struct http_head *http_head); + +HTTP_METHOD http_head_get_method(struct http_head *http_head); + +const char *http_head_get_url(struct http_head *http_head); + +const char *http_head_get_httpversion(struct http_head *http_head); + +int http_head_get_httpcode(struct http_head *http_head); + +char *http_head_get_httpcode_msg(struct http_head *http_head); + +char *http_head_get_data(struct http_head *http_head); + +int http_head_get_data_len(struct http_head *http_head); + +struct http_head_fields *http_head_first_fields(struct http_head *http_head); + +struct http_head_fields *http_head_next_fields(struct http_head_fields *fields); + +const char *http_head_get_fields_value(struct http_head *http_head, const char *name); + +int http_head_lookup_fields(struct http_head_fields *fields, const char **name, const char **value); + +/* + * Returns: + * >=0 - success http data len + * -1 - Incomplete request + * -2 - parse failed + * -3 - buffer is small + */ +int http_head_parse(struct http_head *http_head, const char *data, int data_len); + +void http_head_destroy(struct http_head *http_head); + +#ifdef __cpluscplus +} +#endif + +#endif // !HTTP_PARSER_H diff --git a/src/smartdns.c b/src/smartdns.c index 4552124..6d29d57 100644 --- a/src/smartdns.c +++ b/src/smartdns.c @@ -127,10 +127,38 @@ static int _smartdns_add_servers(void) int ret = 0; struct dns_server_groups *group = NULL; struct dns_servers *server = NULL; + struct client_dns_server_flags flags; for (i = 0; i < dns_conf_server_num; i++) { - ret = dns_client_add_server(dns_conf_servers[i].server, dns_conf_servers[i].port, dns_conf_servers[i].type, dns_conf_servers[i].server_flag, - dns_conf_servers[i].result_flag, dns_conf_servers[i].ttl, dns_conf_servers[i].spki); + memset(&flags, 0, sizeof(flags)); + switch (dns_conf_servers[i].type) { + case DNS_SERVER_UDP: { + struct client_dns_server_flag_udp *flag_udp = &flags.udp; + flag_udp->ttl = dns_conf_servers[i].ttl; + } break; + case DNS_SERVER_HTTPS: { + struct client_dns_server_flag_https *flag_http = &flags.https; + flag_http->spi_len = dns_client_spki_decode(dns_conf_servers[i].spki, (unsigned char *)flag_http->spki); + strncpy(flag_http->host, dns_conf_servers[i].hostname, sizeof(flag_http->host)); + strncpy(flag_http->path, dns_conf_servers[i].path, sizeof(flag_http->path)); + } break; + case DNS_SERVER_TLS: { + struct client_dns_server_flag_tls *flag_tls = &flags.tls; + flag_tls->spi_len = dns_client_spki_decode(dns_conf_servers[i].spki, (unsigned char *)flag_tls->spki); + strncpy(flag_tls->host, dns_conf_servers[i].hostname, sizeof(flag_tls->host)); + } break; + break; + case DNS_SERVER_TCP: + break; + default: + return -1; + break; + } + + flags.type = dns_conf_servers[i].type; + flags.server_flag = dns_conf_servers[i].server_flag; + flags.result_flag = dns_conf_servers[i].result_flag; + ret = dns_client_add_server(dns_conf_servers[i].server, dns_conf_servers[i].port, dns_conf_servers[i].type, &flags); if (ret != 0) { tlog(TLOG_ERROR, "add server failed, %s:%d", dns_conf_servers[i].server, dns_conf_servers[i].port); return -1; @@ -297,7 +325,7 @@ static void _sig_error_exit(int signo, siginfo_t *siginfo, void *ct) #elif defined(__mips__) PC = context->uc_mcontext.pc; #endif - tlog(TLOG_ERROR, "process exit with signal %d, code = %d, errno = %d, pid = %d, self = %d, pc = %#lx, addr = %#lx, build(%s %s)\n", signo, siginfo->si_code, + tlog(TLOG_FATAL, "process exit with signal %d, code = %d, errno = %d, pid = %d, self = %d, pc = %#lx, addr = %#lx, build(%s %s)\n", signo, siginfo->si_code, siginfo->si_errno, siginfo->si_pid, getpid(), PC, (unsigned long)siginfo->si_addr, __DATE__, __TIME__); sleep(1); diff --git a/src/util.c b/src/util.c index 07bb9ac..7c57590 100644 --- a/src/util.c +++ b/src/util.c @@ -12,10 +12,11 @@ #include #include #include +#include +#include #include #include -#include -#include +#include #define TMP_BUFF_LEN_32 32 @@ -192,6 +193,53 @@ int parse_ip(const char *value, char *ip, int *port) return 0; } +int parse_uri(char *value, char *scheme, char *host, int *port, char *path) +{ + char *scheme_end = NULL; + int field_len = 0; + char *process_ptr = value; + char host_name[PATH_MAX]; + + char *host_end = NULL; + + scheme_end = strstr(value, "://"); + if (scheme_end) { + field_len = scheme_end - value; + if (scheme) { + memcpy(scheme, value, field_len); + scheme[field_len + 1] = 0; + } + process_ptr += field_len + 3; + } else { + if (scheme) { + scheme[0] = '\0'; + } + } + + host_end = strstr(process_ptr, "/"); + if (host_end == NULL) { + return parse_ip(process_ptr, host, port); + }; + + field_len = host_end - process_ptr; + if (field_len >= sizeof(host_name)) { + return -1; + } + memcpy(host_name, process_ptr, field_len); + host_name[field_len + 1] = 0; + + if (parse_ip(host_name, host, port) != 0) { + return -1; + } + + process_ptr += field_len; + + if (path) { + strcpy(path, process_ptr); + } + return 0; +} + int set_fd_nonblock(int fd, int nonblock) { int ret; @@ -457,7 +505,7 @@ static __attribute__((unused)) void _pthreads_locking_callback(int mode, int typ } } -static __attribute__((unused)) unsigned long _pthreads_thread_id(void) +static __attribute__((unused)) unsigned long _pthreads_thread_id(void) { unsigned long ret; @@ -499,3 +547,197 @@ void SSL_CRYPTO_thread_cleanup(void) OPENSSL_free(lock_cs); OPENSSL_free(lock_count); } + +#define SERVER_NAME_LEN 256 +#define TLS_HEADER_LEN 5 +#define TLS_HANDSHAKE_CONTENT_TYPE 0x16 +#define TLS_HANDSHAKE_TYPE_CLIENT_HELLO 0x01 +#ifndef MIN +#define MIN(X, Y) ((X) < (Y) ? (X) : (Y)) +#endif +typedef struct Protocol { + const char *const name; + const uint16_t default_port; + int (*const parse_packet)(const char*, size_t, char *, const char **); + const char *const abort_message; + const size_t abort_message_len; +} protocol_t; + +static int parse_extensions(const char *, size_t, char *, const char **); +static int parse_server_name_extension(const char *, size_t, char *, const char **); + +const struct Protocol *const tls_protocol; + +static const protocol_t tls_protocol_st = { + .default_port = 443, + .parse_packet = &parse_tls_header, +}; +const protocol_t *const tls_protocol = &tls_protocol_st; + +/* Parse a TLS packet for the Server Name Indication extension in the client + * hello handshake, returning the first servername found (pointer to static + * array) + * + * Returns: + * >=0 - length of the hostname and updates *hostname + * caller is responsible for freeing *hostname + * -1 - Incomplete request + * -2 - No Host header included in this request + * -3 - Invalid hostname pointer + * -4 - malloc failure + * < -4 - Invalid TLS client hello + */ +int parse_tls_header(const char *data, size_t data_len, char *hostname, const char **hostname_ptr) +{ + char tls_content_type; + char tls_version_major; + char tls_version_minor; + size_t pos = TLS_HEADER_LEN; + size_t len; + + if (hostname == NULL) + return -3; + + /* Check that our TCP payload is at least large enough for a TLS header */ + if (data_len < TLS_HEADER_LEN) + return -1; + + /* SSL 2.0 compatible Client Hello + * + * High bit of first byte (length) and content type is Client Hello + * + * See RFC5246 Appendix E.2 + */ + if (data[0] & 0x80 && data[2] == 1) { + return -2; + } + + tls_content_type = data[0]; + if (tls_content_type != TLS_HANDSHAKE_CONTENT_TYPE) { + return -5; + } + + tls_version_major = data[1]; + tls_version_minor = data[2]; + if (tls_version_major < 3) { + return -2; + } + + /* TLS record length */ + len = ((unsigned char)data[3] << 8) + (unsigned char)data[4] + TLS_HEADER_LEN; + data_len = MIN(data_len, len); + + /* Check we received entire TLS record length */ + if (data_len < len) + return -1; + + /* + * Handshake + */ + if (pos + 1 > data_len) { + return -5; + } + if (data[pos] != TLS_HANDSHAKE_TYPE_CLIENT_HELLO) { + return -5; + } + + /* Skip past fixed length records: + * 1 Handshake Type + * 3 Length + * 2 Version (again) + * 32 Random + * to Session ID Length + */ + pos += 38; + + /* Session ID */ + if (pos + 1 > data_len) + return -5; + len = (unsigned char)data[pos]; + pos += 1 + len; + + /* Cipher Suites */ + if (pos + 2 > data_len) + return -5; + len = ((unsigned char)data[pos] << 8) + (unsigned char)data[pos + 1]; + pos += 2 + len; + + /* Compression Methods */ + if (pos + 1 > data_len) + return -5; + len = (unsigned char)data[pos]; + pos += 1 + len; + + if (pos == data_len && tls_version_major == 3 && tls_version_minor == 0) { + return -2; + } + + /* Extensions */ + if (pos + 2 > data_len) + return -5; + len = ((unsigned char)data[pos] << 8) + (unsigned char)data[pos + 1]; + pos += 2; + + if (pos + len > data_len) + return -5; + return parse_extensions(data + pos, len, hostname, hostname_ptr); +} + +static int parse_extensions(const char *data, size_t data_len, char *hostname, const char **hostname_ptr) +{ + size_t pos = 0; + size_t len; + + /* Parse each 4 bytes for the extension header */ + while (pos + 4 <= data_len) { + /* Extension Length */ + len = ((unsigned char)data[pos + 2] << 8) + (unsigned char)data[pos + 3]; + + /* Check if it's a server name extension */ + if (data[pos] == 0x00 && data[pos + 1] == 0x00) { + /* There can be only one extension of each type, so we break + * our state and move p to beinnging of the extension here */ + if (pos + 4 + len > data_len) + return -5; + return parse_server_name_extension(data + pos + 4, len, hostname, hostname_ptr); + } + pos += 4 + len; /* Advance to the next extension header */ + } + /* Check we ended where we expected to */ + if (pos != data_len) + return -5; + + return -2; +} + +static int parse_server_name_extension(const char *data, size_t data_len, char *hostname, const char **hostname_ptr) +{ + size_t pos = 2; /* skip server name list length */ + size_t len; + + while (pos + 3 < data_len) { + len = ((unsigned char)data[pos + 1] << 8) + (unsigned char)data[pos + 2]; + + if (pos + 3 + len > data_len) + return -5; + + switch (data[pos]) { /* name type */ + case 0x00: /* host_name */ + strncpy(hostname, data + pos + 3, len); + if (hostname_ptr) { + *hostname_ptr = data + pos + 3; + } + hostname[len] = '\0'; + + return len; + default: + break; + } + pos += 3 + len; + } + /* Check we ended where we expected to */ + if (pos != data_len) + return -5; + + return -2; +} diff --git a/src/util.h b/src/util.h index 0842577..34079d8 100644 --- a/src/util.h +++ b/src/util.h @@ -16,6 +16,8 @@ int getaddr_by_host(char *host, struct sockaddr *addr, socklen_t *addr_len); int parse_ip(const char *value, char *ip, int *port); +int parse_uri(char *value, char *scheme, char *host, int *port, char *path); + int set_fd_nonblock(int fd, int nonblock); char *reverse_string(char *output, char *input, int len); @@ -36,4 +38,19 @@ int SSL_base64_decode(const char *in, unsigned char *out); int create_pid_file(const char *pid_file); +/* Parse a TLS packet for the Server Name Indication extension in the client + * hello handshake, returning the first servername found (pointer to static + * array) + * + * Returns: + * >=0 - length of the hostname and updates *hostname + * caller is responsible for freeing *hostname + * -1 - Incomplete request + * -2 - No Host header included in this request + * -3 - Invalid hostname pointer + * -4 - malloc failure + * < -4 - Invalid TLS client hello + */ +int parse_tls_header(const char *data, size_t data_len, char *hostname, const char **hostname_ptr); + #endif