Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  frox
  SARG
  samba & ClamAV
  named
  proftpd
  cacti
  SAMBA+AD+NT ACL
  MySQL
  hylafax
  DDNS+DHCP
  cvsupd
  Samba как PDC
  Основы LDAP
  LDAP+SSL
  LDAP auth
  knockd
  rsync
  MRTG
  Rejik
  Jabber - OpenFire
  Samba(PDC) + Ldap
  squid+AD
  ATSlog
  vsftpd
  LDAP: samba, dns, dhcp
  Free-SA
  cups-samba на samba+AD
  irc + services
  Nagios - мониторинг сети
  TeamSpeak
  icecast2
  verlihub (p2p)
  Icecast2 + Darkice
  OOPS
  vsftpd + mysql
  Amanda
  HAVP
  Рыбалка на FreeBSD
  DNS сервер NSD
  DNS сервер Unbound
  mpd5, msmtp, dynamic ip
  ProFTPd + LDAP
  OpenVPN + LDAP
  Samba (PDC+BDC)
  BIND & AD
  POWERDNS
  3proxy
  eGroupWare
  GLPI
  SugarForge CRM
  Bacula
  Mysql - базовое описание
  Asterisk IP PBX
  Samba & CUPS & AD & ACL
  SMSTools 3
  Samba+ NT ACL
  phpmyadmin
  1С:Предприятие 8.1
  PurefFTPd
  qemu network
  AimSniff
  comms/scmxx
  Zoneminder
  Openfire Jabber Server
  Zoneminder 2
  Принт-Сервер Samba+LPD & AD
  Кластер OpenLDAP 2.4
  Lightsquid
  Установка Zabbix-1.6
  Установка net2ftp
  VSFTPD + AD && MySQL
  Network UPS Tools
  mpd5 L2TP client
  Apache 2.2 as a proxy
  ejabberd+mysql+icq
  HotSpot
  Установка и использование Zenoss на FreeBSD 7.2
  mysql-proxy
  DNS zones
  squid+sams+sqstat
  transmission-daemon
  Squid+AD (group access)
  SysAid Server
  MySQL Master+Master
  proftpd file auth&quota
  usb_modeswitch
  NSDadmin
  iperf Тест скорости между хостами
  Простой факс-сервер mgetty+sendfax
  SQUID-MultiCpuSystem
  vsftpd + system users
  Syslog server
  Температура в серверной
  Nagios+Digitemp
  Avast! FreeBSD
  Настройка git+gitosis
  Firefox SyncServer
  Scan+Print server FreeBSD 9
  proftpd,pgsql,web
  почтовые системы
  Шелезяки
  Мелочи
  Файловая система
  WWW
  Security
  system
  Games Servers
  X11
  Programming
Очумелые Ручки
OpenBSD
Cisco


www.lissyara.su —> статьи —> FreeBSD —> программы —> mpd5, msmtp, dynamic ip

Настройка mpd5, msmtp и Perl-скрипт для определения динамического IP-адреса сервера

Автор: Dorlas.


Данная задача у меня возникла по следующим причинам: Провайдер дает подключиться к безлимитному тарифу, НО не предоставляет статический IP-адрес. А посколько сервер будет стоять далеко от меня - мне необходимо всегда знать, какой у него IP-адрес сейчас (чтобы подключиться и поставить что-либо на закачку :)).

Идея возникла почти сразу - отсылать эту информацию на e-mail - реализация ниже:

1. Сначала подключим сервер к Интернет используя mpd5:

1.1. Установим VPN-клиент:
cd /usr/ports/net/mpd5/
make install clean

1.2. Теперь настроим автозапуск в /etc/rc.conf:
echo 'mpd_enable="YES"' >> /etc/rc.conf

1.3. Теперь создадим конфигурационный файл и пропишем его содержимое:
cd /usr/local/etc/mpd5/
touch mpd.conf

Содержимое файла mpd.conf:

startup:
        set user root air-admin
        set console self 127.0.0.1 5005
        set console open
        set web self 127.0.0.1 5006
        set web open
 
default:
        load dialup
 
