Мы — долго запрягаем, быстро ездим, и сильно тормозим.
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"
Надо ли?



 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1793 секунд
Из них PHP: 53%; SQL: 47%; Число SQL-запросов: 77 шт.
Исходный размер: 43723; Сжатая: 12099