Выборочная переадресация 2


  • Всех приветствую, уважаемые дамы и господа!
    Всплыл очень старый вопрос (даже тему залочили педыдущую), собственно, с той же задачей.
    Требуется все запросы от всех адресов дефолтно перенаправлять на отдельный веб-сервер(на его 80й порт). По сути, все не учтенные ип-адреса должны любом запросе попадать только туда.

    (да,я понимаю, это фактически captive portal, но он не подходит)
    и очень хочется слезть со связки squid+squidguard, так как у нее в качестве этой единственной задачи, на мой взгляд, есть ряд серьезных недостатков.

    не могу соорудить корректные правила редиректа. пусть даже не в вебе.

    Судя по man'y pf, ребуется сделать что-то типа:
    rdr on $int_if proto tcp from $int_net to $ext_if port 80 -> $server
    no nat on $int_if proto tcp from $int_if to $int_net
    nat on $int_if proto tcp from $int_net to $server port 80 -> $int_if

    Cейчас могу перенаправить на локальный веб, поседством:
    rdr on $int_if proto tcp from $lan_net to any -> 127.0.0.1 port 80

    Надо только нат прикрутить, чтобы тоже, только на внешний сервак..
    Да вот как-то не выходит совсем, аж стыдно.

    Выручите, знатоки pf'a, очень вас прошу. Уже кучу времени на это убил, а результа все нет.


  • А средствами virtualhost
    http://thin.kiev.ua/index.php?option=com_content&view=article&id=464:vhost&catid=50:pfsense&Itemid=81

    Или ежели уже на внутренний веб есть форвард, средствами хтмл

    1. Переадресация на нужный нам адрес
    В файле index.php прописываем


  • @dr.gopher:

    А средствами virtualhost
    http://thin.kiev.ua/index.php?option=com_content&view=article&id=464:vhost&catid=50:pfsense&Itemid=81

    Или ежели уже на внутренний веб есть форвард, средствами хтмл

    1. Переадресация на нужный нам адрес
    В файле index.php прописываем

    Хм, а не совсем понимаю зачем в примере по ссылке хосты поднимаются на внешнем интерфейсе? Предполагается, что это белый адресс и он видится из интернета?
    И если мы делаем переадресацию наоборот (из локальной сети), то сервер висит, соответственно, на локальном интерфейсе. Все верно?

    Но, по сути, тут без файрвольного редиректа не обойтись(сам lighthttpd, насколько я знаю, не умеет переадресовывать). А при успешной реализации редиректа - vhosts уже не нужны.
    Это, по сути, просто веб-сервер.

    Тогда уж nginx ставить лучше, там встроенные средства редиректа. Но это все дополнительная нагрузка и лишние элементы.


  • @goliy:

    Хм, а не совсем понимаю зачем в примере по ссылке хосты поднимаются на внешнем интерфейсе?

    При попытке создания виртуального хоста на лан интерфейсе на 80 порту, П.Ф. ругался:

    Potential DNS Rebind attack detected, see http://en.wikipedia.org/wiki/DNS_rebinding
    Try accessing the router by IP address instead of by hostname.

    @goliy:

    И если мы делаем переадресацию наоборот (из локальной сети), то сервер висит, соответственно, на локальном интерфейсе. Все верно?

    Да верно. Похоже пакет виртуал хост слушает лан и ван.

    @goliy:

    Тогда уж nginx ставить лучше, там встроенные средства редиректа. Но это все дополнительная нагрузка и лишние элементы.

    Вам решать. Я лишь предложил вариант. :-)


  • Подскажите, пожалуйста, что может быть не так:
    правило
    rdr on em1 proto tcp from 1.0.0.0/29 to any port 80 -> 1.0.0.1 port 8001 (создается в Firewall -.>NAT -> Port Forward)
    Правило работает хорошо, может редиректить любые запросы на нужный порт. Дело за малым
    Ставлю vhosts, он работает на ура, но при переадресации какая-то шляпа..

    Т.е., фактически, на какой бы порт я не перевесил админку - на нее я могу переслать запрос (1.0.0.1:2222), но как я ни старался редирект на порт 2222 хоста abc, который прописан в dns как 1.0.0.1, не проходит.  точнее на сервер мы попадаем, но вместо страницы видим печальный 404 - Not Found (локального сервера) Есть особенность, что ту же страницу 404 можно увидеть при редиректе на локалхост в случае попытке входа в не дефолтную на сервере локацию, т.е. любое место кроме hostname.domain (прим, c ya.ru переадресация работает, а  с ya.ru/*/ уже 404)
    Короче, что-то не так с vhost'ом, мне кажется, он не может обработать запрос типа 1.0.0.1:port, такое ощущение, что он его заменяет на что-то, получается редирект видит 404

    Пол ночи голову ломаю - все не могу придумать, что же это.. Неужели придется доп. веб-сервер ставить для одной страницы.?!


  • Вы редиректите IP, а вхост ждет доменное имя. :-(
    Думаю должна быть дефолтовая дириктория, куда можно зайти по ip.


  • @dr.gopher:

    Вы редиректите IP, а вхост ждет доменное имя. :-(
    Думаю должна быть дефолтовая дириктория, куда можно зайти по ip.

    Именно так -) сегодня пол дня пытался понять и подкрутить и из дефолтной директории все заработало. Отлично!
    Кому интересно, после стандартного добавления хоста, заходим в конфиг файл и правим (/var/etc/vhosts-http.conf):

    $SERVER["socket"] == "lan_if_ip:8001" {
    $HTTP["host"] == "info" {                                                      #находим имя созданного ранее хоста       
    server.document-root        = "/usr/local/www"                  #меняем тут папку на указанную
    }
    }
    url.rewrite-once = ("^/(.*)$" => "/info.php")                                      #эта регулярка позволит нам по любому адресу попадать на указанную страницу (конечно, там ее надо создать самому =)

    сохраняем, перезапускаем сервис и вуаля - все работает!

    Да, вот правило фаервола для редиректа:
    no rdr on $lan_if proto tcp from <test>to any port = http
    rdr on $lan_if inet proto tcp from $lan_subnet to any port = http -> $web_serv_ip port 8001

    Первое правило позволяет пропускать группу разрешенных адресов</test>


  • @goliy:

    Да, вот правило фаервола для редиректа:
    no rdr on $lan_if proto tcp from <test>to any port = http
    rdr on $lan_if inet proto tcp from $lan_subnet to any port = http -> $web_serv_ip port 8001</test>

    Стесняюсь спросить, а куда его вставлять (где его прописывать)? :-)
    Рад что у Вас вс


  • @dr.gopher:

    Стесняюсь спросить, а куда его вставлять (где его прописывать)? :-)

    Я же уже описывал в посте выше:
    Firewall -.>NAT -> Port Forward, жмем плюс,лан интерфейс,tcp, сурс - лан подсеть, дестанэйшен - хттп, таржет ип - локальный адресс веб-сервера(в случае vhosts лан адресс машины-пф), редирект порт - тот порт, на котором висит vhost (в моем случае 8001, стандартный)
    проверяем правило в command prompt , pfctl -sa | grep rdr , там должно появиться правило, как я приводил в посте выше. Если правило такое, и vhosts работают по айпи-адресу (т.е. в строке браузера введя именно ИП:порт и попадаем на нужную страницу), то переадресация будет работать!  и никаких сквидов, сквидгвардов, каптив порталов и прочей лабуды =)_


  • @goliy:

    Требуется все запросы от всех адресов дефолтно перенаправлять на отдельный веб-сервер(на его 80й порт). По сути, все не учтенные ип-адреса должны любом запросе попадать только туда.

    Все неучтенные….

    Я так понимаю, что учтенные это зарезервированные в дхцп и имеющие право работать в сети. А как вы сделаете, чтобы они (зарезервированные) не попадали под правило форварда и не попадали на веб страничку вхоста?


  • @dr.gopher:

    @goliy:

    Требуется все запросы от всех адресов дефолтно перенаправлять на отдельный веб-сервер(на его 80й порт). По сути, все не учтенные ип-адреса должны любом запросе попадать только туда.

    Все неучтенные….

    Я так понимаю, что учтенные это зарезервированные в дхцп и имеющие право работать в сети. А как вы сделаете, чтобы они (зарезервированные) не попадали под правило форварда и не попадали на веб страничку вхоста?

    http://forum.pfsense.org/index.php/topic,47447.msg250168.html#msg250168

    @goliy:

    Да, вот правило фаервола для редиректа:
    no rdr on $lan_if proto tcp from <test>to any port = http
    rdr on $lan_if inet proto tcp from $lan_subnet to any port = http -> $web_serv_ip port 8001
    Первое правило позволяет пропускать группу разрешенных адресов</test>

    По сути, в веб-интерфейсе там же, где создавали редирект, нужно щелкнуть на + от правила редиректа, и включить галку на No rdr, заменить lan subnet на нужный алиас. Переместить это правило Перед правилом редиректа.


  • Опробовал и описал. Возможно кто-то найдет применение данному решению
    http://thin.kiev.ua/index.php?option=com_content&view=article&id=550:pf-vhost&catid=50:pfsense&Itemid=81


  • Проблема затерания файла после перезагрузки элегантно решается установком флага "неизменяемости" следующим образом:
    chflags uchange /var/etc/vhosts-http.conf