Итак, у нас есть статический публичный IP адрес, который приходит Ethernet шнуром в MikroTik RouterBOARD 750G r3 (hEX). Пробуем собрать вот такую конструкцию.
Настройку L2tp линка в рамках этой статьи я не описываю, а на схеме он нарисован только потому, что в ней упоминается.
1. Поднимаем VPS
Как вы уже догадались, нужна система, которая включена в интернет за пределами РФ. Большие деньги на это тратить не хотелось, и я остановился на Aruba Cloud. Здесь всего за 1 евро в месяц дается VM в локациях Италия, Чехия, Германия, Франция и Великобритания. Я свой выбор остановил на Чехии, потому что ping до наших ресурсов оказался на 20ms меньше, чем с Итальянского (50ms против 70ms). Ubuntu 16.04 LTS поднялась очень быстро. Войти в нее удалось раньше, чем «позеленел» статус в интерфейсе «облака».
Сервер устанавливается в минимальной конфигурации. Не помешает установить утилитку traceroute.
$ sudo apt install traceroute
2. Настраиваем GRE между MikroTik и Ubuntu
Выбор в пользу GRE был сделан по нескольким причинам:
- просто и понятно настраивается;
- легко траблешутится;
- маршрутизация проще некуда;
- элементарно отрисовывается график загрузки интерфейса в MikroTik.
Итак, на стороне Ubuntu описываем интерфейс tun1 в /etc/network/interfaces
$ sudo cat << EOF >> /etc/network/interfaces
iface tun1 inet static
address 192.168.10.1
netmask 255.255.255.0
pre-up iptunnel add tun1 mode gre local 80.211.x.x remote 188.x.x.x ttl 255
up ifconfig tun1 multicast
pointopoint 192.168.10.2
post-down iptunnel del tun1
EOF
Здесь все просто:
- 80.211.x.x — адрес VM с Ubuntu в Чехии;
- 188.x.x.x — внешний адрес MikroTik;
- 192.168.10.1 — адрес на туннельном интерфейсе tun1 на стороне Ubuntu;
- 192.168.10.2 — адрес туннельного интерфейса на MikroTik;
Активацию этой части конфигурации я по-старинке делаю так:
$ sudo service networking restart
Получил конструктивную критику такого метода активации настроек сети.
У нас получился вот такой интерфейс:
$ ifconfig tun1
tun1 Link encap:UNSPEC HWaddr 10-D3-29-B2-00-00-B0-8A-00-00-00-00-00-00-00-00
inet addr:192.168.10.1 P-t-P:192.168.10.2 Mask:255.255.255.255
inet6 addr: fe80::200:5ffa:50d3:c9c2/64 Scope:Link
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1476 Metric:1
RX packets:379 errors:0 dropped:0 overruns:0 frame:0
TX packets:322 errors:4 dropped:7 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:103387 (103.3 KB) TX bytes:159422 (159.4 KB)
Со стороны MikroTik настройка тоже несложная. Я делал это из Web-интерфейса.
Обращаю внимание на то, что не сконфигурирован keepalive. Мне так и не удалось включить ответную часть на Ubuntu. Если не будет трафика, то интерфейс на MikroTik будет «уходить» из running и подниматься, только если пойдет трафик со стороны Ubuntu.
На этом этапе у нас должны подняться туннельные интерфейсы с двух сторон. Проверить это просто. Достаточно запустить ping c Ubuntu в сторону MikroTik.
$ ping 192.168.10.2
PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=56.0 ms
64 bytes from 192.168.10.2: icmp_seq=2 ttl=64 time=59.9 ms
64 bytes from 192.168.10.2: icmp_seq=3 ttl=64 time=56.3 ms
64 bytes from 192.168.10.2: icmp_seq=4 ttl=64 time=56.1 ms
--- 192.168.10.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 56.091/57.137/59.936/1.618 ms
user@vps:~$
Настраиваем маршрутизацию в сторону абонентских сетей в туннельный интрефейс
Приватные IP адреса локальной сети, из которой осуществляется выход в интернет — 192.168.1.0/24. Сеть 192.168.6.0/24 — это сеть, выделенная для подключения к MikroTik по L2TP из «внешнего мира». Для того, чтобы работали компьютеры локальной сети и удаленные устройства, добавляем маршруты на обе сети в конец файла /etc/network/interfaces
$ sudo cat << EOF >> /etc/network/interfaces
#static route"
up ip ro add 192.168.1.0/24 via 192.168.10.2
up ip ro add 192.168.6.0/24 via 192.168.10.2
EOF
Еще раз просим систему обновить сетевые настройки
$ sudo service networking restart
Включаем ip_forward
$ sudo echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
$ sudo sysctl -p
Прописываем маскарадинг
$ sudo iptables -t nat -A POSTROUTING -j SNAT --to-source 80.211.x.x -o eth0
Настаиваем маршрутизацию на MikroTik
Поскольку у меня не стоит задача «развернуть» весь трафик в интернет через другую страну, то в туннельный интерфейс я буду маршрутизировать только интересующие меня ресурсы. В качестве такого ресурса я выбрал Linkedin.
Итак, добавляем маршруты на MikroTik (через терминалку):
/ip route
add comment=linkedin distance=1 dst-address=91.225.248.0/22 gateway=gre-tunnel1
add comment=linkedin distance=1 dst-address=108.174.0.0/20 gateway=gre-tunnel1
add comment=linkedin distance=1 dst-address=185.63.144.0/22 gateway=gre-tunnel1
К этому моменту у меня начал открываться заветный ресурс и на этом можно было бы и закончить, поскольку, даже несмотря на то что GRE трафик не шифрован и его прекрасно видно в Wireshark, далеко не все провайдеры DPI-ят трафик (а если и DPI-ят, то точно не заглядывают внутрь туннелей для отслеживания трафика от запрещенных ресурсов), да и АПК «Ревизор» не интересуется тем, какой реально абонентами потребляется трафик.
На дальнейшие эксперименты меня натолкнул тот факт, что в настройках GRE интерфейса MikroTik есть опция IPsec Secret. Неужели действительно все так просто?!
3. Зашифровываем туннель
В качестве шифровальщика на стороне Ubuntu я выбрал strongSwan. Пример конфигурации я взял из материала Configure GRE over IPSec secured private channel, но сразу не заработало и пришлось внести некоторые правки.
Устанаваливаем
$ apt install strongswan
Вносим в основной конфигурационный файл strongSwan вот это:
$ cat << EOF > /etc/ipsec.conf
# ipsec.conf - strongSwan IPsec configuration file
config setup
charondebug="ike 2, knl 2, cfg 2, net 2, esp 2, dmn 2, mgr 2"
conn %default
# keyexchange=ikev2
conn mikrotik
# Try connect on daemon start
auto=start
# Authentication by PSK (see ipsec.secret)
authby=secret
# Disable compression
compress=no
# Re-dial setings
closeaction=clear
dpddelay=30s
dpdtimeout=150s
dpdaction=restart
# ESP Authentication settings (Phase 2)
esp=aes128-sha1
# UDP redirects
forceencaps=no
# IKE Authentication and keyring settings (Phase 1)
ike=aes128-sha1-modp2048,aes256-sha1-modp2048
ikelifetime=86400s
keyingtries=%forever
lifetime=3600s
# Internet Key Exchange (IKE) version
# Default: Charon - ikev2, Pluto: ikev1
keyexchange=ikev1
# connection type
type=transport
# Peers
left=188.x.x.x
right=80.211.x.x
# Protocol type. May not work in numeric then need set 'gre'
leftprotoport=47
rightprotoport=47
EOF
Прописываем pre-shared-key (PSK) в /etc/ipsec.secrets
$ echo "80.211.x.x 188.x.x.x : PSK VeryBigSecret" >> /etc/ipsec.secrets
Перезапускаем strongSwan
$ ipsec restart
На этом настройка Ubuntu практически завершена. Приступаем к настройке MikroTik.
Я выставил вот такие настройки дефалтового proposal
Настало время вписать в поле IPsec Secret тот же PSK, что был указан в /etc/ipsec.secrets на сервере (VeryBigSecret).
Если все получилось, то выполняем диагностику на обоих концах туннеля.
MikroTik
Если «провалиться» глубже, то должно быть вот так:
Ubuntu
$ ipsec status
Security Associations (1 up, 0 connecting):
mikrotik[2]: ESTABLISHED 60 minutes ago, 80.211.x.x[80.211.x.x]...188.x.x.x[188.x.x.x]
mikrotik{2}: INSTALLED, TRANSPORT, reqid 1, ESP SPIs: cc075de3_i 07620dfa_o
mikrotik{2}: 80.211.x.x/32[gre] === 188.x.x.x/32[gre]
Теперь GRE (protocol 47) между MikroTik и Ubuntu шифруется IPseс (ESP). Анализ pcap файла, снятого tcpdump-ом, это подтвердил.
Вроде бы, все работает и заветный ресурс открывается. Однако после того, как я направил в туннель еще несколько ресурсов, оказалось, что не все так хорошо, как казалось изначально. Удалось выяснить, что перестали проходить пакеты большого размера (вернее, они перестали правильно фрагментироваться).
Решение нашлось быстро. Оказалось, что достаточно уменьшить MTU до 1435 на обоих концах туннеля.
MikroTik
Ubuntu — добавляем mtu 1435 в описание интерфейса.
auto tun1
iface tun1 inet static
address 192.168.10.1
netmask 255.255.255.0
pre-up iptunnel add tun1 mode gre local 80.211.x.x remote 188.x.x.x ttl 255
up ifconfig tun1 multicast
pointopoint 192.168.10.2
mtu 1435
post-down iptunnel del tun1
Диагностика установления IPsec соединения не тривиальна. На Ubuntu логи читаются значительно проще, чем на MikroTik. По умолчанию на MikroTik выключено логирование IPsec. Включается просто, но проводить анализ проще через терминалку.
Мне удалось добиться скорости скачивания 25 Мбит/с и отдачи 50 Мбит/с. На мой взгляд, этого вполне хватает для комфортной работы с ресурсом. Почему не разгоняется больше — это пока загадка. Загрузка процессоров на обоих концах туннеля не высока. Основная версия — это ограничение скорости на стороне облака. Как-нибудь на досуге погоняю файлы между серверами без шифрования.
P.S.: В планах настроить IKEv2 туннель с моих устройств (я использую технику Apple) непосредственно на сервер с использованием сертификатов. Пока мне не удалось это сделать. Apple-девайсы почему-то не отвечают на запросы установления защищенного соединения со стороны сервера. Можно, конечно, сделать L2tp, но это уже не интересно: такой опыт у меня уже был.
Комментарии (45)
Night_Snake
11.09.2017 00:14Я уже делал нечто подобное правда без GRE. Там же и про RoadWarriors написано (т.е. L2TP+IPSec). Единственный момент — на мой взгляд лучше использовать libreswan, т.к. у strongswan проблемы с apple-девайсами (причем на момет начала 2016 года проект был заморожен, и разработчик не спешил фиксить баги. libreswan это, собственно, форк strongswan).
eov Автор
11.09.2017 00:34Спасибо, поизучаю эту тему. Вопрос с Apple-девайсами у меня действительно остался открытым…
jscar
11.09.2017 10:00Если мне не изменяет память, то libreswan — форк Openswan, который, в свою очередь, форк FreeS/WAN.
StrongSwan — имеет корни от FreeS/WAN, но почти полностью переосмысленный.Night_Snake
11.09.2017 10:50Возможно, что и так, но главная моя мысль была в том, что когда я этой задачей занимался, strongswan почти не развивался, и в репах Debian 8 лежала битая версия (latest). Хорошо, если ситуация изменилась
eov Автор
11.09.2017 10:57На офицальном сайте стронгсвана последнее обновление датируется 14.08.2017.
Chugumoto
11.09.2017 00:16-1*просмотрел по диагонали*
эм… а не лучше ли будет OpenVPN с сертификатами заюзать?eov Автор
11.09.2017 00:37Давайте определимся откуда и куда… Тема с OpenVPN для Apple-девайсов у меня пока не раскрыта. Что-то конкретное говорить про LAN2WAN через OpenVPN я пока тоже не готов. Может есть пример такой конфигурации?
Chugumoto
11.09.2017 10:07да везде :)
у самого к продукции эпл неприязнь, но если погуглить, то можно такое найти
habrahabr.ru/post/168853
ну и
itunes.apple.com/ru/app/openvpn-connect/id590379981?mt=8
а пример конфигурации… если vps делаем ovpn сервером, на микротике просто добавляем интерфейс, ну и также например маршрутами необходимый трафик в него посылаем по адресу назначения…
просто gre… наблюдал уже, что некоторые провайдеры ни с того ни с сего резать начинают… imho openvpn более гибок, да и с сертификатами безопаснее, чем с psk…eov Автор
11.09.2017 10:13Спасибо. Подумаю на тему OpenVPN на досуге.
Я не сталкивался с тем, чтобы провайдеры «резали» gre. Какого-то разумного объяснения тому, зачем им это делать не нахожу. В любом случае, у меня получился уже не GRE, а ESP. Вот его как раз могут начать «резать» по требованию властей…
lehnh
11.09.2017 14:49+1OpenVPN сильно медленнее ipsec в силу работы в userspace.
Ну и как упоминали ниже, микротики не умеют его через udp, что тоже накладывает ограничения в производительности. Ситуация такая уже много лет и меняться не собирается.Chugumoto
11.09.2017 15:04и чего вы за udp ухватились? :)
а если почитать пост между строк, то видно, что автору 443/tcp будет лучшим вариантом :)
хотя тут еще про sstp писали… не знаю — его еще не щупал.
да и медленнее… у меня тут интернеты сильно медленнее столичных. и ничего — меня устраивает :)
а в цифрах можно про медленнее? у меня конечно не hEX… но и аплинк всего 5120/896…AcidVenom
11.09.2017 16:11Полгода-год назад SSTP прокачивал до 3-5Мбит/с, L2TP+IPsec с тех пор стабильно прокачивает 25Мбит/с.
lehnh
11.09.2017 17:58Ну… зависит от железки конечно. У меня 3011, который в разы быстрее хекса, и он не выжимает 100 мбит, ну в районе 50-70 где-то. Ipsec разгоняется до ~150.
А зачем 443/tcp собственно? Если говорить про тотальную секьюрность и антицензуру, то надо смотреть в сторону udp2raw или govpn, но это уже не микротик будет.
toper
11.09.2017 08:21+2Микротик не умеет UDP и LZO с OVPN, и разработчики это допиливать не собираются, официальная позиция — используйте SSTP…
Chugumoto
11.09.2017 10:19ну меня интересовал именно tcp на 443ий порт
а сжатие… так ли оно необходимо? если учесть, что большинство по объему трафика плохо сжимается, ибо данные и так уже сжаты?
Skyroger2
11.09.2017 08:59В планах настроить IKEv2 туннель с моих устройств (я использую технику Apple) непосредственно на сервер с использованием сертификатов.
Предложил бы использовать для этой цели SSH. На стороне клиента делаем что-то вроде:
ssh -w 0:0 root@server_ip
Мне неизвестно о существовании аналога /etc/network/interfaces на OS X, так что видимо tun0 на стороне Apple придётся настраивать вручную (и маршрутизацию тоже). Но зато поддержка сертификатов и шифрования из коробки.eov Автор
11.09.2017 09:06Если MacOS это может сработать, то в iOS скорее всего нет.
В Apple-устройствах есть встроенные VPN клиенты. Подключение через них производится «в один клик».Skyroger2
11.09.2017 09:13SSH клиенты, даже бесплатные, для iOS есть, и они поддерживают как минимум проброс портов.
Но в общем да, неаккуратненько. Тема интересная, подумаю тоже на досуге, как заставить заработать встроенный VPN клиент на iOS.
toper
11.09.2017 09:38коллега уже описывал конфиги стронгсвана для яблок
habrahabr.ru/post/250859eov Автор
11.09.2017 09:47+1Да, эта статья у меня есть в закладках, но это пока не заработало (бился над этим дня 3). Там есть лайфкак связанный xauth, который мне применять не хочется.
Еще у меня и на Mасbook и на iPad стоят последние бетты. Может что с ними не так… Я на досуге еще раз поиграюсь.
iluvar
11.09.2017 10:21Обращаю внимание на то, что не сконфигурирован keepalive. Мне так и не удалось включить ответную часть на Ubuntu. Если не будет трафика, то интерфейс на MikroTik будет «уходить» из running и подниматься, только если пойдет трафик со стороны Ubuntu.
Попробуйте использовать netwatch, отправляя пинг на Ubuntu — это будет работать вместо keepalive
zorg59r
12.09.2017 14:57Тоже пользуюсь связкой mikrotik + ubuntu сервер на VPS от Arubcloud для vpn. Только использую не тоннель сайт-ту-сайт, а l2tp+ipsec сервер (strongswan) на убунту, с ручным подключением.
Но есть вопрос, может тут кто ответит, почему с клиента windows l2tp+ipsec, находящийся за NAT, я без проблем подключаюсь к удаленному l2tp ipsec серверу mikrotik, а чтобы подключиться к серверу l2tp+ipsec ubuntu, приходится править реестр windows, так как ошибка 809 (ms рекомендует, если клиент за NAT то внести изменения в реестр HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent\AssumeUDPEncapsulationContextOnSend )
P.S. Пробовал разных провайдеров, со статикой. В роли шлюза и сервера использовал, mikrotik, ubuntu server, 10/14/16 версий. Алгоритм шифрования ipsec на убунте тот же, что и на mikrotik.
При этом клиенты ios/android без проблем випиенятся за nat'ом той же сети, как к mikrotik, так и к ubuntu.
AcidVenom
Лучше делать через Mangle и адресные листы. В Mangle на прероуте указываете метку маршрута, в Routes указываете интерфейс и метку. Если нужно, распишу подробнее.
В итоге просто добавляете в адресные листы название ресурса, и он сразу ходит через указанный шлюз.
eov Автор
Х-м… пока не понял о чем речь. Можно подробнее?
AcidVenom
Это помечает соединение
Это маршрут для помеченных
Ну а это — ресурс, который нужно маршрутизировать через нужный шлюз.
Далее просто добавляете нужный ресурс в адресные листы с именем AnotherGWList.
eov Автор
Понял, спасибо! Попробую.
AcidVenom
Через Mangle же можно более тонко настраивать заворот, к примеру только с определенного IP или мас-адреса. Увы, листов мас-адресов пока нет.
Belya-Dj
Вариант, не плох, но есть нюансы.
А вдруг у ресурса есть поддомены, например, их тоже тогда надо все описать/вписать верно?
Не проще ли из базы whois вытянуть список подсетей ресурса (если мы конечно говорим не про маленький сайт визитку) и завернуть их через нужный GW?
Следующий нюанс, адрес резолвится в IP (а списки таки да, динамические, хранятся именно по IP) создаются или при добавлении ресурса или при первом старте микротика — те ситуация когда вдруг на ресурсе измениться IP может быть исправлена либо пересозданием записи в списке или перезагрузкой микротика, что тоже не по феншую.
Вообщем, имхо, ваш вариант имеет место быть, но я бы честно говоря, несколько раз подумал прежде чем использовать именно его.
eov Автор
Я подумаю на предмет использования встроенного скриптинга в Микротик для автоматического обновления адресов в маршрутах.
HeX
Я поступил проще:
/ ip firewall filter add action=add-src-to-address-list address-list=toVPN address-list-timeout=3d chain=forward content="Location: http://адрес заглушки провайдера\?" in-interface=WAN protocol=tcp src-port=80
Дальше mangle и маршрут как описал AcidVenom.
При попытке открыть сайт отображается заглушка и ip сайта добавляется в address-list, при повторном открытии он уже открывается через туннель. Время жизни записи в моем случае 3 дня. Можно менять по желанию.
Bonio
Не сработает с https сайтами.
AcidVenom
Если хотите автоматизировать через whois — скрипты в помощь. Это опять же проще через адресные листы.
Адреса резолвятся в IP и живут по TTL, так что по феншую.
Belya-Dj
Вот за этот отсыл к мануал спасибо, сразу эту инфу не нашел — тогда да, вполне годное решение.
Но вопрос с сабдоменами все равно открыт получается.
У себя я решил этот вопрос заворотом подсетей а вот с вашим предложением даже не знаю как быть…
AcidVenom
Дык можно точно так же в адресный листы указать подсеть с тем же именем. Вопрос именно в удобстве: не нужно каждый раз лазить в маршруты, мэнглы и т.д. Подкинул нужные IP или названия доменов и готово. И опять же видно весь список или списки.
А уж если у вас поднят OSPF и вы используете кучу маршрутов, то в них голова заболит разбираться.
b0m8er
Забыли маскарад на ВПН интерфейс сделать (если не настроено, или настроено на другой интерфейс, не пойдет трафик).
/ip firewall nat add chain=srcnat action=masquerade out-interface=*имя_ВПН_интерфейса*
AcidVenom
Вы это лучше автору скажите, в статье этого пункта нет.
eov Автор
Не забыл. Я это и не планировал делать. Ubuntu тоже мой и через него пакеты от LAN проходят с неизменным src IP. Ну и пусть. Двойная трансляция мне нужна.
eov Автор
не нужна
b0m8er
Согласен. Пост читал вдоль. У меня частный случай, когда впн сервер не маскарадит.
eov Автор
Попробовал. Работает почему-то заметно медленнее. Предположу, что теряет первые пакеты и переписылает.