WireGuard — быстрый и безопасный VPN в ядре Linux


    Рис. 1. OpenVPN vs WireGuard, тест Ars Technica

    WireGuard — свободный и открытый протокол виртуальных частных сетей, призванный заменить IPsec и OpenVPN. В январе 2020 года после полутора лет доработки кода всё-таки состоялось долгожданное событие — Линус Торвальдс принял VPN WireGuard в основную ветку Linux 5.6.

    Очень скоро этот VPN станет частью ядра Linux — сердца операционной системы с открытым исходным кодом, на которой работает весь мир, от веб-серверов до телефонов Android и автомобилей. Это действительно важное событие, потому что WireGuard устроен на порядок проще и логичнее предыдущих VPN. В июне 2019 года получено автоматизированное криптографическое доказательство математики протокола.

    VPN является важным инструментом для безопасности и конфиденциальности. По сути, он представляет собой зашифрованный канал коммуникации между двумя или более устройствами, которые позволяют маршрутизировать данные через безопасный «туннель». В компаниях используют VPN для удалённого доступа сотрудников в корпоративную сеть, а коммерческие VPN-сервисы предлагают пользователям защиту трафика от перехвата, направляя его через удалённые серверы. Это означает, что ваш провайдер, государственные спецслужбы или любые посторонние лица не могут видеть, что вы делаете в интернете. Маршрутизация трафика через удалённый сервер также может создать впечатление, что вы выходите в интернет из другого места. Это позволяет людям в некоторых странах получить доступ к сайтам, которые по каким-то причинам заблокированы.

    Но VPN-соединения безопасны только в той степени, в какой безопасно само программное обеспечение. Специалисты по безопасности традиционно критически относятся к программному обеспечению VPN. Одна из причин этого заключается в том, что большинство программ для VPN невероятно сложны. Чем сложнее софт, тем сложнее провести аудит на предмет проблем безопасности.

    Старые VPN-программы «слишком огромны и сложны, и в принципе невозможно просмотреть и проверить, безопасны они или нет», — говорит Ян Йонссон (Jan Jonsson), генеральный директор VPN-провайдера Mullvad, на базе которого работает встроенный VPN-сервис в браузере Firefox.

    Автор WireGuard — хакер и пентестер Джейсон Доненфилд (Jason A. Donenfeld). Ему удалось написать гораздо более простой и лаконичный код, чем в большинстве других программ для VPN. Первая версия WireGuard содержала менее 4000 строк кода — по сравнению с десятками тысяч строк в других программах VPN. Это не делает WireGuard более безопасным, но значительно облегчает поиск и устранение проблем. Ключевые механизмы протокола шифрования показаны рис. 2.


    Рис. 2: (а) протокол WireGuard; (b) криптографические вычисления; (с) механизм куки в WireGuard для защиты хоста от DoS-атак

    Клиенты WireGuard уже выпущены для Android, iOS, MacOS, Linux и Windows. Компания Cloudflare запустила VPN-сервис Warp основан на протоколе WireGuard, и несколько коммерческих провайдеров VPN также позволяет пользователям использовать протокол WireGuard, в том числе TorGuard, IVPN, и Mullvad.

    Внедрение WireGuard непосредственно в ядро, которое напрямую взаимодействует с аппаратным обеспечением, должно ещё больше ускорить работу программы. WireGuard сможет шифровать и расшифровывать данные напрямую с сетевой карты, без необходимости передавать трафик через ядро и программное обеспечение на более высоком уровне.

    Официальный релиз Linux 5.6 состоится через несколько недель. После этого можно ожидать, что протокол WireGuard получит более широкое распространение в разных сервисах VPN, в том числе для защиты соединений между устройствами Интернета вещей, многие из которых работают на Linux.

    Автор программы Джейсон Доненфилд зарабатывал на жизнь взломом компьютерных систем (тесты на проникновение в рамках официального договора на консалтинговые услуги). Изначально он разработал WireGuard как инструмент эксфильтрации данных, чтобы скрытно снимать данные с компьютера жертвы.

    В 2012 году Джейсон переехал во Францию и, как и многие пользователи VPN, хотел выходить в интернет с американского узла. Но он не доверял существующему программному обеспечению VPN. В конце концов он понял, что может использовать свой инструмент эксфильтрации для маршрутизации трафика через компьютер своих родителей в США: «Я понял, что многие приёмы взлома систем (offensive security) на самом деле полезны и для защиты», — сказал он в интервью журналу Wired.

    Доненфельд изменил традиционный подход, который десятилетиями использовали VPN и криптографический софт. Например, другие VPN-системы позволяют пользователям выбирать один из нескольких алгоритмов шифрования. Но поддержка нескольких схем шифрования делает программное обеспечение более сложным и предоставляет больше возможностей для ошибок. WireGuard берёт на себя смелость принимать некоторые решения за пользователя. Это делает программу не такой гибкой, как IPsec и OpenVPN, но зато WireGuard на порядок проще, что, по мнению сторонников, снижает вероятность ошибок как со стороны разработчиков WireGuard, так и со стороны пользователей.

    Простой аудит кода — не единственная причина, по которой WireGuard привлекла к себе столько внимания. Самое большое достоинство WireGuard заключается в том, что «им приятно пользоваться, — говорит Томаш Птачек (Thomas Ptacek), исследователь в области безопасности. — Его не сложнее настроить, чем любой из сетевых инструментов, которыми уже пользуются разработчики».

    WireGuard находится в одном ряду с защищённым мессенджером Signal — они входят в широкое движение по созданию лучшего, более удобного программного обеспечения, основанного на современных криптографических методах.

    В 2019 году специалисты из французского Института компьютерных исследований и автоматизации провели оценку криптографии WireGuard. Они получили автоматизированное криптографическое доказательство математических методов, лежащих в основе WireGuard, хотя в самом коде всё ещё могут быть проблемы безопасности. Сейчас его проверяют разработчики Linux, а Доненфельд исправил несколько проблем в преддверии выхода нового ядра Linux 5.6 и WireGuard 1.0.



    PKI-решения для малого и среднего бизнеса от удостоверяющего центра GlobalSign Подробности уточняйте у менеджеров +7 (499) 678 2210, sales-ru@globalsign.com.
    GlobalSign
    Company

    Comments 50

      +1
      Давно хотел попробовать WireGuard, да вот на типовом VPS (centos7 например) обычно вот этим все заканчивается

      systemd[1]: Starting WireGuard via wg-quick(8) for wg0/server...
      wg-quick[4030]: [#] ip link add wg0-server type wireguard
      wg-quick[4030]: RTNETLINK answers: Operation not supported
      wg-quick[4030]: Unable to access interface: Protocol not supported
      wg-quick[4030]: [#] ip link delete dev wg0-server
      wg-quick[4030]: Cannot find device "wg0-server"
      systemd[1]: wg-quick@wg0-server.service: main process exited, code=exited, status=1/FAILURE
      systemd[1]: Failed to start WireGuard via wg-quick(8) for wg0/server.
      systemd[1]: Unit wg-quick@wg0-server.service entered failed state.
      systemd[1]: wg-quick@wg0-server.service failed.

      А openVPN там же становится сразу и без танцев.

      Disclaimer: это точка зрения с позиции продвинутого юзера.
        +3

        У вас нет пакета wireguard-dkms. В старых версиях wireguard был out-of-tree module и его надо было компилировать (этим dkms занимается). А wg-quick — это userspace утилита, она не может принудить ядро к поддержки того, чего в ядре нет.

          +1
          Угу, я уже нагуглил в свое время тоже самое. То есть проблема то известная, но скрипт для быстрой установки wg до сих пор никак не помогает ее решить.

          Опять же, в том тесте что делал сегодня:
          [root@ ~]# yum install wireguard-dkms
          Loaded plugins: fastestmirror
          Repository copr:copr.fedorainfracloud.org:jdoss:wireguard is listed more than once in the configuration
          Loading mirror speeds from cached hostfile
          * base: ftp.rz.uni-frankfurt.de
          * epel: mirror.23media.com
          * extras: mirror.23media.com
          * updates: ftp.rz.uni-frankfurt.de
          Package 1:wireguard-dkms-0.0.20200215-2.el7.noarch already installed and latest version
          Nothing to do

          Репозиторий указывать другой? Вот это все никак не способствует еще более широкому распространению WG имхо. А жаль.
            +1

            Я не спец по центосям, но гугль говорит так:


            curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
            yum install epel-release
            yum install wireguard-dkms wireguard-tools
              +1

              Тоже самое, nothing to do

                +1
                Предлагается перед установкой Wireguard (пере)установить kernel-headers.
                Плюс там же в комментах есть чей-то чужой пакет

                www.reddit.com/r/WireGuard/comments/cy8nk0/wireguard_module_not_loading_with_centos_7_kernel
                  0
                  Спасибо.

                  У меня была эта же проблема на CentOS 7.7

                  запустил вот эти команды и теперь всё работает:

                  yum install kernel-headers-"$(uname -r)" kernel-devel-"$(uname -r)" -y
                  sudo dkms build wireguard/0.0.20200215
                  sudo dkms install wireguard/0.0.20200215
                  sudo modprobe wireguard


                  Вместо «0.0.20200215» вам нужно будет использовать вашу версию wireguard, которую можно найти вот так:
                  dkms status
          0

          Ну вам уже ответили. Могу только добавить, что с Linux 5.6 вообще ставить ничего не будет.

            0
            Нашел такое:
            Обязательный момент, если Вы делаете настройку WG в Ubuntu и у Вас не стартует сервис:

            Feb 07 08:59:32 my-wg-vscale systemd[1]: Starting WireGuard via wg-quick(8) for wghub…
            Feb 07 08:59:32 my-wg-vscale wg-quick[30137]: [#] ip link add wghub type wireguard
            Feb 07 08:59:32 my-wg-vscale wg-quick[30137]: RTNETLINK answers: Operation not supported
            Feb 07 08:59:32 my-wg-vscale wg-quick[30137]: Unable to access interface: Protocol not supported
            Feb 07 08:59:32 my-wg-vscale wg-quick[30137]: [#] ip link delete dev wghub
            Feb 07 08:59:32 my-wg-vscale wg-quick[30137]: Cannot find device «wghub»
            Feb 07 08:59:32 my-wg-vscale systemd[1]: wg-quick@wghub.service: Main process exited, code=exited, status=1/FAILURE
            Feb 07 08:59:32 my-wg-vscale systemd[1]: wg-quick@wghub.service: Failed with result 'exit-code'.
            Feb 07 08:59:32 my-wg-vscale systemd[1]: Failed to start WireGuard via wg-quick(8) for wghub.

            Не забываем проверять загрузку модуля ядра modprobe wireguard:

            root@my-wg-vscale:~#modprobe wireguard
            modprobe: FATAL: Module wireguard not found in directory /lib/modules/4.15.0-50-generic

            Устанавливаем:

            root@my-wg-vscale:~#apt-get install linux-headers-$(uname -r)
            Reading package lists… Done
            Building dependency tree
            Reading state information… Done
            The following additional packages will be installed:
            linux-headers-4.15.0-50

            Профит, сервис запускается.
            +5

            К wireguard'у есть одна претензия. Они назвали этот параметр AllowedIPs, и теперь миллионы человек не могут настроить wireguard, потому что не понимают, что туда писать.


            (если кто-то нашёл этот коммент и не знает что туда писать — это список адресов или CIDR'ов, которые "перехватывает" wireguard для заворачивания в туннель. Фактически, это список адресов, с которыми вы хотите общаться через VPN).

              0

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

                +1

                Это не проблема VPN-сервера никаким образом. Вы включаете маршрутизацию на "сервере" wg (если у вас звезда или звёзды) и спокойно разруливаете их любым удобным для вас протоколом.


                Если у вас же mesh, то тут есть соотв. софт (да хоть bgp с "protocol direct"). Это точно не задача vpn-сервера и любая попытка вытащить сложную маршрутизацию туда ухудшит возможности "конструктора".

                  0
                  Такую маршрутизацию можно настроить только между серверами. BGP/OSPF на клиенте поднять сложно, если это, например, андроид. К тому же, если на сервере не указать адрес получателя, то не будет ходить мультикаст (ospf), а если указать, то он будет ходить только на указанный адрес, то есть остальные клиенты мимо кассы.
                    0
                    А еще стандартный wg-quick не позволяет задать peer адрес, приходится добавлять
                    PostUp = ip address add dev %i <local-ip> peer <remote-ip>
                      0

                      Клиенту не нужно держать полноценную сессию для маршрутизации.


                      (У меня в планах попробовать поиграться с wg и ipv6/ra — там можно анонсировать сети от роутера). Будут ли ra ходить через wg?

                        0
                        Предполагать могу разное, но не пробовал.

                        По поводу маршрутизации скажу так. Если удаленный сервер дает доступ только к определенным сетям (например, рабочий vpn), то адреса придется прописывать на каждом клиенте. И на каждом же обновлять по мере необходимости.
                          0

                          Если RA, то, может быть, будет само.
                          Проверил, будет.


                          net.ipv6.conf.wg0.accept_ra = 1
                          net.ipv6.conf.wg0.accept_ra_defrtr = 1
                          net.ipv6.conf.wg0.accept_ra_rtr_pref = 1

                            0
                            Было бы очень интересно почитать статью про настройку.
                            У меня на VPS хостер жмотится и выдает по одному ip, сеткой не делится, но на будущее пригодилось бы
                              0

                              Ща, я с ipv4 поверх wg наиграюсь, попробую сделать ipv6 без wg-quick'а.

                      0
                      дело скорее в динамических AllowedIPs, тогда и маршрутизацию можно будет нарулить.
                      Мой случай: это либо две точки входа в удаленную сеть, чтобы попасть внутрь, либо две равноправные точки выхода, которые надо динамически переключать между собой.
                      0

                      С точки зрения того же ospf стоит рассматривать сеть wg как point to multipoint non broadcast, прописать neighbour для доступных через vpn маршрутизаторов и проблемы с прописываем одинаковых мультикастовых allowed ip для разных пиров снимутся сами собой.

                        0
                        Можно пример конфигурации? Попробовал, но соседей не видит
                      +2

                      Ещё они сильно не хотят делать DisallowedIPs или поддержку ! в AllowedIPs. В итоге для исключения одной несчастной подсети приходиться писать абсолютно все остальные, которые не перекроют. Например официальное приложение на Android делает вот это, при включении опции Exclude local networks:


                      AllowedIPs = 0.0.0.0/5, 8.0.0.0/7, 11.0.0.0/8, 12.0.0.0/6, 16.0.0.0/4, 32.0.0.0/3, 64.0.0.0/2, 128.0.0.0/3, 160.0.0.0/5, 168.0.0.0/6, 172.0.0.0/12, 172.32.0.0/11, 172.64.0.0/10, 172.128.0.0/9, 173.0.0.0/8, 174.0.0.0/7, 176.0.0.0/4, 192.0.0.0/9, 192.128.0.0/11, 192.160.0.0/13, 192.169.0.0/16, 192.170.0.0/15, 192.172.0.0/14, 192.176.0.0/12, 192.192.0.0/10, 193.0.0.0/8, 194.0.0.0/7, 196.0.0.0/6, 200.0.0.0/5, 208.0.0.0/4, 8.8.8.8/32
                        –1

                        Такие штуки можно с most specific в локальной маршрутизации разрулить.

                        0
                        Логика в этом названии всё-таки есть. Это как раз список тех адресов, к которым WireGuard в принципе разрешит обращаться через тоннель. Что вполне соответствует названию параметра. И по умолчанию создаст соответствующий маршрут, да, но маршрутизацию можно сделать и другую.
                        Скажем, у меня из домашней сети wg-тоннель к зарубежному серверу, куда маршрутизируются все нелюбимые РКНом адреса. AllowedIPs там 0.0.0.0/0, а маршруты уже строятся динамически.
                          +1

                          С точки зрения настраивающего не понятно — это адреса в туннеле, или это адреса, с которых разрешено подключаться к wg? (так сказать, обратная сторона Endpoint). Вот я довольно серьёзно тупил при чтении мана над этим вопросом. Особенно, с учётом man'а к wg-quick, который говорит "ну, тут все параметры как у wg, плюс несколько своих".

                          +2
                          К ваергарду как инструменту обхода цензуры есть немного другая претензия — он детектится даже ваершарком, не говоря уже про DPI

                          Но да, производительность у ваергарда топовая, если живешь в свободной стране, это достаточно хороший выбор
                            0
                            это список адресов или CIDR'ов, которые "перехватывает" wireguard

                            wg ничего не перехватывает. Что маршрутизацией на интерфейс завернули, то и передаёт. Так что allowedips это именно список разрешенных к проброске к данному пира через vpn адресов

                              0

                              wg-quick перехватывает, настраивая маршруты ip-set'ом.

                                0

                                ну это все-таки побочное действие именно wg-quick


                                если настраивать интерфейсы через systemd-networkd, то такой побочки нет и о маршрутах нужно заботиться самостоятельно. А вот сам wireguard пакеты с ip не в списке allowed от пира принимать не будет. И это основное предназначение параметра.

                                  0

                                  О как, т.е. это ещё и подобие файрвола на трафик из туннеля?

                                    0

                                    в первую очередь
                                    wg это не point-to-point, а point-to-multipoint, т.е. один wg интерфейс может общаться с несколькими пирами. Традиционным фаерволом трафик разрулить будет весьма проблематично.

                                      0
                                      только он еще использует этот параметр для определения кому из пиров отправлять пакет. и очень неясно что происходит при определении пересекающихся/одинаковых подсетях в AllowwedIPs.
                            0
                            А зачем заменять IPsec и OpenVPN?
                              0
                              По сравнению с OpenVPN на телефоне меньше жрет батарею, быстрее скорость, моментальное переподключение при смене сетей.
                              На десктопе-сервере тоже есть плюсы, но, имхо, менее выражены
                                0

                                А что на телефоне с клиентами и Persistent VPN? Смогу ли я указать DNS внутри моей сети, через которую я выхожу в общий интернет?
                                У меня просто в домашней локалке сейчас l2tp/IPsec и я всё в pi-hole заворачиваю

                                  +1
                                  Штатная настройка в конфиге — ip dns внутри сети. Проверял — dns трафик уходит в тоннель
                                    0
                                    Спасибо
                                    +1
                                    Хм. А для чего вам l2tp, можно же завернуть в чистый ipsec с ikev2? Его сейчас, вроде, все поддерживают уже.
                                      0
                                      Так исторически сложилось) Mikrotik'и и одна нода в Чехии. Настроил когда-то и забил. Есть принципиальный плюс в переходе на ikev2?
                                        0
                                        Чуть меньше проблем с разными провайдерами, работает шустрее, проще с авторизацией по сертификату. В современном железе микротиков есть аппаратное ускорение.
                                        Бонусом — на тот же сервер можно ходить не только микротиками, но и любым другим компьютером|телефоном без проблем. Ну и мне гораздо больше нравится жизнь без pre-shared key, но это уже личное.
                                        Микротики, ноут, телефон и нода в Google Cloud :)
                                          0
                                          Кинь в меня куском конфига Микротика, если не трудно) Именно эту секцию.
                                0
                                Попробовал Wireguard с помощью Streisand, но есть проблемы: в zoom меня не слышат, а на мобиле в сети Мегафона он вообще не подключается. А так, да, работает раза в 2-3 быстрее чем OpenVPN.
                                  0

                                  Случайно не по 53 порту подключались? Не смог на МФ подключиться с андройда по 53 порту, на других портах работает отлично

                                    0

                                    Оп. А Мегафон режет его?

                                      0

                                      Только что проверил на всякий случай. Да мегафон режет или фильтрует днс трафик по 53 порту, соответствено и wireguard не поднимается. На мтс все работает отлично.

                                        0
                                        Скорее всего, будут проблемы с любыми провайдерами, кто заворачивает DNS к себе. Должны быть такие же проблемы у Дом.ru и прочих.
                                        0
                                        Проверил настройки, у меня 51820, и всё равно не работает. Может и его режут.
                                      0
                                      Я правильно понимаю, что никаких вызовов скриптов в моменты подключения\отключения клиентов не предусмотрено?
                                      И маршруты на адреса пиров есть в таблице маршрутов всегда, даже если пир оффлайн?
                                      Это by design фича, или всё таки как то будет дописываться?
                                        0

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


                                        Опечатку исправьте, коже->коде

                                        Only users with full accounts can post comments. Log in, please.