Иногда возникают ситуации, когда нам надо кинуть запрос на адрес, но с условием, чтобы имя резолвилось на определенный адрес.
Это можно сделать с помощью утилиты curl с ключом —resolve:
~ curl --help ... --resolve <host:port:address[,address]...> Resolve the host+port to this address ... ~ ping google.com PING google.com (74.125.205.101) 56(84) bytes of data. ~ ping google.com PING google.com (74.125.205.102) 56(84) bytes of data. ~ curl --resolve google.com:443:74.125.205.102 -k 'https://google.com/' <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="https://www.google.com/">here</A>. </BODY></HTML>
Используя ключ —resolve , curl может сделать запросы, используя заданный адрес и предотвращая перезапись нормально разрешенных адресов. Это некоторая альтернатива /etc/hosts в командной строке. Порт должен позволять работать с необходимым протоколом.
Допустим у Вас есть сервис https://myAPP.srv.local/ за балансировщиком и резолвится по нескольким адресам:
— 192.168.1.20
— 192.168.1.21
У сервиса есть healthcheck, который отдает информацию о состоянии. Однако же при попадании на https://health.myAPP.srv.local/ иногда мы получаем ошибку, например, «ERR_SSL_UNRECOGNIZED_NAME_ALERT».
Отлавливаем curl’ом эту ошибку:
~ curl -k -X GET 'https://health.myAPP.srv.local/' ... OK ... ~ curl -k -X GET 'https://health.myAPP.srv.local/' curl: (35) error:14094458:SSL routines:ssl3_read_bytes:tlsv1 unrecognized name
Мы знаем на какие адреса резолвится имя, проверяем конкретно по адресам:
~ curl --resolve health.myAPP.srv.local:443:192.168.1.20 -k -X GET 'https://health.myAPP.srv.local/' ... OK ... ~ curl --resolve health.myAPP.srv.local:443:192.168.1.21 -k -X GET 'https://health.myAPP.srv.local/' curl: (35) error:14094458:SSL routines:ssl3_read_bytes:tlsv1 unrecognized name
Таким образом мы выявили на каком именно узле у нас проблема, правим сертификат на хосте 192.168.1.21 и можно считать траблшутинг успешным.