Обойти блокировку домена в hosts-файле в PHP CURL

Рейтинг: 0Ответов: 1Опубликовано: 05.04.2023

Подскажите пожалуйста. Возможно в php curl использовать сторонний DNS-сервер игнорируя запись в hosts-файле? Ситуация такая. В hosts-файле должен быть заблокирован домен, но при этом скрипт на php должен иметь возможность с этого домена загружать файлы.

Ответы

▲ 2Принят

Вы пишите: "Игнорируя запись в hosts-файле". Имеется ввиду, что в hosts прописано что-то вроде:

127.0.0.1   <domen> 

При условии PHP 8.1 и libcurl 7.62+ есть DNS-over-HTTPS (DoH). Погуглите, ну или почитайте тут - https://ru.wikipedia.org/wiki/DNS_%D0%BF%D0%BE%D0%B2%D0%B5%D1%80%D1%85_HTTPS

Например, пишем в hosts:

127.0.0.1       2ip.ru

Пишем код:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://2ip.ru");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'User-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36h'
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

if (!($res = curl_exec($ch))) {
    echo curl_error($ch);
} else {
    echo $res;
}
curl_close($ch);

Получаем по 127.0.0.1 свою ошибку (ну в моем случае, так как никто 443 на 127.0.0.1 не пытается слушать):

OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 2ip.ru:443 

Добавляем публичный DNS сервер от OpenDNS:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://2ip.ru");
// Получаем DNS по HTTPS от публичного сервиса OpenDNS, в обход hosts:
curl_setopt($ch, CURLOPT_DOH_URL, 'https://doh.opendns.com/dns-query');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'User-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36h'

));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

if (!($res = curl_exec($ch))) {
    echo curl_error($ch);
} else {
    echo $res;
}
curl_close($ch);  

Сработало, получили свой IP от 2ip.ru:

...
<br>
<br>
IP: 95.31.XXX.XXX<br>
</center>
</div>
...