Итак - к барьеру ! В смысле консоль в руки и идем строить :)
Первым делом устанавливаем нужные пакеты:
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
Как же неудобно читать
ОтветитьУдалить