MCP

вторник, 23 мая 2017 г.

Какой тип VPN лучше

Тут разбираюсь с тем, что лучше в качестве протокола VPN подобрать, с учётом того, что с обоих концов стоят похожие железки, соответственно друг с другом их можно подружить любой комбинацией. Соответственно много читал про типы VPN, и решил поделиться тем, что выяснил (не перепечатывая один и тот же текст из вики).

PPTP

Классический протокол, работает везде. На всём что шевелится. Очень быстрый (с ним только IPSec может соперничать при определённых условиях). Но есть один недостаток — дырявый. Стандартный MSCHAPv2 позволяет выяснить пароль, если перехватить сессию. Но, судя по всему, проблема только в случае MITM. Т.е., если не считаете, что ваш трафик перехватывают, то жить вроде бы можно. Есть ещё протоколы вида EAP, но с их поддержкой всё достаточно грустно.
Второй недостаток — использование в качестве транспорта протокола GRE (тоже самое что TCP, UDP или ICMP, только GRE). Иногда режется.
В общем, по общему мнению, использовать небезопасно, но быстр

IPSec

Не совсем VPN, а нечто очень клёвое и могучее, которое может шифровать или один порт между двумя компьютерами, или связывать целые подсети безопасным образом. Очень хорошо поддерживается аппартное шифрование, и сам весь шифрованный, может хоть по сертификатам, хоть по PSK ходить, работает в винде на низком уровне, в общем, чудо а не протокол. Есть только пара жирных минусов: первоначальная настройка может быть весьма муторной (с перебиранием галочек, и чтением логов), неосторожное действие может зарубить железяку (будет считать, что трафик к ней должен идти через IPSec, который не настроен), ну и настройка этого через NAT — могучий квест, для настоящих джедаев.
В общем, по жизни рекомендую связывать удалённые компьютеры с фиксированными IP в безопасную псевдо-локальную сеть. Тут он волшебен. Остальное — на любителя.
Ходит через UDP, EH и ESP протоколы, что очень хорошо для транспорта, но мутновато для фаривола. с NAT'ом добавляется UDP 4500, и куча мути.

L2TP/IPSec

Немного дурацкое название связано с тем, что сам туннель нешифрованный, соответственно поднимается туннель поверх IPSec, что приводит по мнению многих к двойной инкапсуляции и приличному оверхеду. Но т.к. IPSec сам по себе хорош, не так уж и плохо. Живьём попробовать не удалось, уж очень большой квест по настройке. Предпочитаю голый IPSec. В общем, как вы понимаете, мне не очень нравится этот туннель, но если вам кто-то его настроили он работает, то будет весьма безопасный туннель.
Ходит через UDP 1701, EH и ESP протоколы, EH не обязателен.

SSTP

Как программисту, мне очень нравится этот туннель. Ибо это тупой SSL-стрим (по умолчанию на 443-ем порту), в который всё заворачивается. Т.е. с криптографией всё нормально TLS1.2, все плюшки. Проверка сертификатов сервера, возможно клиента. Работает дубово и стабильно. Но один маленький нюанс: хорошо работает только на винде начиная с Висты и более или менее на Микротиках. Под линухом кое-как, под андроидом из коробки ничего нет, ну и в целом не очень распространён.
Тем не менее, если есть возможность его использовать со стороны системы — будет работать. 
Утверждается, что протокол закрытый, поэтому могут быть дыры, но снаружи это чистый SSL-стрим (не отличить от обычного обращения к сайту, кроме объёма данных), так что все правила безопасности соответствуют https.
Ещё один недостаток, кроме ограниченной поддержки — TCP канал для тоннеля. В чём проблема? В плохой сети. Ибо TCP-пакеты могут теряться и запрашиваться повторно. Тут получается ситуация TCP over TCP, что при потере пакетов верхнего уровня приводит к куче проблем нижнего. Т.е. два уровня начинают заниматься попытками перепосылки пакетов, что сильно проваливает скорость. Однако, при хорошей сети — всё отлично.

OpenVPN