dialup:
        create bundle static B1
        set iface route default
        set ipcp ranges 0.0.0.0/0 0.0.0.0/0
        create link static L1 pptp
        set link action bundle B1
        set auth authname "xxxxxxx"
        set auth password "yyyyyyy"
        set link max-redial 0
        set link mtu 1460
        set link keep-alive 20 75
        set pptp peer zzz.zzz.zzz.zzz
        set pptp disable windowing
        open

1.4. Теперь осталось запустить стартовый скрипт и убедиться, что IP-адрес от провайдера мы получили:

/usr/local/etc/rc.d/mpd5 start

2. Теперь установим и настроим программу msmtp - с помощью нее мы сможем отправлять письма на Gmail-овский ящик (с использованием учетки от него же) :) Данные по настройки брались отсюда: ссылка

2.1. Установим msmtp:
cd /usr/ports/mail/msmtp/
make WITH_GNUTLS=YES
make install clean

2.2. Для работы с TLS создадим папку с сертификатом в домашнем каталоге:
cd ~
mkdir .certs
cd .certs
touch ThawtePremiumServerCA.crt

2.3. Содержимое сертификата:

-----BEGIN CERTIFICATE-----
MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
-----END CERTIFICATE-----

2.4. Теперь создаем конфигурационный файл для msmtp:

cd ~
touch .msmtprc
chmod 600 .msmtprc

2.5. Его содержимое:

account default
host smtp.gmail.com
port 587
from vershinin.e@gmail.com
tls on
tls_starttls on
tls_trust_file ~/.certs/ThawtePremiumServerCA.crt
auth on
user vershinin.e
password **********
logfile ~/.msmtp.log

2.6. На этом этапе стоит проверить, работает ли Интернет и отсылка писем :) - пробуем:
echo "Subject: test mail" | msmtp vershinin.e@gmail.com

Если пришло письмо - значит первые 2 этапа успешно завершили - теперь самое главное - написать скрипт детектирования смены IP-адреса - вариантов тут полным полно - я как всегда пошел сложным путем :)

3. Настроим журнализирование MPD:

3.1. Создаем файл mpd.log:
touch /var/log/mpd.log

3.2. Добавляем в файл /etc/syslog.conf строки:

!mpd
*.*                                             /var/log/mpd.log

3.3. Перезапускаем службу журнализирования:
/etc/rc.d/syslogd reload

4. Пишем скрипт - у меня он лежит тут: /root/Scripts/

cd /root/Scripts/
touch mail reconnect sending.pl

Содержимое скрипта sending.pl (стиль конечно ужос - ну как смог :) ):

#!/usr/local/bin/perl

$if_up = `grep "IFACE: Up event" /var/log/mpd.log > /root/Scripts/reconnect`;
$reconnect = `cat /root/Scripts/reconnect`;
if ($reconnect ne "") {
                $my_ip = `ifconfig ng0 | grep "inet" | cut -d " " -f 2`;
                open (MAILFILE, '>/root/Scripts/mail');
                print MAILFILE "To: vershinin.e\@gmail.com\n";
                print MAILFILE "Subject: My new IP!\n\n";
                print MAILFILE $my_ip;
                close (MAILFILE);
                `echo -n > /var/log/mpd.log`;
                `cat /root/Scripts/mail | /usr/local/bin/msmtp vershinin.e@gmail.com`;
                }

Теперь поясню, как работает скрипт:

 4.1. Ищем в /var/log/mpd.log строки IFACE: Up event - они означают, что MPD переустанавливал VPN-подключение (причин может быть несколько)
 4.2. Результат поиска загоняем в файл reconnect
 4.3. На основе переменной сравнения с файлом reconnect предпринимаем ряд действий, в случае, если VPN-соединение передергивалось:
      * Определяем текущий IP-адрес и заносим его в переменную
      * В файле mail формируем шаблон письма, содержащий новый IP-адрес сервера
      * С помощью msmtp отправляем письмо с данными на e-mail
      * Обнуляем журнал /var/log/mpd.log

