Хотите поблагодарить автора блога - жмите здесь !
1 2 0
1 2 0

Нажмите на рекламный баннер выше, если хотите поблагодарить автора блога !
Написание каждой статьи заняло в сотни раз больше времени, чем один клик.

среда, июня 26, 2013

Настройка L2TP/IPSec PSK Туннеля под OpenWRT (Linux), настройка клиентов, в частности Windows 7

Итак - почему L2TP/IPSec ? Потому что для него есть встроенные клиенты как в Android, Так и в Windows 7, так и в iPhone, ну и в Линуксе само собой. Это удобно. Плюс высокая защищенность, делающая его практически не взламываемым (если не ставить пароли вида 123 есссно :). Плюс - нормально работает из за NAT, позволяя со своего смарта безопасно заходить в рабочую (домашнюю) сетку откуда угодно. Минус - в первый раз в настройке не так чтобы был прост. Вроде все очевидно но "без секса не обошлось". Почему не PPTP ? Встроенные клиенты тоже есть "во всем". Как и почти все "нативно мелкомягкое" - настраивается легко и быстро... И также легко, быстро и удобно взламывается - как и все нативно мелкомягкое :) Но даже не это главное. PPTP через NAT ходит "через пень колоду", "здесь играем, здесь не играем, а тут рыбу заворачивали". Очень неудобно полагаться на тунель с "вероятностными характеристиками" - может будет работать когда нужно, а может нет - как повезет. Лучше уж играть в лотерею :) Ну и еще, очень противно, выходя в сеть, каждый раз задумываться "а кто на транзите и не ломанут ли".  Да, если кому очень хочется именно PPTP - обращайтесь - выложу описание настроек для OpenWRT - но лучше не надо :)

Итак - к барьеру ! В смысле консоль в руки и идем строить :)

Первым делом устанавливаем нужные пакеты:
opkg update
opkg install openswan
opkg install ipsec-tools
opkg install xl2tpd
opkg install
opkg install iptables-mod-ipsec kmod-ipsec4 kmod-ipsec6 kmod-ipt-ipsec
opkg install openvpn-easy-rsa  #Это нам для PSK не понадобится. Пригодится если захочете использовать сертификаты.
Еще я натыкался на рекомендацию поставить
opkg install kmod-ocf-ubsec-ssb
Если для Вашей прошивки такой модуль есть, то будет весьма полезен - аппаратное ускорения  ipsec. Но для моего любимого TPLINK 1043ND такого не нашлось.

 Теперь то, что является самым крупным в этом деле источником секса :) (где собака порылась объясню ниже) У меня не заработал ни один вариант, "скозленный втупую с нета", поэтому пришлось читать ман :) Если захотите развлечься на досуге, ман можно найти здесь: http://linux.die.net/man/5/ipsec.conf.
Итак (барабанная дробь) - его величество /etc/ipsec.conf !

# /etc/ipsec.conf - IPsec configuration file

version 2.0

include /etc/ipsec.uci.conf

# Include non-UCI connections here
# They will be preserved across restarts/upgrades

config setup
   nat_traversal=yes
   virtual_private=%v4:10.0.0.0/8,%v4:!192.168.0.0/16
   oe=off
   protostack=netkey

conn L2TP-PSK
   authby=secret
   pfs=no
   compress=no
   rekey=no
   keyingtries=3
   type=transport
   left=%eth0.2
   leftprotoport=17/1701
   right=%any
   rightsubnet=vhost:%no,%priv
   #rightprotoport=17/%any
   #better for Win 7
   rightprotoport=17/1701
   #rightprotoport=17/0
   auto=add
   #need for Android and ipad
   forceencaps=yes


Не страшно ? :) Ну да - когда все работает :) А собака порылась вот где. Почти во всех примерах, встречалась строка "left=%defaultroute". Так вот с ней не работает ни в какую. По кр мере у меня. По идее оно должно было бы брать IP адрес из "дефлотового роутинга", но "что то не складывается". Помогло только указание интерфейса, с которого брать адрес: left=%eth0.2. Там в конфиге еще много вариантов. Были перепробованы почти все - заработало только с этим. eth0.2 если у Вас внешний канал (WAN) по ether. Если например по 3G, то вписываете имя своего внешенго интерфейся PPP (напр 3g-CDMADnepr у меня - у Вас будет такой как Вы сконфигурили, когда настраивали 3G).
Но это не все.  После "проб и ошибок" обнаружилось что наиболее стабильно для Win 7 вариант rightprotoport=17/1701. Но я оставил остальные "закомменченными", так как при других версиях винды, могут быть другие варианты, например rightprotoport=17/0. Для Андроида тут "все едино". Работает стабильно в любом случае. А вот forceencaps=yes рекомендовали для IPhone. Я не проверял, но мне показалось, что и Андроид с ним работает стабильнее, особенно через NAT.
Забегая вперед. Если при соединении будет выдавать в логе (logread) что то о невозможности аутентификации PSK (no connection has been authorized with policy=PSK)
- прооверить правильность параметра "left". Тогда пробуйте "%defaultroute", или читайте ман - там вариантов много. Но повторюсь - для меня рабочим оказался только один - тот что в конфиге выше.
 =====================
