Curl выбрать с какого ip делать запрос
Перейти к содержимому

Curl выбрать с какого ip делать запрос

  • автор:

Как определяют реальный IP адрес запроса?

У меня есть парсинг , реализованный через curl . Я использую мобильные прокси через https. На одном сервере запускаю парсинг и он работает, а на другом запускаю — нет (блокировка). Подскажите, каким образом сайт, который парсят, определяет с какого ip-адреса идет парсинг , ведь используется прокси ? JS не работает, Прокси стоят одинаковые (мобильные), Условия работы парсинга одинаковые, за исключением ip-сервера, на котором он находится. 1 сервер — россия 2 сервер — беларусь

Отслеживать
задан 1 ноя 2021 в 7:33
Sarkis Allahverdian Sarkis Allahverdian
1,236 2 2 золотых знака 18 18 серебряных знаков 26 26 бронзовых знаков

В смысле с какого? В PHP — $_SERVER[‘REMOTE_ADDR’]. Это же сетевой запрос, следовательно на сервере можно получить адрес клиента. Он не получает ваш адрес если запрос делается с прокси (только в том случае когда прокси сам передает это в заголовке)

1 ноя 2021 в 8:09
вы пишите тривиальные вещи. Тут ни REMOTE_ADDR, ни в заголовках ничего нет от реального ip
1 ноя 2021 в 8:25

Потому что это тривиально по своей сути, но без знания того что передает прокси вы не сможете понять передает ли он ваш реальный адрес, или нет. Если да — то он будет в заголовке, если нет — то конечный сайт не узнает вашего реального адреса. Вполне может быть что сайт блокирует прокси.

1 ноя 2021 в 8:52

ну вот у меня два сервера, на каждый сервер закидываю одинаковый скрипт и одинаковые прокси. На одном работает, на другом нет . Я даже создал тестовый третий сервер, и к нему начал делать обращения, чтобы читать данные из _SERVER, но там нет ничего такого, что показало бы,что стоит позади прокси . Я подумал, может сайт как-то определяет с какого домена идет обращение, но тоже непонятно как .

1 ноя 2021 в 11:45

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Это может быть двусторонний пинг, т.к сервера находятся в разных локациях

Запустив пинг к клиентскому IP, со стороны нашего сервера, можно узнать приблизительную длинну маршрута. То же самое можно сделать со стороны браузера, XMLHTTPRequest дёргает пустую страницу нашего nginx. Полученную разницу в петле более 30 мс можно интерпретировать как туннель.

Отслеживать
ответ дан 1 ноя 2021 в 13:33
31 3 3 бронзовых знака

но так и непонятно, почему на одном сервере работает , а на другом — нет. Ведь прокси и там и там одинаковые прописаны

1 ноя 2021 в 15:08
Разная удаленность серверов от сервера объекта парсинга, соответственно и разный пинг
1 ноя 2021 в 17:49
так в данном случае, что лучше делать-то, не совсем ясно ?
1 ноя 2021 в 18:14
Запретил доступ к серверу через iptables, но это не помогает
1 ноя 2021 в 18:44

Можно попробовать: Добавьте следующую строку в «/etc/sysctl.conf» net.ipv4.icmp_echo_ignore_all = 1 либо sudo bash -c ‘echo «net.ipv4.icmp_echo_ignore_all=1» >> /etc/sysctl.conf затем применить изменения sudo sysctl -p

1 ноя 2021 в 19:18

В свое время я защищался от хождения и граббинга моих сайтов в несколько потоков через прокси двумя путями. 1) Через crontab опрашивал популярные форумы и сайты где выкладывают бесплатные прокси. На их основе создавал ban -list в iptables 2) В момент прихода на мою страницу посетителя выполнял нехитрые действия

$isProxy = false; $proxyPortsList = [8080,8081,3128,81,88 . . ]; foreach( $proxyPortsList as $port) < $userIP = getENV('REMOTE_ADDR'); $fp = fsockopen( $userIP, $port, $errno, $errstr, 30); if ( $fp ) < $isProxy = true; fclose($fp); >> if ( $isProxy ) < header('Location: https://google.com'); >

В 90% случаев помогало. 🙂

