Серверная (www.it-simple.ru)

Как ограничить доступ по HTTP одним сайтом


Не для одного компьютера, а для всей локальной сети.
Другими словами, как перенаправить все исходящие HTTP запросы локальной сети на один сайт.

Задача

Есть локальная сеть организации.
Общий доступ к интернету организован с помощью шлюза на Debian, iptables на котором настроен с помощью пакета arno-iptables-firewall.

Нужно сделать так, чтобы при вводе любого http-адреса в любом браузере любой клиентской машины, человек попадал на один и тот же сайт. При этом все остальные сетевые службы, такие как аська, скайп, почта и т.д., должны работать без ограничений.

Да, сайт, на который должны попадать клиенты, находится на виртуальном хостинге, то есть у него нет внешнего ip-адреса. Вернее, сам адрес есть, но к нему привязаны ещё десятки различных доменных имён, поэтому доступ по http://[ip] невозможен.

Время ограничено, сделать всё надо за 15 минут.

Решение

Если бы целевой сайт находился на нормальном хостинге, то есть если бы ему был сопоставлен конкретный адрес интернета - всё решение ограничилось бы вводом единственной инструкции в iptables, а именно:

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination $EXT_WEB

где $EXT_WEB - внешний ip-адрес сайта.

Но, как уже говорилось, это невозможно.
Поэтому пойдём другим путём, но в этом же направлении.

Устанавливаем на шлюз веб-сервер:

apt-get install apache2

Настраиваем его - разрешаем обрабатывать инструкции .htaccess:

/etc/apache2/sites-enabled/000-default

... Options FollowSymLinks AllowOverride All Order allow,deny allow from all ...

В самом .htaccess делаем перенаправление на внешний веб-сервер по имени сайта:

/var/www/.htaccess

redirect / http://sitename.dom/

sitename.dom - наш целевой сайт.
Теперь при попытке зайти на шлюз по http, то есть по 80 порту - попадаем на sitename.dom.

Через iptables загибаем все http-запросы на веб-сервер шлюза. Все, кроме тех, что ведут на целевой сайт:

iptables -t nat -A PREROUTING -i eth0 -d ! $EXT_WEB -p tcp -m tcp --dport 80 -j DNAT --to-destination $GW_IP

Здесь $GW_IP - адрес шлюза в локальной сети.

Чтобы правило действовало и после перезагрузки шлюза - добавляем его в автозагрузку:

echo "iptables -t nat -A PREROUTING -i eth0 -d ! $EXT_WEB -p tcp -m tcp --dport 80 -j DNAT --to-destination $GW_IP" >> /etc/rc.local

/etc/rc.local


...
iptables -t nat -A PREROUTING -i eth0 -d ! $EXT_WEB -p tcp -m tcp --dport 80 -j DNAT --to-destination $GW_IP
...

Комментарии и критика - приветствуются.
Если кто скажет как можно было сделать проще - буду благодарен.