Итак с ipsec.conf разобрались.
Теперь /etc/ipsec.secrets
# /etc/ipsec.secrets - IPsec sensitive configuration file

# Include configuration information from UCI
include /etc/ipsec.uci.secrets

# Add non-UCI secrets below
# This file will be preserved across restarts/upgrades

%any %any : PSK "LongPasswordVeryLong"


Вместо LongPasswordVeryLong вписываем что нибудь очень длинное, лучше без пробелов. Это будет ключ шифрования. Собственно Ваша основная защита.
=====================

Далее, редактируем /etc/xl2tpd/xl2tpd.conf
[global]
port = 1701
;auth file = /etc/xl2tpd/xl2tp-secrets
access control = no
ipsec saref = yes

[lns default]
exclusive = yes
ip range = 192.168.0.17-192.168.0.29
local ip = 192.168.0.30
;hidden bit = no
length bit = yes
name = VPNServer
ppp debug = yes
require authentication = yes
unix authentication = no
require chap = yes
refuse pap = yes
pppoptfile = /etc/ppp/options.xl2tpd


Здесь нужно обратить внимание на несколько деталей.  ip range = 192.168.0.17-192.168.0.29 - указываете диапазон IP адресов, которые будут назначаться клиентам, подключаемым через L2TP. При этом он должен быть поддиапазоном одной из сеток, указанных в строке "virtual_private=" в /etc/ipsec. local ip = 192.168.0.30 - это Ваш гейтевей, через который будут ходить приконнекченные клиенты (собсно гейтевей всей Вашей локалки обычно). Он должен быть ВНЕ диапазона, указанного в "local ip =". "name=VPNserver" - Это имя, по которому будут искаться пароли клиентов в /etc/ppp/chap-secrets.
=====================
Теперь /etc/ppp/chap-secrets

В общем редактируем chap-secrets:
slavagt VPNServer ppp_password1 192.168.X.X
slavagta VPNServer ppp_password2 192.168.X.X

Тут все очевидно. Логин клиента, название соединения, пароль клиента, его IP адрес в локалке.
========================
Теперь  /etc/ppp/options.xl2tpd

Это параметры, которые будут передаваться демону pppd при его вызове для создания тунеля L2TP/IPsec
Важно - Если лог при соединении будет показывать что pppd завершился с ошибкой "11" - значит что то не так с параметрами в этом файле. У меня были какие то лищние,
скопированные из инета, со статьи, которую я взял за основу при настройках, и pppd "падал".

===
lock
auth

debug
logfile /var/log/xl2tpd.log

require-mschap-v2
ms-dns 8.8.8.8
lcp-echo-interval 120
lcp-echo-failure 10
idle 1800
connect-delay 5000
nodefaultroute
noipdefault

require-mschap-v2
refuse-chap
refuse-mschap
refuse-eap
refuse-pap
noccp

nobsdcomp
nodeflate

proxyarp
mtu 1400
mru 1400
============================================


В /etc/firewall.user на сервере добавляем строки для того чтобы открыть порты для соединений IPSEC
#for l2tp/ipsec
#l2TP/IPSec
iptables -A input_rule -m policy --strict --dir in --pol ipsec --proto esp -j ACCEPT
#iptables -A input_rule -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT
iptables -A input_rule -p udp --dport 1701 -j REJECT
iptables -A input_rule -p udp --dport 500 -j ACCEPT
iptables -A input_rule -p udp --dport 4500 -j ACCEPT
iptables -A output_rule -p udp --sport 500 -j ACCEPT
iptables -A output_rule -p udp --sport 4500 -j ACCEPT
iptables -A forwarding_rule -p udp --dport 500 -j ACCEPT
iptables -A forwarding_rule -p udp --dport 4500 -j ACCEPT
iptables -A forwarding_rule -p udp --dport 1701 -j ACCEPT

#И для работы PPP тоннеля
iptables -A input_rule -i ppp+ -j ACCEPT
iptables -A forwarding_rule -i ppp+ -j ACCEPT
iptables -A forwarding_rule -o ppp+ -j ACCEPT
iptables -A output_rule -o ppp+ -j ACCEPT

=========================

Собсно все - дальше - настраиваем клиентов. 

Windows 7

Как и все творения мелкомягкой корпорации, отличается "умом, сообразительностью и изощренным издевательством над тем кто будет ЭТО настраивать".
Прежде всего - лезем в реестр. Да, да - Вы не ослышались. Без этого WINDOWS НИ В ЖИСТЬ не подключится к L2Tp через NAT. Зачем они сделали такой "дефолт", и даже нужный ключ в реестр не вписали - вопросы к "достопочтенному" Билли, которому Вы платите за его творение :)