Так что, вполне может быть что-то из этого использует и сервер на который Вы ходите.

Примеры использования cURL

cURL (расшифровывается как Client URL ) это инструмент, позволяющий взаимодействовать с различными серверами и поддерживающий множество протоколов: HTTP, FTP , TELNET и др. Изначально cURL — это служебная программа для командной строки. PHP поддерживает работу с библиотекой cURL.

Утилита cURL установлена по умолчанию во всех современных операционных системах Windows, Mac и Linux.

Guzzle PHP HTTP клиент, обертка над cURL.

Тестирование HTTP / HTTPS при помощи cURL или rest-client

cURL позволяет легко выполнять любые HTTP методы для нужного ресурса. Можно передавать любые параметры запросов и заголовков, а так же проверять ответные заголовки и данные. Инструмент командной строки «curl», стандартен для большинства *nix систем. Для пользователей Windows подойдёт MinGW/MSYS.

Пример использования и базовые опции:

# curl -X PUT www.example.com/bar/1 -d "some=var" -d "other=var2" -H "Accept: text/json" -I

-X [METHOD] определяет HTTP метод.
-d «name=value» устанавливает имя и значения переменных в POST/PUT.
-H [HEADER] устанавливает заголовок.
-I, –head отображать только заголовки ответа.

-k, –insecure Разрешить подключения к сайтам SSL без сертификатов. По умолчанию curl верифицирует все сертификаты и чтобы он не выдавал ошибку о неверных (самоподписанных) сертификатах и установил соединение используйте эту опцию.

-L, –location Следовать за перенаправлениями (редиректами)

–max-time (или -m) — это максимальное время в секундах, в течение которого вся операция должна быть завершена или отменена. Параметр –max-time может предотвратить зависание Curl при выполнении пакетных заданий в медленных сетях.

curl --max-time 4 https://wiki.dieg.info

Краткий справочник часто используемых команд curl для протоколов HTTP/HTTPS

Какие заголовки отдает сервер? Используйте опцию -I, она позволяют получить заголовок без тела документа. Проверим HTTP ответ сайта, используя ключ I:

# curl -I dieg.info HTTP/1.1 301 Moved Permanently Date: Sat, 23 Apr 2022 07:04:04 GMT Server: Apache Location: https://dieg.info/ Cache-Control: max-age=600 Expires: Sat, 23 Apr 2022 07:14:04 GMT Content-Type: text/html; charset=iso-8859-1

Рекурсивное отслеживание редиректов.

curl -I -L dieg.info

Замер скорости ответа сайта. Измерение продолжительности соединения FID (First Input Delay — Задержка первого ввода):

curl -w "%\n" -o /dev/null -s https://dieg.info 4.561

Проверить работу gzip сайта при помощи curl, если включено должны увидеть заголовок content-encoding: gzip

curl -H "Accept-Encoding: gzip" -I https://wow2.top . content-encoding: gzip

Если у вас несколько ip на сервере и вы хотите сделать запрос с конкретного вашего ip — используйте ключ interface:

curl --interface 193.233.203.51 ipinfo.io/ip

Использование cURL с IPv6

Ключ -6 означает использовать только IPv6, ключ -4 соответственно IPv4. Если libcurl может преобразовывать адрес в несколько версий IP (что происходит, если он поддерживает IPv6), эта опция указывает libcurl разрешать имена только в адреса IPv6.

Запрос к локалхост:

curl -6 "http://[::1]/"

Рекурсивный запрос http заголовков к сайту. Ключ v позволяет в расширенном режиме убедиться, что curl использует имееyно IPv6

curl -v -6 --max-time 7 -IL https://wow2.top * Trying 2001:678:6d4:9203::15:443. * Connected to wow2.top (2001:678:6d4:9203::15) port 443 (#0)

Авторизация POST на PHP с использованием curl

