28 окт. 2014 г.

Передача статических маршрутов в pptp-туннеле

Думал я, что сабж при использовании pptp vpn невозможен. Оказалось, ошибался. Да, сам ppp-протокол не умеет передавать при соединении маршруты. Однако, при установлении соединения клиентом в туннель посылаются запросы DHCPINFORM, с помощью которых ему можно вернуть практически любой dhcp-option, включая информацию о маршрутах!
Для этого, во-первых, нам потребуется dhcp-сервер. В моем случае имеется уже работающая инфраструктура доступа к ресурсам локальной сети через pptp, поэтому pptpd и dnsmasq уже подняты и выполняют свои функции. В конфигурационный файл dnsmasq.conf добавился следующий блок:
##pptp-vpn
listen-address=192.168.30.1
dhcp-range=pptp,192.168.30.100,192.168.30.120,255.255.255.0,1h
dhcp-option=tag:pptp,vendor:MSFT,2,1i
dhcp-option=tag:pptp,6,192.168.30.1
dhcp-option=tag:pptp,249,192.168.11.0/24,192.168.30.1,192.168.13.0/24,192.168.30.1
где:
listen-address - локальный адрес серверного конца vpn-туннеля (localip в /etc/pptpd.conf)
dhcp-range=pptp,... - объявление нового диапазона с отдельным тегом, дабы не затрагивать настройки других dhcp-зон.
dhcp-option=tag:pptp,vendor:MSFT,2,1i - спецопция для MS dhcp-клиента, говорящая ему делать dhcp-lease при выключении
dhcp-option=tag:pptp,6,192.168.30.1 - указание DNS-сервера
dhcp-option=tag:pptp,249,... - спецопция для MS dhcp-клиента, передающая статические маршруты (если среди клиентов есть Linux\MacOS, следует добавить dhcp-option=121 с аналогичным содержанием)
Далее проверяем корректность внесенных изменений с помощью dnsmasq --test и если все хорошо, перезапускаем демона для применения настроек. DHCP готов к работе.
Чтобы до него долетели DHCPINFORM пакеты от клиентов, в /etc/ppp/pptpd-options добавляется (или раскомментируется) опция proxyarp. Никаких дополнительных настроек не требуется. После перезапуска pptpd можно проверять работоспособность.
В результате при поднятии vpn-туннеля в таблице маршрутизации клиента должны появиться дополнительные маршруты, а ifconfig покажет для соответствующего интерфейса отдельный dns-сервер. Примерно так:
IPv4 таблица маршрута
=========================================================
Активные маршруты:
Сетевой адрес           Маска сети      Адрес шлюза       Интерфейс  Метрика
   <.....skip......>
  192.168.30.0     255.255.255.0     192.168.30.1  192.168.30.111     21
  192.168.30.111 255.255.255.255  On-link           192.168.30.111    276
  192.168.11.0     255.255.255.0      On-link           192.168.30.111     21
  192.168.11.255 255.255.255.255  On-link           192.168.30.111    276
  192.168.13.0     255.255.255.0      On-link           192.168.30.111     21
  192.168.13.255 255.255.255.255  On-link           192.168.30.111    276
<.....skip......>
=========================================================
Постоянные маршруты:
  Отсутствует


7 окт. 2014 г.

sendemail ssl error

Продолжая ворошить старые скрипты, уже в другом месте и по другому поводу столкнулся с проблемой следующего плана: для отправки email-сообщений с вложениями из тела скрипта используется функция, вызывающая sendеmail с нужными параметрами:
function file2email        {
     if [ -e $FILE ]; then
          echo "Sending..." >> /var/log/send.log
           /usr/bin/sendemail -f script@example.org -t admin@example.org \
                -m "You received file $FILE from $USER"  \
                 -a $FILE -o tls=yes -s smtp.example.org \
                 -xu script@example.org -xp secretpass \
                 -u "File from $USER" -l /var/log/sendemail.log
     fi
      }
 И при переносе функция сломалась:
invalid SSL_version specified at /usr/share/perl5/IO/Socket/SSL.pm line 332
На просторах Сети нашлась таблетка: в строке 1490 вышеуказанного файла заменить строчку

m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))$}i
на строчку
m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))}i 
Благодарность неизвестному мне товарищу =)