понедельник, 30 марта 2015 г.

Slackware: настраиваем pptp

Вот уже несколько месяцев наша контора топчется вокруг такой ситуации. Есть головной офис, скажем, в городе Амстердам, есть филиал (в котором, в частности, нахожусь я), расположенный, например, в Будапеште, есть агентства в Ванкувере или там в Виннипеге, неважно. Будапешт с Амстердамом соединен некой корпоративной сетью, а Ванкувер и Виннипег с Будапештом - чтобы не вдаваться в подробности, обычным "интернетом". В Амстердаме находится группа серверов, которые по корпоративной сети доступны, а из интернета - не очень. Возникает вопрос - как тому же Виннипегу сделать доступ на эти серверы?

Первый вариант - понастраивать прокси, реверс-прокси и т.п. Я его активно эксплуатировал, но чем дальше в лес - тем толще партизаны. Постепенно порты становились всё более заковыристыми, а сетевые сервисы головного офиса - всё более вычурными. Тут и цитрикс, и веб, и какие-то 1С с тонким клиентом, и РДП, и почта, и черт знает, что будет ещё. После того, как я с ужасом понаблюдал бухгалтера, пытающегося через два терминальных сервера поработать с 1С, пришло желание что-то в этой схеме упростить.

Второй вариант - поднять сервер PPTP на компьютере, который видит как "интернет", так и сеть Амстердама. (На самом деле всё устроено немного сложнее, тут главное, что этот компьютер хоть и обладает одним сетевым интерфейсом, eth0, зато его прекрасно видно из Ванкувера, а он, в свою очередь, имеет возможность достучаться до всех, кого нужно)

Итак, на этом волшебном компьютере под управлением Slackware:

1. Разворачиваем poptop, оказавшийся тем самым pptpd, установить который предлагал каждый второй мануал командой apt-get install pptpd. Ну, у нас тут не дебиан, так что скомпилируем из исходников.

2. Настраиваем pptpd: из каталога samples исходников копируем файл pptpd.conf в /etc и прописываем в нем две опции (настройки виртуальной сети - свой адрес в ней и диапазон адресов клиентов):
localip 192.168.0.1
remoteip 192.168.0.200-234

3. Настраиваем pptpd: из каталога samples исходников копируем файл options.pptpd в каталог /etc/ppp/, комментируем в нем опцию proxyarp (не знаю, правда, зачем, это была безуспешная попытка избавиться от сообщения Cannot determine ethernet address for proxy ARP) и прописываем в нем две опции (адреса dns и wins-серверов амстердамской сети):
ms-dns A1.A1.A1.A1
ms-wins A2.A2.A2.A2

4. Настраиваем pptpd: из каталога samples исходников копируем файл chap-secrets в каталог /etc/ppp/ и указываем там учетку, которой разрешено входить в виртуальную сеть (заодно можно указать адрес, который будет ей выделяться), формат каждой записи примерно такой:
логин[табуляция]*[табуляция]пароль[табуляция]*

6. Настраиваем сервер: разрешаем форвардинг ip-пакетов на уровне ядра. Это делается так. В файл /etc/sysctl.conf прописываем строку:
net.ipv4.ip_forward=1
затем эту опцию подсовываем в ядро командой:
sysctl -p

7. Настраиваем iptables, но, видимо, это не очень обязательно, если доселе они не использовались. Так или иначе, не повредит:
# Пропускать все пакеты с интерфейсов ppp*, например ppp0
/usr/sbin/iptables -t filter -A INPUT  -i ppp+ -j ACCEPT
/usr/sbin/iptables -t filter -A OUTPUT -o ppp+ -j ACCEPT

# Пропускать входящие соединения на порт 1723 (PPTP)
/usr/sbin/iptables -t filter -A INPUT -p tcp --dport 1723 -j ACCEPT

# Пропускать все пакеты GRE
/usr/sbin/iptables -t filter -A INPUT  -p 47 -j ACCEPT
/usr/sbin/iptables -t filter -A OUTPUT -p 47 -j ACCEPT

# Включить форвардинг IP
/usr/sbin/iptables -t filter -F FORWARD
/usr/sbin/iptables -t filter -A FORWARD -j ACCEPT

# Включить NAT для интерфейсов eth0 и ppp*
/usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
/usr/sbin/iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE

Осталось настроить vpn-клиентов. В моём случае это машины с WinXP на борту, так что там всё просто: из-под учетки с административными правами в Панели управления в задаче "Сетевые подключения" вызвать мастер установки нового подключения и с его помощью всё установить. Правда, маршрутизация там оказалась хитрая: клиент лезет в vpn только если не может найти нужный ресурс в локальной сети, но, в крайнем случае можно указать статический маршрут:
route add A.0.0.0 mask 255.0.0.0 192.168.0.200
Впрочем, судя по разговорам умных людей, эта проблема имеет более изящное решение.

Да, и ещё одно. Надо отметить, что в самом начале пути меня постигло некоторое разочарование. Не все vpn-серверы оказались одинаково полезны. В частности, к установленному с опрометчивой самонадеянностью tinc-у штатные клиенты WinXP цепляться не будут. Дело, как я понял, в том, что tinc и pptp - разные протоколы, и майкрософт поддерживает "из коробки" как раз pptp.

Литература:
PPTP server (Русский)
Настраиваем VPN сервер. Часть 3 - PPTP. Платформа Linux.

UPD 2015-08-03: Если вдруг зачем-то понадобилось сменить порт tcp1723, на котором работает pptp, то можно поступить так:
a) на сервере (под линуксом) мапим порт:
iptables -t nat -A PREROUTING -p tcp --dport 11723 -j REDIRECT --to-ports 1723
б) на клиенте (под виндой) открываем regedit и ищем параметр TcpPortNumber. У меня он нашелся в ветке:
HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0005
Меняем его значение с 1723 на 11723 и перезагружаем компьютер.

понедельник, 23 марта 2015 г.

Windows: коварный Mozilla Thunderbird

Ситуация: есть Mozilla Thunderbird версии, скажем, 31.5.0, на ней настроена некая учетная запись электронной почты. Эта учетка может принимать сообщения, но отправлять - ни в какую. Выглядит это так. Пишем сообщение, нажимаем "Отправить", программа пишет "Компоновка сообщения...", затем на пару секунд задумывается, и выдаёт "Ошибка отправки сообщения. Проверьте настройки своей учетной записи, параметры связи с сервером и т.п." Так вот, эта подсказка - наглая ложь. Подслушка сниффером (например, packetyzer-ом) показывает, что почтовик даже не пытается стукнуться к серверу. И, что тоже интересно, при попытке закрыть неудавшееся сообщение, выдаётся предложение сохранить его в черновики, но сохранение также оказывается безуспешным. При этом, если запустить Thunderbird на той же машине, но под другим пользователем Windows - всё работает.

Оказывается, надо почистить или вообще привести в порядок папки, указанные в переменных окружения TEMP и TMP. Мозилла пытается перед отправкой скомпоновать сообщение во временном файле, и если не может его создать, сильно огорчается.

Но нет худа без добра. Зато выяснилось, как устроить журналирование общения с почтовым сервером. Делается это при помощи такого батника:
set NSPR_LOG_MODULES=SMTP:4
set NSPR_LOG_FILE=C:\temp\log_smtp.txt
"%ProgramFiles%\Mozilla Thunderbird\thunderbird.exe"