Теперь остается только загнать скрипт /root/Scripts/sending.pl в Cron (например с максимальной частотой):

crontab -e
* * * * * /root/Scripts/sending.pl

Теперь с интервалом в 1 минуту скрипт будет тестировать изменения в журнале и, в случае обнаружения смены IP-адреса, будет слать письмо :)

Отступление:
1) Почему использовал почту (ведь еще есть простой вариант с использованием ICMP - просто по Cron пинговать что-нибудь) - собственно этот вариант я тоже использую, но у него есть один недостаток - необходимо иметь то, что можно пинговать (и доступ туда) :) Мне же хотелось полностью автономный вариант.
2) Возможно возникнут вопросы, почему использовал Gmail и гемор с TLS :) Отвечаю - Gmail у меня есть на телефоне (в виде JAVA DIMP) - крайне удобная вещь, в Gmail есть нормальные правила (письма с IP-ками будут автоматически складываться в отдельную папку) и используя этот клиент я экономлю трафик (т.к. мне на телефон не будут качаться все письма - интересует лишь последнее :))



размещено: 2008-07-07,
последнее обновление: 2008-07-07,
автор: Dorlas

оценить статью:

skif, 2008-07-08 в 11:01:17

а что нить типа no-ip.org?:) гораздо удобнее:)

Dorlas, 2008-07-08 в 11:17:23

Ну и опять получается зависимость от внешнего сервиса :)

Хотя идея хорошая - спасибо - опробую на досуге :)

mr_gfd, 2008-07-08 в 11:40:54

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

artech, 2008-07-08 в 12:32:33

А почему бы просто не написать скрипт который будет получать текущий IP, сравнивать его со старым значением (сохранять скажем во внешний файл), и в случае несовпадения отправлять письмо. Все это дело, опять же, запихать в cron. Эффект тот же.

mr_gfd, 2008-07-08 в 12:33:44

[11:33][webserver][/home/mike/scripts]>cat ipgrep.pl
#!/usr/bin/perl -w

use strict;
use warnings;

my $file="~/mail";
#
# Listen for input
#
while (<>) {
       if ($_ =~ /IFACE: Up event/;)
               #my $ip = `/usr/bin/wget -o /dev/null -O - http://ip.dnsexit.com/`;
               my @lines = `ifconfig wan0`;
               foreach my $line (@lines) {
                       $line =~ /inet\s+(\d+.\d+.\d+.\d+)\s+(.*)/;
                       open (FH, ">$file") || die "File $file open error $!\n";
                       my $sysname = `uname -n`;
                       print FH "$sysname new IP is $line\n";
                       close FH;
                       #`echo "$sysname new IP is $line"| /usr/local/bin/msmtp 'user@gmail.com'`;
               }
}


и это повесить на пайп к сислогу мпд. все упрощено до одного скрипта

Dorlas, 2008-07-08 в 12:45:21

Ну я верю, верю - что все хорошие программисты - и мой стиль режет глаз :) На уникальность не претендую - главное задачу решить и результата добиться :) В моем варианте все полностью работает :)
Как я уже написал - вариантов - тьма, каждый для себя выберет лучший :)

Кстати, для интересующихся, рекомендую разобраться с работой программы msmtp - если просто написать:
echo "my IP: $ip" | msmtp user@gmail.com - то эффекта не будет - письмо то Вы получите, НО там не будет полей: To:, Subject: и тела письма тоже не будет :) Когда разбирался, пришлось особым образом письмо формировать (см. статью).

mr_gfd, 2008-07-08 в 13:02:11

@Dorlas

Ничего не имею против )

как вариант использовать smtp шлюз провайдера и пайпу к стандартному mail - тогда выбор мыла не будет ограничен, и, в некоторых случаях, достаточно будет использовать mail2sms шлюз мобильного оператора.
PS: спасибо за поднятую тему - написал себе скрипт )

Осторожный, 2008-07-08 в 16:18:13

1) Запускать каждую минуту скрипт - это неправильно.
Правильнее слушать pipe от лога.
Или вообще написать отдельную утилиту на C не связанную с mpd5, которая мониторит смену IP-адреса и шлет письмо.