Последний вариант, о котором я хочу рассказать, но не самый плохой. Это отдельный OpenSource клиент подо всё что шевелится, который позволяет сделать всё что угодно. Хоть примешаться к существующему SSL-трафику на 443-ем порту сервера. В общем, есть всё. Куча алгоритмов, куча вариантов. Минусов только два: нужно ставить отдельно и слегка мутновато настраивать. Если справитесь, то всё будет хорошо, хотя пользователям придётся писать развёрнутую инструкцию.
Ну и по-возможности, следует настроить его на использование UDP, а не TCP, чтобы не было проблем, аналогичных SSTP. По скорости примерно соответствует SSTP.

Скорость

Всё очень depends, зависит от тонкой настройки, аппаратной поддержки и прочего. Но мои тесты показали, что в целом скорость распределяется следующим образом
  • PPTP — самый быстрый. Очень и очень быстрый
  • L2TP/IPsec — чуть медленнее (протоколы серьёзныее)
  • SSTP — сильно медленнее
  • OpenVPN — примерно соответствует SSTP, но чуть медленнее (проверял только TCP вариант, думаю UDP будет гораздо быстрее)

Итоги

На самом деле, выбор весьма сложен. Старые протколы или сложные или дырявые, но поддерживаются везде и максимально быстро. Новые стараются сделать удобнее, но с поддержкой грустнее. Я пока не выбрал, что лучше, но думаю про SSTP, когда всё хорошо и PPTP, когда плохо с качеством и скоростью, но очень надо. При хорошей подготовке, возможно лучшим будет всё-таки IPSec, ну а хитрый OpenVPN можно настроить как нравится.

среда, 8 марта 2017 г.

Visual Studio 2017 и очередная упоротость от Microsoft

Данный пост навеян статьёй о выходе VS2017, в которой есть такая шикарнейшая фраза:

We’re now encouraging Visual Studio 2015 users to migrate to MSBuild and csproj from project.json. As I stated above, we will not be supporting any of the new .NET Core tools in Visual Studio 2015. We also won’t be updating the Visual Studio 2015 project.json-based tools.
И вот эта фраза меня убило, хотя новости ходили давно, но тут они всё-таки сделали всё "в самом лучшем виде". И я не могу не высказаться по этому поводу.

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

В результате, часть времени в проекте уходит на миграцию на новую версию, часть на обучение разработчиков как сегодня правильно писать и часть на исправление незамеченных регрессов. В общем, это хорошо так перекликается с одним из моих ранних постов про велосипеды. Я, собственно, до сих пор предпочитаю использовать .NET 4.0: он работает начиная с XP и VS2010, он не мёртвый (апдейты выходят и для него, и свежие .NET улучшают его код, ибо в реальности одно и тоже), да и в новых не так уж и много полезных фич, чтобы переходить на него. Кроме того, никаких проблем с версионированием, которые поехали дальше: 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2 — без гугла различия и не вспомнишь.

Но тут решили делать всё по-новому и перешли на .NET4.6 и .NET Core, всё-таки у Core есть хорошие плюшки в виде нативной компиляции и гарантированной работы под Linux, да и разрабатывается она давно.

Про сам .NET Core писать не буду, ибо мелочь уже написана, на на ещё один пост не набирается, но вот что понравилось безоговорочно, это файлы project.json, которые очень похожи на package.json, но для Core. Собственно, наконец-то у Microsoft получился вменяемый формат проекта, который можно редактировать ручками не в плане хотфиксов, а прямо-таки изменять поведение проекта. Ну и работать с проектом не только в студии, но хоть в саблайме.

И тут приходит Microsoft и говорит, извините, факир был пьян, мы возвращаем всё назад. При этом новые фичи будут работать только в новой студии, а старые поддерживать мы больше не будем. Т.е. фактически кинули всех владельцев 2015-ой студии, которые работали с проектами на Core. При этом Microsoft всю жизнь тащила обратную совместимость, ибо так правильно и ынтырпрайзно.  Но, судя по всему, в команде .NET царит атмосфера вида: как хочется и как им удобнее. В результате, мало того, что ты летишь в самолёте, у которого по ходу дела меняют крылья на другие, ещё и забирают двигатели с фразой — они отстой, в новых всё лучше, покупайте наших слонов!

Собственно, теперь кроме обновления студий всем связанным участникам необходимо опять переделывать весь тулинг (тестирование, билды, пекеджи), опять изучать косяки всех инструментов, мигрировать проекты. Вот задолбало конкретно. Я хочу писать код, а не бороться с очередными новшествами и изучать очередные инструменты, которые не сделают мою жизнь лучше.

Эээх... как же хорошо было в .NET4.0...