Как перенаправить HTTP-запросы на локальный сервер Apache при подключении к Интернету?

У меня есть небольшой Linux (Ubuntu) сервер с двумя сетевыми картами, который работает как маршрутизатор, dhcp, DNS-сервер, брандмауэр и т. Д. Одна сетевая карта подключена к локальной сети, а другая – к моему интернет-провайдеру. Когда соединение с Интернетом не работает, я хочу перенаправить все HTTP-запросы на мой локальный сервер Apache, который отобразит небольшую веб-страницу, информирующую пользователей локальной сети, что их подключение к локальной сети в порядке, сам сервер в порядке, только ссылка ISP в настоящее время вниз. Как мне это сделать?

  1. Я не нашел надежного способа определить, отключено ли подключение к Интернету, а не периодически пинговать кучу внешних хостов, которые, как известно, большую часть времени работают. (Состояние интерфейса UP все время).

  2. Какой инструмент следует использовать для перенаправления? Iptables? Что-то другое?

Я не нашел надежного способа определить, отключено ли подключение к Интернету, а не периодически пинговать кучу внешних хостов, которые, как известно, большую часть времени работают. (Состояние интерфейса UP все время).

Чтобы узнать, активна ли ваша ссылка, отправьте эхо-запрос ICMP (также известный как «ping») на известный надежный хост на другом конце ссылки, которую вы пытаетесь протестировать. Обычно это будет шлюз по умолчанию для ISP, но есть и другие возможности. Если вы не можете использовать стандартный шлюз ISP для такого тестирования, я бы предложил настроить DNS-серверы вашего интернет-провайдера; если они не работают, все равно очень плохо, и если вам не нужно, чтобы это было на 100% точным, это, вероятно, достаточно хорошо. Помните, что IP лучше всего работает, и ICMP не поддерживает TCP-ориентированный характер и гарантии.

Не наводняйте хост с помощью пингов, если у вас нет взаимного согласия с администратором удаленной системы. Каждые 30 секунд, вероятно, вполне достаточно, возможно, увеличиваясь, когда связь обнаруживается как понижающаяся и уменьшающаяся в периоды низкого использования, такие как в течение ночи. Интервал должен выбираться в зависимости от того, как быстро вы хотите реагировать на ситуацию со связью и что администратор удаленного сервера может терпеть. Более одного пинга каждые несколько секунд почти наверняка превышают вершину, и если вам не нужен «немедленный» ответ на ситуацию с соединением, нет ничего, говоря, что вы не можете тестировать раз в несколько минут или даже реже.

Какой инструмент следует использовать для перенаправления? Iptables? Что-то другое?

Поскольку вы говорите о том, чтобы создать веб-страницу, когда ссылка не работает, я подозреваю, что вы в основном занимаетесь веб-браузером. Исключение составляет просмотр веб-страниц с использованием IP-адресов.

Поэтому настройте локальный DNS-реестр для кэширования и укажите на него своих клиентов. Установите его для пересылки на DNS-серверы вашего интернет-провайдера или установите его для выхода и получения ответов самостоятельно на основе корневых подсказок, это зависит от вас.

Когда ссылка не удалась, замените конфигурацию для локального DNS-сервера на тот, который является авторитетным для корневой зоны . и отвечает на любые запросы A (и возможно AAAA ) с IP-адресом вашего локального веб-сервера и выдает команду перезагрузки конфигурации. Убедитесь, что локальный веб-сервер не дифференцируется на основе запрошенного имени хоста (помещайте указанную веб-страницу на виртуальный хост по умолчанию). В конфигурации BIND у вас будет что-то вроде следующего: при обнаружении сбоя ссылки:

 zone "." { type master; file "failed-connection.root.zone"; }; 

а затем в failed-connection.root.zone вас будет:

 $ORIGIN . $TTL 10 @ SOA <your SOA record details here> * A 192.168.9.10 * AAAA fe80:123:45::1 

Обязательно используйте короткий TTL (я использовал 10 секунд в приведенном выше примере), чтобы избежать непреднамеренного кэширования ответа «отказ». Также убедитесь, что используете IP-адреса, которые не зависят от внешнего подключения. (Строго говоря, fe80 :: / 16 устарел, но он достаточно хорош для иллюстративных целей.) Скрипт «ссылка вниз» может также понадобиться для очистки кеша DNS-сервера. Также убедитесь, что это не просачивается в Интернет. В BIND 9 подружитесь с функцией просмотра; с другим программным обеспечением, исследуйте альтернативы, прежде чем делать что-то вроде этого вживую.

Когда вы обнаружите, что ссылка возвращается, просто верните исходный файл конфигурации BIND (или другого DNS-сервера) и выполните еще одну команду перезагрузки конфигурации и, возможно, кеш-флеш.

Разумеется, вы могли бы использовать, например, iptables с переписыванием адресов перед маршрутизацией, но тогда вы рискуете нуждаться в чем-то, что может обрабатывать в основном все, что угодно, кто может захотеть выбросить что-либо в Интернете, для предельной дополнительной утилиты. Для меня это так не кажется потенциальной проблемой.

Поскольку вы говорите, что у вас есть «маленький» сервер, я предполагаю, что объем трафика достаточно мал, чтобы обрабатываться прокси-сервером HTTP, таким как Squid. Если вы настроили маршрутизатор как прозрачный прокси-сервер (ака прокси-перехватчика ), клиенты должны иметь обычный Интернет-доступ до тех пор, пока не произойдет сбой подключения к Интернету. Затем я ожидаю, что клиенты получат ответы HTTP 504 (Gateway Timeout).

Если ваше интернет-соединение ненадежно, вы можете подумать о том, что страницы, находящиеся в кеше HTTP-прокси, все еще могут быть доступны клиентам во время сбоя.