Не для одного компьютера, а для всей локальной сети.
Другими словами, как перенаправить все исходящие 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
...

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


2011.10.10 16:18:08
#cid6385

Ответить

rinetd?
http://www.boutell.com/rinetd

socat?
http://www.dest-unreach.org/socat

Краткость — сестра таланта?
Посмотрю, спасибо.

2011.10.11 19:45:38
#cid6432

Ответить

rinetd — простой форвардер. При наличии iptables использовать его нецелесообразно.

socat — крут! Но использовать его для поставленной цели тоже нельзя.

Веб-сервер действительно поднимается только ради редиректа на виртуальный хостинг.
Как сделать иначе — не знаю. Есть ещё предложения?