Имеется: локалка 192.168.6.0/24 с виндовыми машинами, роутер на linux с двумя интерфейсами, eth0 смотрит наружу, eth1 - внутрь сети, и имеет адрес 192.168.6.67. На роутере настроен кэширующий Squid, слушающий порт 3128. Также в локалке установлен WEB-сервер с адресом 192.168.6.71 на порту 80. Проброс порта осуществляется на роутере с помощью iptables. Этот WEB-сервер прекрасно виден из интернета.
Требуется, чтобы он был виден и из локалки, а также с самого роутера.
Документацию http://www.opennet.me/docs/RUS/iptables/ изучил вдоль и поперек, но решения не нашел. Вот выдержка из документа:
===========================================================
А теперь посмотрим, что произойдет, если запрос посылается с узла, расположенного в той же локальной сети. Для простоты изложения примем адрес клиента в локальной сети равным $LAN_BOX.
1. Пакет покидает $LAN_BOX.
2. Поступает на брандмауэр.
3. Производится подстановка адреса назначения, однако адрес отправителя не подменяется, т.е. исходный адрес остается в пакете без изменения.
4. Пакет покидает брандмауэр и отправляется на HTTP сервер.
5. HTTP сервер, готовясь к отправке ответа, обнаруживает, что клиент находится в локальной сети (поскольку пакет запроса содержал оригинальный IP адрес, который теперь превратился в адрес назначения) и поэтому отправляет пакет непосредственно на $LAN_BOX.
6. Пакет поступает на $LAN_BOX. Клиент "путается", поскольку ответ пришел не с того узла, на который отправлялся запрос. Поэтому клиент "сбрасывает" пакет ответа и продолжает ждать "настоящий" ответ.
Проблема решается довольно просто с помощью SNAT. Ниже приводится правило, которое выполняет эту функцию. Это правило вынуждает HTTP сервер передавать ответы на наш брандмауэр, которые затем будут переданы клиенту.
iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \
--to-source $LAN_IP
===============================================================
В моем случае это правило ничего не дает, т.к. у меня имеется еще одно звено прохода пакетов - это Squid, на роутере, на порту 3128. По каким цепочкам-таблицам пакеты из локалки прибудут на Squid, и по каким доставятся обратно - не могу разгрести. Прошу помощи.
Подойди к проблеме с другой стороны.Ты можешь добраться до сервера напрямую по адресу http://192.168.6.71:80. Запрети proxy для локальных адресов.
Если у тебя name-based virtual server, то LAN клиенты должны знать, что www.localserver.com находится по адресу 192.168.6.71. Об этом им может сказать твой местный DNS-сервер, а может запись
192.168.6.71 www.localserver.com
в %SystemRoot%\system32\drivers\etc\etc\hosts у каждого клиента. Тогда запрос http://www.localserver.com для локальных клиентов попадёт прямо на 192.168.6.71 минуя раутер и прокси.
У раутера это файл /etc/hosts либо всё тот же DNS-сервер (про него ты ничего не сказал).
>Подойди к проблеме с другой стороны.
>
>Ты можешь добраться до сервера напрямую по адресу http://192.168.6.71:80. Запрети proxy для
>локальных адресов.Напрямую конечно могу, и даже без указания порта.
>Если у тебя name-based virtual server, то LAN клиенты должны знать, что
>www.localserver.com находится по адресу 192.168.6.71. Об этом им может сказать твой
>местный DNS-сервер, а может запись
>
>192.168.6.71 www.localserver.com
>
>в %SystemRoot%\system32\drivers\etc\etc\hosts у каждого клиента. Тогда запрос http://www.localserver.com для локальных клиентов попадёт
>прямо на 192.168.6.71 минуя раутер и прокси.Свой DNS-сервер поднимать не стал, решил что ни к чему он в сетке из 30 компов.
Прописывать адрес WEB-сервера в hosts на каждом компе - себе головная боль: сайт пока в разработке, и он может переехать на любой ip.>У раутера это файл /etc/hosts либо всё тот же DNS-сервер (про него
>ты ничего не сказал).Исторически :) сложилось, что имя роутера, прописанное в /etc/hosts, такое-же, как и имя сайта, который расположен внутри сетки (по адресу 192.168.6.71). А имена машин, прописанные в /etc/sysconfig/network HOSTNAME - другие. Думаю, конкретные наименования не столь важны. Но суть не в этом. Попробовал в /etc/hosts указывать запись
192.168.6.71 www.localserver.com
Помогло, после перезагрузки. Но это в корне идеологически не правильный подход, мне так кажется. Имя сайта = имени домена. Вот на роутере пингую по имени домена - пингуется локальный комп с WEB-сервером. То есть фактически я перенес домен на другой комп. А ведь на роутере вертится, кроме Squid'а, еще и Postfix. Как изменения в /etc/hosts повлияют на него? Так что самый лучший вариант - с помощью iptables перенаправить запросы запросы из локальной сети к локальному WEB-серверу на заданный комп.
> Так что самый лучший вариант - с помощью iptables
>перенаправить запросы запросы из локальной сети к локальному WEB-серверу на заданный
>комп.Как вы себе это представляете, если компы в локалке к нему обращаются напрямую, а не через шлюз?
Так что думайте сначала, потом пишите.
>Как вы себе это представляете, если компы в локалке к нему обращаются
>напрямую, а не через шлюз?
>Так что думайте сначала, потом пишите.Да нет, я такого не утверждаю. Наоборот, компы выходят в инет через Squid, и ни о каком прямом обращении нет и речи. И вот, нужно на роутере где-то завернуть запросы из локалки к определенному WEB-имени на заданный адрес внутри локалки.
если dns свой, то просто дабавь view на это зону, с локалки будет другой IP выдавать, и все будет работать правильно.
лучше всего настройте в сквиде, чтоб при обращении с локалки на это имя, он выдавал сервер в локалке.
>лучше всего настройте в сквиде, чтоб при обращении с локалки на это
>имя, он выдавал сервер в локалке.Если можно - подробнее пожалуйста.