Доступ к моей домашней сети с помощью CURL - PullRequest
2 голосов
/ 12 сентября 2010

Этот вопрос охватывает как ServerFault.com, так и здесь, но это больше похоже на программирование, чем на сервер. Я настроил свой домашний компьютер для запуска сервера Apache. Он отвечает на порт 5900, который был перенаправлен с моего беспроводного маршрутизатора. Затем я настроил сервер динамического DNS, чтобы постоянно обновлять IP-адрес моей домашней сети. Я знаю, что эта часть работает, потому что я использовал другой компьютер в другой беспроводной сети и смог получить доступ к странице индекса моего сервера, используя MYURL.com:5900.

Моя цель - отправить сообщение на мой домашний сервер. Я написал скрипт на своем домашнем сервере, где, если я отправлю ему сообщение POST, он сохранит это сообщение в файл. Другими словами, серия событий должна идти так:

  1. Я захожу на свою веб-страницу, записываю текст в поле ввода и нажимаю кнопку отправки
  2. Сообщение передается на сервер моего веб-сайта.
  3. Мой сервер запускает скрипт, который использует CURL для отправки сообщения в виде POST на DDNS моего домашнего сервера
  4. Сервер дома принимает сообщение и запускает скрипт, который записывает его в файл.

Я знаю, как сделать 1,2 и 4. Я пытался заставить 3 работать и не могу. Я даже не могу заставить CURL прочитать index.html моего домашнего сервера. Вот код, который я использовал с CURL (используя PHP):

    $string = 'http://MYURL.com';

    echo "sending to " . $string . '<br/>';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_PORT, 5900);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $response = curl_exec($ch);

    if(curl_error($ch))
    {
        echo curl_error($ch);
    }
    echo $response;

    curl_close($ch);

Я проверил это с помощью google.com и порта по умолчанию, и он работал нормально. Это повторило HTML, данный мне Google. Однако когда я запускаю его на DNS моего домашнего сервера, он всегда истекает. Когда я не добавляю время ожидания, он говорит, что не может подключиться. При этом используется тот же URL-адрес, который при отправке в браузер правильно отправляет мне index.html моего домашнего сервера.

Кто-нибудь знает, что происходит не так? Кроме того, если бы был лучший способ сделать это, что это?

Я знаю, что это был длинный вопрос, поэтому большое спасибо.

Этан

Ответы [ 2 ]

5 голосов
/ 12 сентября 2010

Откуда вы это тестируете? Большинство сетей в наши дни сильно защищены сетью безопасности и запрещают исходящие соединения со странными портами. Ваш порт 5900 определенно считается странным.

Причина, по которой ваш тест с использованием беспроводной сети (я предполагаю, что 3G?) Работает, заключается в том, что этот ПК / ноутбук подключен напрямую к Интернету и поэтому не блокируется брандмауэром.

Самый простой способ проверить теорию брандмауэра - настроить тестовую страницу на своем сервере на порту 80 и попытаться получить к ней доступ с помощью CURL. Если это работает, то вы знаете, что проблема в том, что кто-то из цепочки маршрутизаторов и прокси блокирует ваш порт 5900.


Немного о том, почему порт 80 не считается "странным":

Порт 80 - это порт , обычно используемый для HTTP (веб-сервер), назначенный IANA . Как таковой он обычно не блокируется, учитывая, что основной причиной, по которой люди подключаются к Интернету, является доступ к Всемирной паутине (которая работает по протоколу HTTP и, следовательно, требует, чтобы порт 80 был открыт). Блокировка порта 80 делает Интернет практически бесполезным (ну, не совсем, у вас все еще есть электронная почта). Если системный администратор когда-либо заблокирует порт 80, он может также отключить Интернет. Именно поэтому по умолчанию порт 80 не заблокирован.

Теперь, что это значит для вас, home-server-admin. Конечно, ваш IP-адрес имеет только один порт 80. Это означает, что действительно может быть только одно правило переадресации портов, подключенное к порту 80. Это означает, что в вашей локальной сети может быть только один компьютер, обслуживающий веб-страницы для внешнего мира , Если ваш младший брат или сестра хочет запустить другой веб-сервер, ему / ей придется использовать другой порт.

Именно поэтому веб-серверы предназначены для обслуживания нескольких веб-страниц (они обнаруживают URL, поэтому один порт 80 может обслуживать разные сайты). Это позволяет одному IP-адресу обслуживать различные веб-сайты с одного компьютера. Google: http virtual host для получения дополнительной информации.

* примечание: не совсем так, вы можете использовать прокси балансировки нагрузки или перенаправления для перенаправления HTTP-запроса на другие машины в сети. Но принцип все еще верен. Только один порт 80 машины может быть напрямую подключен к Интернету. Остальные просто прокси.

0 голосов
/ 12 сентября 2010

Иногда маршрутизатор блокирует доступ к вашему внешнему IP-адресу из внутренней сети.

Попробуйте подключить свой собственный внешний IP-адрес и получить доступ к порту 5900 из своей внутренней сети, и вы увидите, так ли это.

...