Пример авторизация Метод HTTP POST на PHP с использованием curl:

 function login($url,$login,$pass){ $ch = curl_init(); if(strtolower((substr($url,0,5))=='https')) { // если соединяемся с https curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); } curl_setopt($ch, CURLOPT_URL, $url); // откуда пришли на эту страницу curl_setopt($ch, CURLOPT_REFERER, $url); // cURL будет выводить подробные сообщения о всех производимых действиях curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_POSTFIELDS,"login=".$login."&pass=".$pass); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4"); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //сохранять полученные COOKIE в файл curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'); $result=curl_exec($ch); // Убеждаемся что произошло перенаправление после авторизации if(strpos($result,"Location: home.php")===false) die('Login incorrect'); curl_close($ch); return $result; } // чтение страницы после авторизации function Read($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); // откуда пришли на эту страницу curl_setopt($ch, CURLOPT_REFERER, $url); //запрещаем делать запрос с помощью POST и соответственно разрешаем с помощью GET curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //отсылаем серверу COOKIE полученные от него при авторизации curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4"); $result = curl_exec($ch); curl_close($ch); return $result; } ?>

PHP: удаленный размер файла без загрузки файла

Функция вывод размер удаленного файла, используется библиотека PHP curl и HTTP метод запроса HEAD (параметр CURLOPT_NOBODY).

function getRemoteFilesize($url){ $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_HEADER, TRUE); curl_setopt($ch, CURLOPT_NOBODY, TRUE); $data = curl_exec($ch); $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); curl_close($ch); return $size; } $url = 'https://example.com/file.csv'; echo getRemoteFilesize($url); echo "\n";

Как отправить запрос curl php на другой сервер?

Помню, можно было как-то отправить запрос через curl на домен с использованием другого IP-адреса. То есть где-то можно было указать его в настройках curl и получить ответ уже с того сервера, чей айпи был указан. Может быть кто подскажет? 🙂

  • Вопрос задан более двух лет назад
  • 214 просмотров

8 комментариев

Простой 8 комментариев

$url = 'http://dynupdate.no-ip.com/ip.php'; $proxy = '127.0.0.1:8888'; //$proxyauth = 'user:password'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_PROXY, $proxy); //curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 1); $curl_scraped_page = curl_exec($ch); curl_close($ch); echo $curl_scraped_page;

Compolomus

Дмитрий @Compolomus Куратор тега PHP

Как отправить запрос через определенный интерфейс?

На сервере есть 4 интерфейса на которых висит интернет eth0 eth1 eth2 eth3
Задача написать ПО которое будет делать запросы через определенный интерфейс.

Вообще вопрос, как отправить curl запрос через определенный интерфейс?
Пишу на golang, но не в этом суть я думаю

  • Вопрос задан более трёх лет назад
  • 2655 просмотров

Комментировать
Решения вопроса 1
Админю сервера, починяю примуса.

Имею на сервере два адреса на одном интерфейсе, для отправки запроса curl’ом с нужного адреса использую
curl —interface N.N.N.N
Где N.N.N.N — IPшник с которого отправлять запрос.
А man нам говорит, что там же можно указывать и имя интерфейса, цитата из man

--interface Perform an operation using a specified interface. You can enter interface name, IP address or host name. An example could look like: curl --interface eth0

Ответ написан более трёх лет назад

Григорий Byrger: значит у других интерфейсов нет роутов во внешний мир, только и всего.
что вам говорит
ip a s и
ip r s

Inter Plotnik @Byrger Автор вопроса
Erelecano Oioraen: дело было в том что от рута к ним доступа нет.
Inter Plotnik @Byrger Автор вопроса
Erelecano Oioraen: наоборот, только от рута к ним доступ =(
Ответы на вопрос 2

ky0

Миллиардер, филантроп, патологический лгун

Вы же TCP/UDP-запросы имеете в виду? Тогда нужно просто соответствующим образом настроить роутинг, сетевой стек ОС сам разберётся, куда отправлять пакеты.

Ответ написан более трёх лет назад
Inter Plotnik @Byrger Автор вопроса

Мне нужно просто к сайту обращаться. Но проблема в том что сайт один, а ПО долго распределять запросы.
Допустим запрос 1 отправить в гугл с одной сетевой карты, а запрос 2 с другой сетевой карты

ky0

Григорий Byrger: можно заюзать bonding в режиме round-robin, тогда пакеты будут распределяться по всем интерфейсам.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *