Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    DHCP + PPTP on WAN

    Scheduled Pinned Locked Moved Russian
    402 Posts 58 Posters 461.2k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • N
      NailMan
      last edited by

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

      Вот что вышло у меня для решения проблем с линком на Билайне. Делаем 2 скрипта и добавляем их в Крон:
      1. Патчинг gatways для L2TP. Я разместил его в /root/etc/watch_gw.sh

      
      #!/bin/sh
      nslookup tp.internet.beeline.ru | grep "Address: " -m 1 | grep "ddress: " | cut -d : -f 2 | cut -c 2-13  >/tmp/l2tp0_router
      nslookup tp.internet.beeline.ru | grep "Address: " -m 2 | grep "ddress: " | cut -d : -f 2 | cut -c 2-13 >/tmp/l2tp0_defaultgw
      
      

      где  первый из полученный адресов засунется в /tmp/l2tp0_router  (как я понял это адрес шлюза), второй засунется в дефолтный шлюз( вчем между ними разница я не знаю, допирал интуитивно)

      В Кроне он запускается раз в минуту, т.е. minutes = */1, остальное *

      2. следилка за WAN. Проверяет поднят ли WAN(если нет, стартует его и l2tp вслед за ним[код использовал частично из местного солюшена]), если поднят, то проверяет наличие записей в /etc/resolv.conf и если там 2 строки - первая домен и вторая это адрес локалхоста, то гасит и подымает wan и стартует L2TP. После делает тоже самое что и watch_gw.sh (на всяк пожарный). размещается в /root/etc/watch_dns.sh

      
      #!/bin/sh
      
      wanisup=$(ifconfig ue0 | grep "UP" | cut -d "<" -f 2 | cut -d "," -f 1)
      
        if [ -z $wanisup ];
        then
          ifconfig ue0 down
          sleep 5
          ifconfig ue0 up
          sleep 10
          if [ -f /var/run/l2tp_opt1.pid ]
          then
           # If l2tp connection is down (no IP) and mpd5 for this connection is running we kill mpd
           # to be able to change connection settings, specifically l2tp peer.
           # Because if (for example) l2tp peer is down we can get different l2tp peer IP using hostname.
            res2=$(cat /var/run/l2tp_opt1.pid)
           echo "l2tp is down - killing mpd5" | logger
           echo `date` "l2tp is down - killing mpd5" >>/tmp/watch_dns.log
           kill $res2
          fi
        echo "restart l2tp by mpd5" | logger
        echo "restart l2tp by mpd5" >>/tmp/watch_dns.log
      
       /usr/local/sbin/mpd5 -b -k -d /var/etc -f mpd_opt1.conf -p /var/run/l2tp_opt1.pid -s ppp l2tpclient
       sleep 10
      
        else
         dns=$(wc -l /etc/resolv.conf | cut -d ' ' -f 8)
         dnsip=$(cat /etc/resolv.conf | grep "nameserver " | cut -d ' ' -f 2)
      
          if [ "$dns" == "2" ] && [ "$dnsip" == "127.0.0.1" ];
          then
             ifconfig ue0 down
             sleep 5
             ifconfig ue0 up
             sleep 10
              if [ -f /var/run/l2tp_opt1.pid ]
              then
                # If l2tp connection is down (no IP) and mpd5 for this connection is running we kill mpd
                # to be able to change connection settings, specifically l2tp peer.
                # Because if (for example) l2tp peer is down we can get different l2tp peer IP using hostname.
                res2=$(cat /var/run/l2tp_opt1.pid)
                echo "l2tp is down - killing mpd5" | logger
                echo `date` "l2tp is down - killing mpd5" >>/tmp/watch_dns.log
                kill $res2
              fi
                echo "restart l2tp by mpd5" | logger
                echo "restart l2tp by mpd5" >>/tmp/watch_dns.log
             /usr/local/sbin/mpd5 -b -k -d /var/etc -f mpd_opt1.conf -p /var/run/l2tp_opt1.pid -s ppp l2tpclient
             sleep 10
          fi
      
       nslookup tp.internet.beeline.ru | grep "Address: " -m 1 | grep "ddress: " | cut -d : -f 2 | cut -c 2-13  >/tmp/l2tp0_router 
       nslookup tp.internet.beeline.ru | grep "Address: " -m 2 | grep "ddress: " | cut -d : -f 2 | cut -c 2-13 >/tmp/l2tp0_defaultgw
        fi
      
      

      Соответственно ue0 - в данном случае мой физический WAN, L2tp на OPT1

      В Кроне отрабатывается раз в 2 мин, соотвественно minutes */2

      Итог работы - отследился и сбросился-поднялся физлинк и за ним L2TP при ситуации "пропадания" DNS-ов, и постоянно "держится на пульсе" гейвей. С первым скриптом не падало подряд 3 дня. Сейчас будет не падать постоянно.

      Вот как то так.

      ДА! Релиз у меня 2.1-RELEASE (i386) если это важно.

      1 Reply Last reply Reply Quote 0
      • werterW
        werter
        last edited by

        2 NailMan
        Еще раз выражаю благодарность.
        Вот уж действительно полезный пост.

        1 Reply Last reply Reply Quote 0
        • N
          NailMan
          last edited by

          @werter:

          2 NailMan
          Еще раз выражаю благодарность.
          Вот уж действительно полезный пост.

          Да не зачто, просто думаю много людей мучалось с этим провайдером и pfsense и перешло на что то другое. Почему то тот солюшен совсем у меня не заработал. Просто я бы сказал рушил всю систему работы с интерфейсами. Судя по файлу interfaces.inc в солюшене версия pfsense старей текущей 2.1 и что то не совмещается с чем то. Я нашел очень много отличий пока пробовал встроить в свой pfsense. Потому вариант с раскурочиванием системы не вариант или вариант под конкретную версию. Я не люблю такого, всегда предпочитал универсальность.

          Итак маленький апдейт сделал скрипта-следилки за dns/wan. Еще одна проблема с "Корбайном" нашлась - они сбрасывают DHCP IP на WAN, но при этом в resolv.conf не удаляются сервера dns. Предыдущий скрипт этой ситуации не ловил(ее и не случалось прежде). Потому добавил детектинг того что IP ушел, а nameserver-ы остались, ну и down/up им делаю.

          
          #!/bin/sh
          
          wanisup=$(ifconfig ue0 | grep "UP" | cut -d "<" -f 2 | cut -d "," -f 1)
          #  echo "$wanisup"
          
          if [ "$wanisup" != "UP" ]
          then
              echo `date` "WAN interface is down, up it!" >>/tmp/watch_dns.log
              echo "WAN interface is down, up it!" | logger
          #    echo "WAN interface is down, up it!"
              ifconfig ue0 up
              sleep 10
              if [ -f /var/run/l2tp_opt1.pid ]
              then
               # If l2tp connection is down (no IP) and mpd5 for this connection is running we kill mpd
               # to be able to change connection settings, specifically l2tp peer.
               # Because if (for example) l2tp peer is down we can get different l2tp peer IP using hostname.
                res2=$(cat /var/run/l2tp_opt1.pid)
               echo "l2tp is down - killing mpd5" >>/tmp/watch_dns.log
               echo "l2tp is down - killing mpd5" | logger
          #     echo "l2tp is down - killing mpd5"
               kill $res2
              fi
            echo "restart l2tp by mpd5" >>/tmp/watch_dns.log
            echo "restart l2tp by mpd5" | logger
          #  echo "restart l2tp by mpd5"
          
           /usr/local/sbin/mpd5 -b -k -d /var/etc -f mpd_opt1.conf -p /var/run/l2tp_opt1.pid -s ppp l2tpclient
          else
          #if have no WAN ip and nameservers in /etc/resolv.conf present or noit present
            waniptype=$(ifconfig ue0 | grep inet | cut -d " " -f 1 | cut -c 2-6)
          #  echo "$waniptype"
          
            if [ "$waniptype" == "inet6" ]
            then
             echo `date` "No WAN IP present! Restart WAN interface" >>/tmp/watch_dns.log
             echo "No WAN IP present! Restart WAN interface" | logger
          #   echo "No WAN IP present! Restart WAN interface"
          
                 ifconfig ue0 down
                  echo "WAN interface down..." >>/tmp/watch_dns.log
                  echo "WAN interface down..." | logger
          #        echo "WAN interface down..."
                 ifconfig ue0 up
                 sleep 10
                  echo "WAN interface up..." >>/tmp/watch_dns.log
                  echo "WAN interface up..." | logger
          #        echo "WAN interface up..."
                  if [ -f /var/run/l2tp_opt1.pid ]
                  then
                    # If l2tp connection is down (no IP) and mpd5 for this connection is running we kill mpd
                    # to be able to change connection settings, specifically l2tp peer.
                    # Because if (for example) l2tp peer is down we can get different l2tp peer IP using hostname.
                    res2=$(cat /var/run/l2tp_opt1.pid)
                    echo "l2tp is down - killing mpd5" >>/tmp/watch_dns.log
                    echo "l2tp is down - killing mpd5" | logger
          #          echo "l2tp is down - killing mpd5"
                    kill $res2
                  fi
                    echo "restart l2tp by mpd5" >>/tmp/watch_dns.log
                    echo "restart l2tp by mpd5" | logger
          #          echo "restart l2tp by mpd5"
                    /usr/local/sbin/mpd5 -b -k -d /var/etc -f mpd_opt1.conf -p /var/run/l2tp_opt1.pid -s ppp l2tpclient
            else 
          #if WAN ip is present and nameservers is lost
            dns=$(wc -l /etc/resolv.conf | cut -d ' ' -f 8)
            dnsip=$(cat /etc/resolv.conf | grep "nameserver " | cut -d ' ' -f 2)
          
              if [ "$dns" == "2" ] && [ "$dnsip" == "127.0.0.1" ]
              then
          
                 ifconfig ue0 down
                  echo "WAN interface down..." >>/tmp/watch_dns.log
                  echo "WAN interface down..." | logger
          #        echo "WAN interface down..."
                 ifconfig ue0 up
                 sleep 10
                  echo "WAN interface up..." >>/tmp/watch_dns.log
                  echo "WAN interface up..." | logger
          #        echo "WAN interface up..."
                  if [ -f /var/run/l2tp_opt1.pid ]
                  then
                    # If l2tp connection is down (no IP) and mpd5 for this connection is running we kill mpd
                    # to be able to change connection settings, specifically l2tp peer.
                    # Because if (for example) l2tp peer is down we can get different l2tp peer IP using hostname.
                    res2=$(cat /var/run/l2tp_opt1.pid)
                    echo "l2tp is down - killing mpd5" >>/tmp/watch_dns.log
                    echo "l2tp is down - killing mpd5" | logger
          #          echo "l2tp is down - killing mpd5"
                    kill $res2
                  fi
                    echo "restart l2tp by mpd5" >>/tmp/watch_dns.log
                    echo "restart l2tp by mpd5" | logger
          #          echo "restart l2tp by mpd5"
                    /usr/local/sbin/mpd5 -b -k -d /var/etc -f mpd_opt1.conf -p /var/run/l2tp_opt1.pid -s ppp l2tpclient
                fi
            fi
          fi
          
          

          Плюс оба скрипта я в Кроне раз в минуту запускаю. По статистике(по логу /tmp/watch_dns.log) игра с DNS/WAN IP у Билайна случается раз 5-6 в сутки и скрипт их успешно отрабатывает. Да, изнутри в это время падает инет, ничего тут не поделаешь. Но пока эту хрень в pfSense  не пофиксили, придется костылями довольстоваться.

          Кстати на Линукс-роутерах это как то ловится в основной массе, но вот с ситуацией когда WAN IP теряется они не справлялись у меня самостоятельно.

          1 Reply Last reply Reply Quote 0
          • L
            legven
            last edited by

            Не сочтите за рекламу, но Netgear r6300 работает с Пчилайном без проблем - Вот это загадка (( ))

            1 Reply Last reply Reply Quote 0
            • werterW
              werter
              last edited by

              @legven:

              Не сочтите за рекламу, но Netgear r6300 работает с Пчилайном без проблем - Вот это загадка (( ))

              Да за такие деньги он должен работать со всем подряд - http://hotline.ua/network-besprovodnoe-oborudovanie/netgear-r6300/ (~275 $)

              У меня с "пчелайном" и Asus RT-N12 C1\D1 за 30$ и RT-N10P за 20$ с прошивкой Tomato (Shibby's mod) как часы трудится.

              P.s. Пардон за оффтоп, я бы лучше Tenda W1800R-ую (http://hotline.ua/network-besprovodnoe-oborudovanie/tenda-w1800r/) взял. И перепрошил в Tomato. Или что-то из Mikrotik-a.
              А так - нахрена дома роутер почти за 300$? "Хороший понт - дороже денег"@ не моё.

              1 Reply Last reply Reply Quote 0
              • L
                legven
                last edited by

                А решение от асус сюда никак нельзя перенести?

                1 Reply Last reply Reply Quote 0
                • werterW
                  werter
                  last edited by

                  А то что в Асусе с Томатой на борту все же Линух (и попиленный) , а не BSD - ничего ?

                  Тем более, что ув. NailMan опубликовал вполне рабочее решение.

                  1 Reply Last reply Reply Quote 0
                  • L
                    legven
                    last edited by

                    А вот это решение http://code.google.com/p/vpnpptp/ никак нельзя под наши нужды использовать, чтобы конечному пользователю нужно было делать минимум телодвижений? (да, я понимаю, что там опять линуксы, а тут фряха)?
                    Еще вопрос - если у меня внешний статический IР, то будет ли у меня падать интернет, как описано в посте с изменением настроек/скриптами?
                    Почему я использую именно это решение - хочу после настройки попробовать отказоустойчивость и балансировку нагрузки.

                    1 Reply Last reply Reply Quote 0
                    • N
                      NailMan
                      last edited by

                      Господа! Я докладываюсь по части испытаний своих скриптиков:
                      Первоначально было 2 проблемы, из-за которых начался у меня сыр-бор - это пропадание DNS-серверов из WAN (DNS-ы у меня берутся по WAN(1) и L2TP-OPT1(2)) и "потеря" шлюза на L2TP.

                      Итоговый скрипт watch_dns.sh в результате многочисленных правок таков:

                      
                      #!/bin/sh
                      
                      #check WAN interface manipulation
                      wanisup=$(ifconfig ue0 | grep "UP" | cut -d "<" -f 2 | cut -d "," -f 1)
                        echo "$wanisup"
                      
                      if [ "$wanisup" != "UP" ]
                      then
                          echo `date` "WAN interface is down, up it!" >>/tmp/watch_dns.log
                          echo "WAN interface is down, up it!" | logger
                          echo "WAN interface is down, up it!"
                          ifconfig ue0 up
                          sleep 10
                          if [ -f /var/run/l2tp_opt1.pid ]
                          then
                           # If l2tp connection is down (no IP) and mpd5 for this connection is running we kill mpd
                           # to be able to change connection settings, specifically l2tp peer.
                           # Because if (for example) l2tp peer is down we can get different l2tp peer IP using hostname.
                            res2=$(cat /var/run/l2tp_opt1.pid)
                           echo "l2tp is down - killing mpd5" >>/tmp/watch_dns.log
                           echo "l2tp is down - killing mpd5" | logger
                           echo "l2tp is down - killing mpd5"
                           kill $res2
                          fi
                        echo "restart l2tp by mpd5" >>/tmp/watch_dns.log
                        echo "restart l2tp by mpd5" | logger
                        echo "restart l2tp by mpd5"
                      
                       /usr/local/sbin/mpd5 -b -k -d /var/etc -f mpd_opt1.conf -p /var/run/l2tp_opt1.pid -s ppp l2tpclient
                      else
                      #if have no WAN ip and nameservers in /etc/resolv.conf present or no present
                        waniptype=$(ifconfig ue0 | grep inet | cut -d " " -f 1 | cut -c 2-6)
                        echo "$waniptype"
                        l2tpexist=$(ifconfig | grep l2tp0)
                      
                        if [ "$waniptype" == "inet6" ]
                        then
                         echo `date` "No WAN IP present! Restart WAN interface" >>/tmp/watch_dns.log
                         echo "No WAN IP present! Restart WAN interface" | logger
                         echo "No WAN IP present! Restart WAN interface"
                      
                             ifconfig ue0 down
                              echo "WAN interface go down..." >>/tmp/watch_dns.log
                              echo "WAN interface go down..." | logger
                              echo "WAN interface down..."
                             ifconfig ue0 up
                             sleep 6
                              echo "WAN interface is up..." >>/tmp/watch_dns.log
                              echo "WAN interface is up..." | logger
                              echo "WAN interface up..."
                              if [ -f /var/run/l2tp_opt1.pid ] && [ "$l2tpexist" == "" ]
                              then
                                # If l2tp connection is down (no IP) and mpd5 for this connection is running we kill mpd
                                # to be able to change connection settings, specifically l2tp peer.
                                # Because if (for example) l2tp peer is down we can get different l2tp peer IP using hostname.
                                res2=$(cat /var/run/l2tp_opt1.pid)
                                echo "l2tp is down - killing mpd5" >>/tmp/watch_dns.log
                                echo "l2tp is down - killing mpd5" | logger
                                echo "l2tp is down - killing mpd5"
                                kill $res2
                              fi
                                echo "restart l2tp by mpd5" >>/tmp/watch_dns.log
                                echo "restart l2tp by mpd5" | logger
                                echo "restart l2tp by mpd5"
                                /usr/local/sbin/mpd5 -b -k -d /var/etc -f mpd_opt1.conf -p /var/run/l2tp_opt1.pid -s ppp l2tpclient
                        else 0
                      #if WAN ip is present and nameservers is lost
                        dns=$(wc -l /etc/resolv.conf | cut -d ' ' -f 8)
                        dnsip=$(cat /etc/resolv.conf | grep "nameserver " | cut -d ' ' -f 2)
                      
                          if [ "$dns" == "2" ] && [ "$dnsip" == "127.0.0.1" ]
                          then
                         echo `date` "No DNS servers present! Restart WAN interface" >>/tmp/watch_dns.log
                         echo "No DNS servers present! Restart WAN interface" | logger
                         echo "No WAN IP present! Restart WAN interface"
                      
                             ifconfig ue0 down
                              echo "WAN interface down..." >>/tmp/watch_dns.log
                              echo "WAN interface down..." | logger
                              echo "WAN interface down..."
                             ifconfig ue0 up
                             sleep 6
                              echo "WAN interface up..." >>/tmp/watch_dns.log
                              echo "WAN interface up..." | logger
                              echo "WAN interface up..."
                              if [ -f /var/run/l2tp_opt1.pid ]
                              then
                                # If l2tp connection is down (no IP) and mpd5 for this connection is running we kill mpd
                                # to be able to change connection settings, specifically l2tp peer.
                                # Because if (for example) l2tp peer is down we can get different l2tp peer IP using hostname.
                                res2=$(cat /var/run/l2tp_opt1.pid)
                                echo "l2tp is down - killing mpd5" >>/tmp/watch_dns.log
                                echo "l2tp is down - killing mpd5" | logger
                                echo "l2tp is down - killing mpd5"
                                kill $res2
                              fi
                                echo "restart l2tp by mpd5" >>/tmp/watch_dns.log
                                echo "restart l2tp by mpd5" | logger
                                echo "restart l2tp by mpd5"
                                /usr/local/sbin/mpd5 -b -k -d /var/etc -f mpd_opt1.conf -p /var/run/l2tp_opt1.pid -s ppp l2tpclient
                         else
                      
                      #check L2TP interface if WAN is up and IP exist and DNS server present but no L2TP interface exist(is down)
                        l2tpexist=$(ifconfig | grep l2tp0)
                        echo found thist -"$l2tpexist"-
                          if [ "$l2tpexist" == "" ]
                          then
                          echo matched!
                              if [ -f /var/run/l2tp_opt1.pid ]
                              then
                              echo mpd5 found!
                                # If l2tp connection is down (no IP) and mpd5 for this connection is running we kill mpd
                                # to be able to change connection settings, specifically l2tp peer.
                                # Because if (for example) l2tp peer is down we can get different l2tp peer IP using hostname.
                                res2=$(cat /var/run/l2tp_opt1.pid)
                                echo `date` "L2TP interface is not exist but WAN IP is present - killing mpd5" >>/tmp/watch_dns.log
                                echo "L2TP interface is not exist but WAN IP is present - killing mpd5" | logger
                                echo "l2tp is down - killing mpd5" >>/tmp/watch_dns.log
                                echo "l2tp is down - killing mpd5" | logger
                                echo "l2tp is down - killing mpd5"
                                kill $res2
                              fi
                                echo "restart l2tp by mpd5" >>/tmp/watch_dns.log
                                echo "restart l2tp by mpd5" | logger
                                echo "restart l2tp by mpd5"
                                /usr/local/sbin/mpd5 -b -k -d /var/etc -f mpd_opt1.conf -p /var/run/l2tp_opt1.pid -s ppp l2tpclient
                          fi
                      
                         fi
                        fi
                      fi
                      
                      

                      Он следит за пропажей DNSов, за падением L2TP, и за пропажей WAN IP(об этом спишу подробней чуть ниже). Ранее приводимый скрипт watch_gw.sh без изменений. Я их оставил разъединенными, хотя и можно объединить добавив действия watch_gw.sh в начало watch_dns.sh.

                      А теперь о главном:

                      • проблемы с потерей L2tp Gateway пропала совершенно(из всех ситуаций отслеживаемых и регистрируемых скриптом) и случаев ее появления не было замечено,
                      • проблемы с потерей DNS-серверов из WAN отмечается примерно 0.5-1% из регистрируемых срабатываний скрипта на бяку.
                      • 5% срабатываний -  это потеря L2TP-линка(сброс у провайдера), скрипт успешно его ловит и перезапускает Mpd5
                      • 94% всех срабатываний и соотвественно пересброс WAN и перезапуск L2Tp теперь у меня - это косячный DHCP-клиент самой FreeBSD  :(

                      Это стало камнем преткновения для меня и разрывает мне мозг.

                      С периодичностью 10мин-3ч, WAN интерфейс наглым образом теряет свой IP. Судя по раскопанным мной данным DHCLIENT в сборке pfsense какой то дурацкий мягко скажем. Он банально не переполучает IP после окончания срока аренды, и не может получить его сам. Причем в реалтайме это выглядит так - все работает норм, пропадает IP, но траффик какое то время через L2TP еще ходит(несколько секунд). если была открыта страница Interfaces в морже и тыкнуть Release/Renew, и WAN получит адрес снова (мне Билайн дает один и тот же адрес из их внутренней сети), а при этиом L2TP не порвется, то все фурычить будет дальше. Как это так я не понимаю логически, но факт.

                      Если отрабатывает сам скрипт, то он отлавливает пропажу IP, и все пересбрасывает. Лаг получается максимум 1мин 10 сек. Меня это пока устраивает, но крайне бесит. Пока писал этот пост, разок оно потерялось.

                      Покопал инет на тему Dhclient и понял что он какой то ущербный. В принципе есть альтернативы. Пока я копаю вот эту тему модификации DHCP
                      http://forum.ru-board.com/topic.cgi?forum=65&topic=4463

                      буду пробовать менять клиента на pfsense и тогда костыль должен заработать, но для чистого freebsd там костыль просто делается, а у нас конфиг dhclient-а виртуальный(временный), потому пришлось сделать простой костыль для костыля:  :D
                      Сделал копию генерируемого dhclient_wan.conf, добавил в него строчку

                      supersede dhcp-server-identifier 255.255.255.255; 
                      

                      и сделал скриптик

                      #!/bin/sh
                      
                      pid=$(ps -U root,admin,_dhcp | grep dhclient -m 1 | cut -d " " -f 2)
                      kill $pid
                      cp /root/etc/dhclient_wan.conf /var/etc/dhclient_wan.conf
                      dhclient ue0
                      
                      

                      который поместил в /usr/local/etc/rc.d/dhc_copy.sh

                      таким образом после загрузки убивается запущенный системой dhclient, "патчится" его конфиг и запускается вновь. Результат пока не оценил, так как этот трик родному клиенту как бы немного монопенисуален. Пока работаю над этой темой. Если поборется, то глобальная задача будет решена.

                      очень надеюсь что в новых релизах клиент будет пропатчен и будет создана возможность добавлять опциональные поля в настрйоках DHCP на WAN, как это сделано в других настройках.

                      Рассмотрел тут на днях (отчаявшись уже с dhclient) всяких современных роутеров начиная от всяких Zyxel giga и N66 до N16+Tomato - нет альтернатив pfsense чтобы реальизовать все на одном устройстве без колхозинга. Мн нужен мощный роутер(сквозные торренты на 100мбит), обязательный штатный SSH и обязательный встроенный OpenVPN до внутренней сети, особенно с внутренним скачиваемым клиентом и удобным центром сертификации. К сожалению на "аппаратные" роутеры не поставишь дополнительного софта - тупо места нет, а всякие шустрые Томаты с USB не работают, а RTN-прошивки(олеговские) только для N16 максимум существуют, и опять таки потребуется внешний диск - я от такого решения ушел как раз. К сожалению пока альтернатив нет из аппаратных ну окромя всяких микротиков может.

                      А вообще я уже к интерфейсу pfsense привык, его модульность dashboard упростила мне многое по управлению домашней сеткой извне. К примеру запуск wake-on-lan домашнего компа теперь не проблема, раньше мне приходилось сперва запускать openvpn(на HP Microserver за роутером), в режиме TAP и включать комп и потом лезть на него, теперь все обходится на одном девайсе в режиме TUN(гораздо более простом) и все само стартует в отличие когда OpenVPN на Windows(конфиг сервера не стартует сам).

                      Вобщем то решаю проблемы DHCP и надеюсь на будущее обновление.

                      1 Reply Last reply Reply Quote 0
                      • werterW
                        werter
                        last edited by

                        Однако, большой объем работ вы проделали, ув. NailMan. Большой и оч. нужный. Спасибо вам снова  ;D

                        А насчет патчинга dhcp-клиента - это надо писать в англо-ветку непосредственно разработчикам.
                        Согласен, что удобнее Pfsense (и бесплатно) сейчас решений нет. VyOS (форк Vyatta) не имеет веб-морды и возможностей меньше, Микротик - платный, Zentyal, ClearOS etc. - не совсем чистые роутеры и опять же возможности.

                        Мн нужен мощный роутер(сквозные торренты на 100мбит), обязательный штатный SSH и обязательный встроенный OpenVPN до внутренней сети, особенно с внутренним скачиваемым клиентом и удобным центром сертификации

                        Ну это почти все есть в Томато от Shibby. Ну центр сертификации не такой удобный как в пф, но ведь и клиента вы раз подключили и забыли.
                        Нужна мощная железка - http://hotline.ua/network-besprovodnoe-oborudovanie/tenda-w1800r/  + Tomato Shibby's mode или Asus RT-AC66U

                        1 Reply Last reply Reply Quote 0
                        • N
                          NailMan
                          last edited by

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

                          Попробую переставить все, восстановить текущий конфинг с морды и прикрутить мои скрипты на чистую систему и посмотрю. Попутно попробую замену dhclient  если трабла "WAN IP Loss" появится снова(а оно появится почти сразу если таки появится).

                          Менять железки на стоимостью 7к+ не вариант, шыло на мыло. Надо добить то что есть и возможно буржуям отчитаться по косякам для будущих изменений. Мне к примеру очень нравится Asus N16 в качестве точки доступа - она везде просвечивает в квартире и работает как часы как отдельный девайс.

                          1 Reply Last reply Reply Quote 0
                          • V
                            vktRus
                            last edited by

                            Настроил подключение по IP, не по hostname. Назову его IPROUTE. Распишу подробно рабочее решение, потому что с подключением по hostname, видимо, надолго всё затягивается.

                            • Interfaces - assign. Настраиваю интерфейс WAN - DHCP.

                            • Interfaces - assign - PPPs. Создаю подключение PPP с линком на созданный выше WAN, не на сетевую карту. Вместо hostname указываю IP шлюза IPROUTE. Узнать его можно Diagnostic - DNS Lookup.

                            • Interfaces - assign. Создаю новый интерфейс PPTP. Там автоматом подставятся настройки PPP, созданного выше.

                            • System - Routing. Ставлю default на интерфейс PPTP.

                            • System - Routing - Routes. Добавляю маршрут до шлюза PPTP. Destination network — IPROUTE/32. Gateway — интерфейс WAN - DHCP.

                            1 Reply Last reply Reply Quote 0
                            • N
                              NailMan
                              last edited by

                              Итак, Господа, есть некоторые новости с решением проблемы потери WAN IP и-за несовершенства dhclient и довольно неожиданные.

                              1. Попробовал я сделать подмену штатного dhclient на альтернативный ISC Dhclient. Так как в pfsense конфиги генерируемые, пришлось ставить костыль и подменять конфиг на тот что для нового dhclient катит(его полностью переписал по мануалу на базе дефолтного от ISC), заменой путей не очень получилось сделать подмену, так как rc.conf у pfsense тоже нет в прямом смысле(в штатном месте). Короче, я решил сделать прямую замену бинарников. заменил сам dhclient без его комплектного скрипта. Увы не заработало, поменял еще и скрипт, тоже не заработало. Проблема в том что у альтернативы ключ указания конфига в параметре запуска программы чуть иной(-cf вместо -c у родного), потому для такой замены палюбас придется копать глубоко те строки запуска где он вызывается, плюс из-за нестандартной структуры размещения файлов dhcliet-scrript надо тоже переделывать глубоко.

                              Буду все таки попозже копать это дело и сперва поизучаю структуру файлов самого pfsense, так как решения для чистого freebsd тут не катят увы.

                              2. После того как я переломал свой pfsense в результате подмены dhclient, я сделал восстановление системы. Я делал штатный бэкап из морды еще до извращений. Из packages был Крон, ОпенВПН клиенты и из консоли поставлен MC. С переустановил pfsense с LiveCD, преднастроил внутренний Айпишник и включил dhcp-сервер и через морду залил конфиг pfsense. После установки конечно же потеря WAN IP продолжила появляться, НО! она теперь случается не каждый час, или даже минут 20-30 что раздражало, а с промежутками 3-6-8ч! При этом я особо ничего не делал. Стало почти нормально и приемлемо.

                              Плюс я переписал свой скрипт с использованием функций(для большей читаемости) и объединил все в одно

                              #!/bin/sh
                              
                              restart_wan() {
                              
                                     ifconfig ue0 down
                                      echo "WAN interface go down..." >>/tmp/watch_dns.log
                                      echo "WAN interface go down..." | logger
                                      echo "WAN interface go down..."
                                     ifconfig ue0 up
                                      echo "WAN interface go up..." >>/tmp/watch_dns.log
                                      echo "WAN interface go up..." | logger
                                      echo "WAN interface go up..."
                                     sleep 6
                              }
                              
                              restart_mpd() {
                                    if [ -f /var/run/l2tp_opt1.pid ]
                                    then
                                     # If l2tp connection is down (no IP) and mpd5 for this connection is running we kill mpd
                                     # to be able to change connection settings, specifically l2tp peer.
                                     # Because if (for example) l2tp peer is down we can get different l2tp peer IP using hostname.
                                       res2=$(cat /var/run/l2tp_opt1.pid)
                                       echo "l2tp is down - killing mpd5" >>/tmp/watch_dns.log
                                       echo "l2tp is down - killing mpd5" | logger
                                       echo "l2tp is down - killing mpd5"
                                      kill $res2
                                    fi
                                    echo "restart l2tp by mpd5" >>/tmp/watch_dns.log
                                    echo "restart l2tp by mpd5" | logger
                                    echo "restart l2tp by mpd5"
                                    /usr/local/sbin/mpd5 -b -k -d /var/etc -f mpd_opt1.conf -p /var/run/l2tp_opt1.pid -s ppp l2tpclient
                              }
                              
                              nslookup tp.internet.beeline.ru | grep "Address: " -m 1 | grep "ddress: " | cut -d : -f 2 | cut -c 2-13  >/tmp/l2tp0_router 
                              nslookup tp.internet.beeline.ru | grep "Address: " -m 1 | grep "ddress: " | cut -d : -f 2 | cut -c 2-13  >/tmp/l2tp0_defaultgw
                              
                              #check WAN interface manipulation
                              wanisup=$(ifconfig ue0 | grep "UP" | cut -d "<" -f 2 | cut -d "," -f 1)
                              
                              if [ "$wanisup" != "UP" ]
                              then
                                    echo `date` "WAN interface is down, up it!" >>/tmp/watch_dns.log
                                    echo "WAN interface is down, up it!" | logger
                                    echo "WAN interface is down, up it!"
                                    ifconfig ue0 up
                                    sleep 6
                                    restart_mpd
                              else
                                 #if have no WAN ip and nameservers in /etc/resolv.conf present or no present
                                  waniptype=$(ifconfig ue0 | grep inet | cut -d " " -f 1 | cut -c 2-6)
                                   if [ "$waniptype" == "inet6" ]
                                   then
                                    echo `date` "No WAN IP present! Restart WAN interface" >>/tmp/watch_dns.log
                                    echo "No WAN IP present! Restart WAN interface" | logger
                                    echo "No WAN IP present! Restart WAN interface"
                                    restart_wan
                                    restart_mpd
                                   else
                              #if WAN ip is present and nameservers is lost
                                    dns=$(wc -l /etc/resolv.conf | cut -d ' ' -f 8)
                                    dnsip=$(cat /etc/resolv.conf | grep "nameserver " | cut -d ' ' -f 2)
                                      if [ "$dns" == "2" ] && [ "$dnsip" == "127.0.0.1" ]
                                      then
                                       echo `date` "No DNS servers present! Restart WAN interface" >>/tmp/watch_dns.log
                                       echo "No DNS servers present! Restart WAN interface" | logger
                                       echo "No WAN IP present! Restart WAN interface"
                                        restart_wan
                                        restart_mpd
                              
                                      else  
                              #check L2TP interface if WAN is up and IP exist and DNS server present but no L2TP interface exist(is down)
                                        l2tpexist=$(ifconfig l2tp0)
                                        if [ -n $l2tpexist ]
                                        then
                                          echo `date` "L2TP interface not exist. Propably MPD5 not started" >>/tmp/watch_dns.log
                                          echo "L2TP interface not exist. Propably MPD5 not started" >>/tmp/watch_dns.log | logger
                              	    echo "L2TP interface not exist. Propably MPD5 not started" >>/tmp/watch_dns.log
                                           restart_mpd
                                        fi
                                      fi
                                   fi
                              fi
                              

                              Кстати установленная Самба очень помогает обмениваться с pfsense конфигами. Вручную вставлять - вставляется криво в части разметки строк.

                              Единственное - при запуске из консоли на что то ругается, но на что я не понимаю, так как все декларации делал по мануалу. На работоспособности это не отразилось. Если кто понимает в скриптах shell просьба указать мою синтаксическую ошибку.

                              1 Reply Last reply Reply Quote 0
                              • N
                                NailMan
                                last edited by

                                Итак коллеги я тут решительно поборол все свои глюки и недочеты в pfSense и могу поделиться выводами:
                                1. Все мои траблы с пропажей WAN IP на физ. интерфейсе до провайдера были исключительно траблами с внешней USB-сетевой картой на компике-роутере. Она или сбойная была или это особенности именно USB-сетевух. DHCP в сборке pfSense эти особенности не понимал и потому терялось. Видимо по той же причине были отмечены периодическое появление жутких пингов до провайдера(обычно 1.5мс, которые вырастали до 75-100мс).

                                Из-за подозрений насчет сетевухи я взял и поменял полностью платформу на роутер. Взял материнку с распаянным процом GA-C1037UN-EU и маленький корпус под Micro-ITX. На материнке штатные 2 порта гигабитных(2x Realtek 8111f). pfSense встал как родной, все определилось, лишнее в Биосе выключил.

                                В результате роутер стал просто шоколадкой! Никаких проблем с удержанием физ. линка, никаких отвалов L2TP! Оччччень шустрый, пинг до шлюзов WAN и L2TP железно 0.5-1.5мс.
                                Celeron 1037U имеет широчайший диапазон по технологии SpeedStep и в основном частота проца pfSensе'ом держится на уровне 200-700мгц, редко подпрыгивая до 1.2ггц при рендере RRD-Tool-ом графиков статистики и производительности. При этом сквозь роутер идут торренты на скорости 80мбит по L2TP! Температура в среднем 28-30С на проце.

                                железом я очень теперь доволен. Вышло мне в 4тыр за платформу с 2Гб памятю+2тыр за корпус, диск у меня был. Производительность чумовая.

                                2. Чехарда с L2TP GateWay's еще есть, потому скрипт по сути отрабатывает nslookup и подсовывает в текущие настройки соединения. За 9 часов аптайма после единственной перезагрузки роутера скрипт "по-боевому" (пересброс wan/l2tp) не срабатывал.

                                Таким образом решение pfSense+L2TP+Beeline можно считать готовым к жизни. Залог удачи - железо и отсутствие всяких внешних сетевух. Траблы с Билайном решаются моим скриптом. В случае "тухлого" железа решается пересбросами интерфейсов, а сама чехарда с помощью трика с nslookup.

                                3. В целом можно и не делать трик со скриптом. Я в настройках прописал адрес часто "встречающегося"  по nslookup-у гейта, и просидел на жестко-прописанном его IP часа 3-4 без каких то траблов, однако скрипт все таки свой включил на всяк пожарный.

                                1 Reply Last reply Reply Quote 0
                                • A
                                  aleksvolgin
                                  last edited by

                                  При этом сквозь роутер идут торренты на скорости 80мбит по L2TP!

                                  Слабоват результат, для такого мощного железа.

                                  1 Reply Last reply Reply Quote 0
                                  • N
                                    NailMan
                                    last edited by

                                    В чем слабоват?
                                    Вот графики по сегодняшнему вечернему периоду
                                    http://nailalex.dyndns.org/zakroma/photos/2014-02-04_221048.jpg

                                    1 Reply Last reply Reply Quote 0
                                    • R
                                      redbass
                                      last edited by

                                      Настроил соединяется…. только скорость всего 21-22 мега бита из тарифных 70

                                      Куда копать? кто виноват?

                                      Работает так GA-C1037UN-EU > win7 > virtualbox 3.8.1 > pfsense 2.1
                                      сетевухи в виртуалке intel pro 1000 mt

                                      настройки как тут - http://habrahabr.ru/sandbox/52837/

                                      1 Reply Last reply Reply Quote 0
                                      • werterW
                                        werter
                                        last edited by

                                        Ставьте на реальное железо. Сетевые должны быть гигабитные и лучше , чтобы Intel.

                                        1 Reply Last reply Reply Quote 0
                                        • G
                                          gr0mW
                                          last edited by

                                          @redbass:

                                          Настроил соединяется…. только скорость всего 21-22 мега бита из тарифных 70

                                          Куда копать? кто виноват?

                                          Работает так GA-C1037UN-EU > win7 > virtualbox 3.8.1 > pfsense 2.1
                                          сетевухи в виртуалке intel pro 1000 mt

                                          настройки как тут - http://habrahabr.ru/sandbox/52837/

                                          Там по ссылке  настроено на реальном железе.
                                          Попробуйте на virtualbox настроить  WAN интерфейс как сетевой мост.
                                          У меня какое-то время работал  PF на virtualbox в 7-е. Проблем со скоростью не было.

                                          1 Reply Last reply Reply Quote 0
                                          • R
                                            redbass
                                            last edited by

                                            @gr0mW:

                                            Попробуйте на virtualbox настроить  WAN интерфейс как сетевой мост.
                                            У меня какое-то время работал  PF на virtualbox в 7-е. Проблем со скоростью не было.

                                            естественно WAN настроен как мост. А клиент тоже гостевая система в VirtualBox, но уже через виртуальную сеть.

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.