regedit.
Дальше идем в
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent
Там добавляем новую запись  AssumeUDPEncapsulationContextOnSendRule типа DWORD. У мелкомягких "примечание" - DWORD - для 32х разрядных. Но у меня на X64 все пошло нормально.
Потом вписываем в добавленную запись значение "2".
Если Вас интересует "зачем, почему, какого рожна" и прочие бесполезные вопросы, когда дело касается мелкомягких - можете развлечься вот здесь: http://support.microsoft.com/kb/926179/ru

Ну теперь все просто. Идем в "Центр управления сетями и общим доступом", Выбираем "настройка нового подключения или сети. Вводим название и адрес сервера, и ОБЯЗАТЕЛЬНО убираем галочку "подключиться". После создания, выбираем "свойства", переходим на вкладку "Безопасность", и там выбираем "Тип VPN" L2TP IPsec VPN. Потом на вкладке сеть, если не нужен, отключаем IPV6. После выбираем IPV4 и свойства. Потом вкладку "дополнительно". там стоит галочка "Использовать основной шлюз в удаленной сети". если Вам нужно просто соединить две локалки, то его нужно убрать. Если Вы хотите, чтобы Ваш комп ходил в нет из этой локалки - галочку оставляете.
Ну типа с "Вынь-да-Выкинь 7" все. Да, когда спросит имя пользователя и пароль - не забудьте поставить галочку "запомнить".

Ну а с Android там все совсем просто.

Настройки > Еще>VPN> Добавить VPN сеть.
Вводите название - какое Вам нравится, выбираете тип сети L2TP/IPSec PSK. Вводите адрес (или IP) серера. Секрет L2Tp и Идентификатор IPSec оставляете пустыми. В поле "Предварительный ключ IPSec, вписываем то-же, что вы вписали в качестве "LongPasswordVeryLong" в ipsec.secrets. И если не хотите, чтобы Ваша локалка стала "дефлоттовым маршрутом" (если Вам нужно только подключиться к ней, а не ходить через нее во внешний нет), в дополнительных, в "маршрутах перенаправления", прописываете адрес своей локалки с маской.  Все" при первом соединении спросит логин и пароль - вводите те, что вписали в chap-secrets.
И пару гадостей. L2TP/IPSEC Андроида в некоторых случаях, например если при поднятом тунеле, пооизошел переход сервера на резервный канал, со сменой IP, или если Вы используя Android как WIFI точку доступа для персоналки, попытаетесь с обеих зайти в L2Tp туннель, иногда зависает насмерть". Признаков никаких - все работает, но туннель не подключается. "исследование" показало что он при этом вообще перестает посылать пакеты наружу. Просто тупо "долго ждет" и заявляет что Ваш серевр не отвечает. Эт мне много крови попортило пока допер. Помогает только перезагрузка. В одном случае из десяти - отключение передачи данных, перевод в режим "полета", потом подключение сети, потом включение передачи данных.

====================================================================

И напоследок - если Вы используете два внешних канала (Dual WAN). 

Не забудьте что при смене интерфейса, нужно сменить его в конфиге ipsec.conf и потом "передернуть" IPSec. Если для отслежживания исправности каналов, Вы используете мой скриптавтовыбора активных каналов с запуском доп программ при переключении, ChanCheck, то все просто.
Сделать две конфигурации, с расширениями файлов, соответствующими каналам, и с разными именами интерфейсов
в строке " left=%eth0.2" (напр для CDMA резервного у меня прописано "left=%3g-CDMADnepr". а названия конфигов,
для основного ipsec.conf.MI, для первого резервного ipsec.conf.R1I. Далее делаем скрипты, которые будут запускаться при переключении на каждый из каналов.
У меня это /usr/sbin/ChanIPSecM и /usr/sbin/ChanIPSecR1. Соотв они же должны быть прописаны в ChanCheck (PROGM=, PROGR1=, PROGR2=).
А также ставим соответствующие им переменные PROGME=, PROGR1E=, PROGR2E= вместо значения $NOPROG, в значение 'Yes'.


/usr/sbin/ChanIPSecM
#/bin/sh
rm /etc/ipsec.conf;
cp /etc/ipsec.conf.MI /etc/ipsec.conf;
/etc/init.d/ipsec restart;
sleep 1


/usr/sbin/ChanIPSecR1
#/bin/sh
rm /etc/ipsec.conf;
cp /etc/ipsec.conf.R1I /etc/ipsec.conf;
/etc/init.d/ipsec restart;
sleep 1

Спасибо за внимание. Надеюсь я избавил Вас от нескольких дней "извратного секса с шелезом" :) 

И Вы сможете его использовать для более приятного традиционного с девушкой :)




1 комментарий:

Закрыть окно X
Пожалуйста, потратьте несколько секунд на поддержку блога и его автора
Нажмите на рекламную ссылку: Рекламная ссылка для поддержки блога, или на баннер вверху справа страницы.