2) $my_ip = `ifconfig ng0 | grep "inet" | cut -d " " -f 2`;
Писать это в скрипте на perl - это извращение. Как минимум два лишних вызова grep и cut. Зачем, когда можно пропарсить вывод самим скриптом ?

3) Не очень понятно - провайдер выдает реальный IP-адрес или внутренний ?

gvf, 2008-07-08 в 16:52:01

А не проще строить туннель на свой сервак???
И ВСЕГДА работать с одним адресом?????
Какая разница с какого адреса будет построен VPN, главное что из блока провайдера и с заданным паролем.


Или я туплю....... или условия описаны не полностью.

bp, 2008-07-09 в 0:31:47

ddclient дохнет периодически, так что письмо по любому не помешает.

abigor, 2008-07-09 в 5:23:08

если этот сервак в конторе которая под юр лицом работает, я бы не делал костылей, а просто принес счет на 300 рублей за статический ip и не парил моск

Dorlas, 2008-07-09 в 7:59:51

to Осторожный:
Провайдер выдает динамический белый IP-адрес.
Как я уже писал - реализаций может быть много - каждый сам себе писун :) :) :)

to abigor:
Провайдер хитрый и на безлимите статический IP-ник не дает - об этом написано в самом начале статьи. Плюс сервер будет стоять на квартире - физ. лиц.

to gvf:
Намного проще! - при условии, что есть еще один свой сервер со статическим IP-ом :) А если нет? И если он не твой, а конторы, где ты работаешь (и может быть не собираешься там работать всю жизнь)...
Я же написал - нужен автономный вариант - чтобы ни от кого/чего не зависеть :)

Про использование DDNS - штука хорошая, но она усложняет цепочку - и понижает надежность...

Ну вот сами вспомните - звонят Вам и говорят - не работает Интернет...тупо так - не работает :) Бывали случаи, что из-за DNS ??? Бывали....

Dorlas, 2008-07-09 в 12:28:36

Только что пришла интересная мысль - если все таки использовать DDNS - то имеет смысл проверять, схожим методом - не косячит ли работа DDNS (резолвить свое DDNS-имя и сравнивать с текущим IP-ом) :)

И вот если не текущий IP не совпадает с именем - слать на mail-письмо :)

Ну и тут пригодится статейка - msmtp и Perl/Shell :)

byteplayer, 2008-07-16 в 0:38:46

Но ведь в мпд есть ап- и даун- скрипты, которые можно указать и в качестве одной из переменных в скрипт передаётся локальный ай-пи интерфейса. Почему бы этим не воспользоваться?

Dorlas, 2008-08-01 в 10:35:16

Пару дней назад у Gmail изменился сертификат - теперь используется вот такой:
Equifax_Secure_CA.crt:

-----BEGIN CERTIFICATE-----
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG
EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1
cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4
MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgx
LTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0
eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2R
FGiYCh7+2gRvE4RiIcPRfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO
/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuv
K9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAGA1UdHwRp
MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEt
MCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjAL
BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9Qw
HQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMBAf8w
GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB
AFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2u
FHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
-----END CERTIFICATE-----

Dorlas, 2008-08-19 в 16:19:05

Блин - сертификат опять поменяли :)

Минутное чтение man msmtp и следующие изменения в ~/.msmtprc:

tls_certcheck off
#tls_trust_file ~/.certs/ThawteSGCCA.cer

ram, 2010-02-14 в 16:27:03

1) По поводу
"bp, 2008-07-09 в 0:31:47
ddclient дохнет периодически.."
где то читал, что подвисания действительно есть и лечат кроном рестарт службы.
2) Так же некоторые компилят ядро с кучей "options NETGRAPH"
Надо ли?


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту

Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis

Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 6 чел.
За последние 30 мин было: 32 человек
За сегодня было
203 показов,
23 уникальных IP
 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0635 секунд
Из них PHP: 43%; SQL: 57%; Число SQL-запросов: 77 шт.
У Вас отключено GZIP-сжатие в браузере. Размер страницы 168245