- Register the AWS Free Account
- 2. AWS account creation
- 4. Specify billing information
- 5. Account Verification
- 6. Choosing an AWS support plan
- 1.1. Choose Instance type
- 1.2. Configure Instance details
- 1.3. Add storage
- 1.5. Opening ports
- 1.6. Review Instance Launch settings
- 1.7. Creating access keys
- 1.7.1. Save private keys (.pem)
- 1.8. Instance Launch Summary
- 2.1. Create an External IP
- 2.2. External IP setup
- 2.3. IP address overview
- 2.4. List of external IP addresses
- 2.5. Assign an external IP to Instance
- 2.6. Associate address with Instance
- 2.7. External IP assignment Summary
- Connect to AWS instance
- 1. Connect from a Windows PC via SSH
- 1.1.1. Import AWS key into Putty
- 1.1.2. AWS key in PEM format
- 1.1.3. Set the Key import parameters
- 1.1.4. Save the imported .ppk key
- 1.2.1. Make a connection
- 1.2.3. Use a private key for an SSH connection
- 1.2.4. Open the private key file
- 1.2.5. Save changes and launch an SSH remote connection
- 1.2.7. Set a trust between hosts
- 1.2.8. Enter the password to activate the key
- 1.2.9. Successful connection
- 1. Install Wireguard
- 1.1. Clone the scripts repository
- 1.2. Directory of scripts repository
- 1.3.2. Set internal IP address
- 1.3.3. Specify DNS Server
- 1.3.4. Specify WAN Interface
- 2.2. Client configuration with QR code
- 1. Android mobile Client setup
- 2. Windows Client Setup
- 2.1. Create a local text file to import configuration
- 2.3. Paste the configuration text to a local text file
- 2.4. Save the local configuration file
- 2.5. Import local configuration file
- 2.6. Establish a VPN connection
- Stages
- What is wireguard vpn?
- Wireguard быстрее других решений vpn?
- Wireguard так просто пользоваться?
- Бенчмарки
- Как выглядит реальность?
- Конфиденциальность данных
- Криптография!
- О сложности протокола
- Об игнорировании реальных проблем
- Перенесет ли wireguard мой roadwarrior с ноутбука в дата-центр?
- Подключение к wireguard серверу
- Последний проблеск надежды
- Проблемы интеграции в linux
- Протоколы шифрования openvpn
- Протоколы шифрования wireguard
- Реализация vpn доступа через ci pipelines в gitlab
- Сбор логов
- Создание клиентского конфига wireguard
- Сравнение производительности
- Станет ли wireguard заменой моей [ipsec] vpn-связи между сайтами?
- Техническая документация wireguard
- Устанавливаем wireguard на ubuntu 18.04.5 lts
- Устанавливаем и настраиваем shorewall
- Шифрование: отличия wireguard от openvpn
- Итоги: какой же vpn выбрать?
- 1.3.1. Set connection endpoint (IP:port)
- Выводы по стандартам шифрования и безопасности
- Вывод
- Выводы по конфиденциальности данных
- Выводы по скорости vpn-соединения
Register the AWS Free Account
To register an AWS account, you need to submit a valid phone number and a bank card (Visa or Mastercard). I recommend using virtual cards provided for free by Yandex.Money or Qiwi wallet.AWS checks the validity of the card by deducting 1$ at registration followed by the refund.
2. AWS account creation
Fill in the data and click the Continue button.
4. Specify billing information
Card number, expiry date, and a cardholder name.
5. Account Verification
AWS verifies your phone number and debits $ 1 from your bank card. Then you should get a 4-digit code on the computer screen and receive a call from Amazon. During a call, you need to dial the 4-digit code shown on the screen.
6. Choosing an AWS support plan
Choose a Basic plan (free).
1.1. Choose Instance type
The t2.micro instance type is set by default and is the right one to go with. Click the Next: Configure Instance Details button to proceed.
1.2. Configure Instance details
Disable the auto-assignment of the public IP as you will assign a static one to your Instance. Click the Next: Add Storage button.
1.3. Add storage
Specify the size of the Drive — the 16GB is enough.Click Next: Add Tags button.
1.5. Opening ports
Configure the firewall by assigning open ports. The set of open ports is called the «Security Group». You need to create a new «Security Group», give it a name, a description and a UDP port (Custom UDP Rule).In the Port Range field specify a port number from the range 49152 — 65535 of dynamic ports. In my case, I choose the 54321 port number.Click the Review and Launch button to complete this step.
1.6. Review Instance Launch settings
Review and check all the settings for Instance Launch, and if all is OK click the Launch button.
1.7. Creating access keys
Create or add an existing SSH key in the dialog box that you will use for remote connection to your instance.Choose the «Create a new key pair» to generate a new key. Give it a name and click the Download Key Pair button to download the generated key to the PC drive. Click the Launch Instances button.
1.7.1. Save private keys (.pem)
When you click the Download Key Pair you save the key as a .pem file.For better management, I assigned a wireguard-awskey.pem name to the file.
1.8. Instance Launch Summary
Next, you should see a message about the successful launch of the Instance that you have created. You can visit the list of your Instances by clicking the View instances button.
2.1. Create an External IP
Next is the creation of an external IP address, that you will use to connect to the VPN server.Find the Elastic IPs in the NETWORK & SECURITY category of the navigation panel. Click the Allocate new address button.
2.2. External IP setup
In the next step you need to enable the Amazon pool (which is by default), and click the Allocate button
2.3. IP address overview
The next window displays an external IP address assigned by the Amazon pool. Write it down, as you will need it fo the configuration process and for VPN server setup. In this guide, as an example, I use the IP address 4.3.2.1.Once you finish this step, click the Close button.
2.4. List of external IP addresses
Next, you should get a list of your public IP addresses (Elastics IPs).
2.5. Assign an external IP to Instance
Choose the IP address from the list (see 2.2.3), and click the mouse right button for a drop-down menu.In this menu choose the Associate address to assign an IP to the created Instance.
2.6. Associate address with Instance
In the drop-down menu select the created Instance, and click the Associate button.
2.7. External IP assignment Summary
You should now have a created Instance with an assigned public IP address. This enables you to make a remote connection to the Instance from outside (from your PC) via SSH.
Connect to AWS instance
SSH is a secure protocol to manage remote computer devices.
1. Connect from a Windows PC via SSH
Download and install a Putty to make a connection from the Windows PC.
1.1.1. Import AWS key into Putty
Launch a PuTTYgen utility to match your AWS key in .pem format with a .ppk format suitable for the Putty.To do this select Conversions -> Import Key from the top menu.
1.1.2. AWS key in PEM format
Next, choose the key that you dealt with in 2.1.7.1In my case it is wireguard-awskey.pem.
1.1.3. Set the Key import parameters
At this step, you need to specify the import parameters of the Key — the key comment and the key passphrase. You will need these at every connection. Also it protects the key itself with a password from unauthorized access.
1.1.4. Save the imported .ppk key
You can save your private key in a .ppk format suitable for Putty from the save file dialog box.Specify the key name (in my case, wireguard-awskey.ppk) and click the Save button.
1.2.1. Make a connection
Run the Putty program, choose the Session category (it is open by default) and in the Host Name field enter the public IP address of the server. I remind that you got your public IP address in step 2.2.3.Give any name to the connection in the Saved Session field (for me it is wireguard-aws-london). Click the Save button.
1.2.3. Use a private key for an SSH connection
Follow the path Connection -> SSH -> Auth subcategory and click on the Browse button to choose the private key file.
1.2.4. Open the private key file
Specify the key that you imported earlier in step 3.1.1.4 — wireguard-awskey.ppk, and click the Open button.
1.2.5. Save changes and launch an SSH remote connection
In the Session category of Putty configuration window press the Save button to apply all the changes you made in (3.1.2.2 — 3.1.2.4).Click the Open button to launch the ready-to-go SSH remote connection.
1.2.7. Set a trust between hosts
At the first connection, you should get a warning about the lack of trust between two computers (hosts). The system asks you whether you trust the remote host. Click Yes to add the remote host to the trust list.
1.2.8. Enter the password to activate the key
In a Putty terminal window enter the key password you set in step3.1.1.3. When entering the password it does not show any action on the screen. No worries, if you make a mistake, you can use the backspace key.
1.2.9. Successful connection
Once you enter the correct password, you should get a welcome text. It informs you that the remote system is ready to execute your commands.
1. Install Wireguard
Enter the following commands in the Putty terminal.You can copy them to the clipboard, and paste in the terminal by pressing the right mouse button.
1.1. Clone the scripts repository
Clone a Wireguard installation scripts repository:
1.2. Directory of scripts repository
Go to the directory of the cloned repository:
cd wireguard_aws
1.3.2. Set internal IP address
Enter the IP address of the Wireguard server in a secure VPN subnet. If you do not know what it is, press Enter key to set the default value (10.50.0.1).
Enter the server address in the VPN subnet (CIDR format) ([ENTER] set to default: 10.50.0.1):
1.3.3. Specify DNS Server
Enter the IP address of the DNS server, or press Enter key to set the default value 1.1.1.1 (Cloudflare public DNS).
Enter the ip address of the server DNS (CIDR format) ([ENTER] set to default: 1.1.1.1):
1.3.4. Specify WAN Interface
Enter the name of the external network interface. This interface will sense the internal network interface of the VPN.Press Enter to set the default for AWS (eth0)
Enter the name of the WAN network interface ([ENTER] set to default: eth0):
2.2. Client configuration with QR code
Execute the qrencode -t ansiutf8 command to get the QR of a created client config. (in my case, the new client name is Alex@mobile).
sudo cat /etc/wireguard/clients/Alex@mobile/Alex@mobile.conf | qrencode -t ansiutf8
1. Android mobile Client setup
Download the Wireguard mobile client for Android from the official GooglePlay store.
Scan the QR code to import the client configuration (see 4.2.2) and assign it a name.
After importing the configuration, you can enable the VPN tunnel. A little key symbol in the Android system confirms the VPN connection.
2. Windows Client Setup
Download and install the TunSafe, which is a Wireguard client for Windows.
2.1. Create a local text file to import configuration
Create a dummy text file on the desktop of your PC.
2.3. Paste the configuration text to a local text file
Paste the configuration text from the clipboard to dummy text file we created earlier on the desktop (see 5.2.1).
2.4. Save the local configuration file
Save the text file as the .conf format (in my case as london.conf)
2.5. Import local configuration file
Import the configuration file into the TunSafe program.
2.6. Establish a VPN connection
In TunSafe program select the imported configuration file and click the Connect button.
Stages
- Register the AWS Account.
- Create an AWS instance.
- Connect to AWS instance.
- Configure Wireguard server.
- Configure VPN Clients.
- Verify VPN connection.
What is wireguard vpn?
WireGuard® is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography. It aims to be faster, simpler, leaner, and more useful than IPsec, while avoiding the massive headache. It intends to be considerably more performant than OpenVPN.
WireGuard is designed as a general purpose VPN for running on embedded interfaces and super computers alike, fit for many different circumstances. Initially released for the Linux kernel, it is now cross-platform (Windows, macOS, BSD, iOS, Android) and widely deployable.
Wireguard быстрее других решений vpn?
Если кратко: нет, не быстрее.
ChaCha20 — это потоковый шифр, который легче внедрить в программное обеспечение. Он шифрует один бит за раз. Блочные протоколы, такие как AES, шифруют блок по 128 бит за раз. Для реализации аппаратной поддержки потребуется гораздо больше транзисторов, поэтому более крупные процессоры поставляются с AES-NI — расширением набора команд, которое выполняет некоторые задачи процесса шифрования для его ускорения.
Ожидалось, что AES-NI никогда не попадет в смартфоны [а оно попало, — прим. пер.]. Для этого был разработан ChaCha20 — в качестве легкой и экономичной альтернативы, щадящей заряд батареи. Поэтому для вас может стать новостью, что каждый смартфон, который вы можете сегодня приобрести, имеет то или иное ускорение для AES и работает с этим шифрованием быстрее и с меньшим энергопотреблением, чем с ChaCha20.
Очевидно, что практически каждый процессор для настольных ПК / серверов, купленный за последние пару лет, имеет AES-NI.
Следовательно, я ожидаю, что AES превзойдет ChaCha20 в каждом отдельно взятом сценарии. В официальной документации WireGuard упоминается, что благодаря AVX512 ChaCha20-Poly1305 будет превосходить AES-NI, но это расширение набора команд будет доступно только на больших процессорах, что опять-таки не поможет с меньшим и мобильным оборудованием, которое всегда будет быстрее работать с AES-NI.
Я не уверен, можно ли было предвидеть это при разработке WireGuard, но сегодня факт того, что он гвоздями прибит к одному шифрованию — уже является недостатком, который может не очень хорошо повлиять на его работу.
IPsec позволяет свободно выбирать, какое шифрование лучше всего подходит для вашего случая. И само собой, это необходимо, если вы, например, хотите передать 10 и более гигабайт данных через VPN-соединение.
Wireguard так просто пользоваться?
Пока нет. Я не говорю, что WireGuard никогда не будет хорошей альтернативой для проброса туннеля между двумя точками, но пока он — всего лишь альфа-версия продукта, которым должен стать.
Но что тогда на самом деле он делает? Действительно ли IPsec настолько сложнее в эксплуатации?
Очевидно, что нет. Поставщик IPsec продумал этот момент и поставляет свой продукт вместе с интерфейсом, например, с IPFire.
Для настройки VPN-туннеля через IPsec вам потребуется пять наборов данных, которые нужно будет внести в конфигурацию: ваш собственный публичный IP-адрес, публичный IP-адрес принимающей стороны, подсети, которые вы хотите сделать общедоступными через это VPN-соединение и pre-shared ключ. Таким образом, VPN настраивается в течение нескольких минут и он совместим с любым вендором.
К сожалению, в этой истории есть несколько исключений. Каждый, кто пытался пробросить VPN-туннель через IPsec к машине на OpenBSD, понимает, о чем я говорю. Есть еще пара болезненных примеров, но на самом деле положительной практики использования IPsec намного и намного больше.
Бенчмарки
А теперь перейдем к бенчмаркам из документации WireGuard. Хотя это [документация] не научная статья, я все же ожидал от разработчиков более научного подхода, либо использования научного подхода в качестве эталона. Любые бенчмарки бесполезны, если их нельзя воспроизвести, и еще более они бесполезны, когда получены в лабораторных условиях.
В сборке WireGuard для Linux он получает преимущество, используя GSO — Generic Segmentation Offloading. Благодаря ему, клиент создает огромный пакет размером 64 килобайта и шифрует/расшифровывает его за один подход. Таким образом, затраты на вызов и реализацию криптографических операций снижаются. Если вы хотите максимизировать пропускную способность вашего VPN-соединения — это хорошая идея.
Но, как это водится, в реальности не все так просто. Отправка такого большого пакета на сетевой адаптер требует, чтобы он бы был нарезан на множество меньших пакетов. Обычный размер отправления составляет 1500 байт. То есть наш гигант в 64 килобайта будет разделен на 45 пакетов (1240 байт информации и 20 байт IP-заголовка).
Таким образом, высокая пропускная способность, о которой так смело заявляет WireGuard, достигается за счет замедления сетевой работы других приложений. И команда WireGuard уже этот мой вывод.
Но давайте двигаться дальше.
Согласно бенчмаркам в техдокументации, соединение показывает пропускную способность в 1011 Мбит/с.
Впечатляет.
Особенно это впечатляет из-за того, что максимальная теоретическая пропускная способность одного гигабитного Ethernet-подключения составляет 966 Мбит/с при размере пакета в 1500 байт минус 20 байт на IP-заголовок, 8 байт на UDP-заголовок и 16 байт на заголовок самого WireGuard.
С огромными фреймами и преимуществами GSO, о которых мы говорили выше, теоретический максимум при размере фрейма в 9000 байт будет равен 1014 Мбит/с. Обычно такая пропускная способность в реальности недостижима, потому что связана с большими трудностями.
Таким образом, я могу только предположить, что тест был выполнен с использованием еще более жирных фреймов с превышением размера в 64 килобайта с теоретическим максимумом в 1023 Мбит/с, что поддерживается только некоторыми сетевыми адаптерами. Но это абсолютно неприменимо в реальных условиях, либо может использоваться только между двумя напрямую соединенными между собой станциями, исключительно в рамках тестового стенда.
Но так как VPN-туннель пробрасывается между двумя хостами с помощью интернет-соединения, которое вообще не поддерживает большие фреймы, достигнутый на стенде результат не может быть принят за эталон. Это просто нереальное лабораторное достижение, которое невозможно и неприменимо в реальных боевых условиях.
Даже сидя в дата-центре я не смог бы перебрасывать фреймы размером более 9000 байт.
Критерий применимости в реальной жизни абсолютно нарушен и, как я думаю, автор проведенного «измерения» серьезно дискредитировал сам себя по понятным причинам.
Как выглядит реальность?
К сожалению, каждый раз, когда клиент просит меня настроить ему VPN-соединение, я сталкиваюсь с тему, что они используют устаревшие учетные данные и шифрование. 3DES в связке с MD5 — все еще распространенная практика, также как AES-256 и SHA1. И хотя последний чуть лучше — это не то, чем стоит пользоваться в 2020 году.
Для обмена ключами всегда используется RSA — медленный, но достаточно безопасный инструмент.
Мои клиенты связаны с таможенными органами и другими госорганизациями и учреждениями, а также с крупными корпорациями, названия которых знают по всему миру. Все они используют форму запроса, которая была создана десятилетия назад, а возможность использования SHA-512 просто никогда не добавлялась.
Мне больно это видеть, потому что IPsec поддерживает эллиптические кривые на вскидку так с года 2005. Curve25519 также новее и доступен для использования. Еще есть альтернативы AES, такие как Camellia и ChaCha20, но, очевидно, не все из них поддерживаются крупными поставщиками, такими как Cisco и прочими.
И люди этим пользуются. Есть много комплектов Cisco, есть множество комплектов, созданных для работы с Cisco. Они являются лидерами рынка в этом сегменте и не очень заинтересованы в каких-либо инновациях.
Да, ситуация [в корпоративном сегменте] ужасна, но мы не увидим каких-либо изменений из-за WireGuard. Производители, вероятно, никогда не выявят каких-либо проблем с производительностью уже используемого инструментария и шифрования, не увидят проблем при использовании IKEv2 — и поэтому они не ищут альтернатив.
Вообще, вы задумывались когда-нибудь об отказе от Cisco?
Конфиденциальность данных
VPN-протоколы уделяют гораздо большее внимание безопасности соединения, нежели конфиденциальности. Однако возможность сохранения анонимности тоже имеет значение — кому охота писать объяснительные по факту закачки учебника Oracle, или эмулятора топологии Cisco? Ничто так хорошо не выдает факт правонарушения, как IP адрес пользователя.
Настройки Wireguard в явном виде содержат IP адреса пользователей и это обстоятельство не позволит им остаться незамеченным после того, как сервером заинтересуются правоохранительные органы. Сетевой трафик прочитать, конечно, не удастся, однако можно идентифицировать самих участников защищенного соединения.
Сама настройка защищенного соединения Wireguard довольно проста. Сперва установка.
(1:530)$ sudo emerge -av wireguard-modules wireguard-tools
These are the packages that would be merged, in order:
Calculating dependencies... done!
[binary N ] net-dns/openresolv-3.11.0 USE="(-selinux)"
[binary N ] virtual/resolvconf-1
[ebuild N ] net-vpn/wireguard-modules-1.0.20202221 USE="module -debug -module-src"
[binary N ] net-vpn/wireguard-tools-1.0.20200827 USE="wg-quick"
Would you like to merge these packages? [Yes/No]
Создаем открытый и закрытый ключи.
(1:531)$ wg genkey | tee privatekey | wg pubkey > publickey
Далее, необходимо настроить файл /etc/wireguard/wg0.conf.
Криптография!
Но что это за интересное новое шифрование, которое использует WireGuard?
WireGuard использует Curve25519 для обмена ключами, ChaCha20 для шифрования и Poly1305 для аутентификации данных. Также он работает с SipHash для хеш-ключей и BLAKE2 для хеширования.
ChaCha20-Poly1305 стандартизирован для IPsec и OpenVPN (через TLS).
Очевидно, что разработка Даниэля Бернштейна используется очень часто. BLAKE2 является преемником BLAKE, финалиста SHA-3, который не выиграл из-за своего сходства с SHA-2. Если бы SHA-2 был взломан, была большая вероятность, что и BLAKE окажется скомпрометирован.
IPsec и OpenVPN не нуждаются в SipHash из-за их дизайна. Таким образом, единственное, что в настоящее время не может использоваться с ними, это BLAKE2, и то, только пока он не будет стандартизирован. Это не есть большой недостаток, потому что VPN используют HMAC для создания целостности, которая считается сильным решением даже в связке с MD5.
Так я пришел к выводу, что во всех VPN используется практически один и тот же набор криптографических инструментов. Поэтому WireGuard не более и не менее безопасен, чем любые другие актуальные продукты, когда дело доходит до шифрования или целостности передаваемых данных.
Но даже не это самое главное, на что стоит обратить внимание согласно официальной документации проекта. Ведь главное — это скорость.
О сложности протокола
Конечный потребитель не должен беспокоиться о сложности протокола.
Если бы мы жили в мире, где это было реальной заботой юзера, то мы уже давно избавились бы от SIP, H.323, FTP и других, созданных более десяти лет назад протоколов, которые плохо работают с NAT.
Об игнорировании реальных проблем
Представьте, что у вас есть VPN-сервер с 200 боевыми клиентами, где-то по всему миру. Это вполне стандартный сценарий использования. Если вам придется менять шифрование, вам нужно доставить обновление на все копии WireGuard на этих ноутбуках, смартфонах и так далее.
Одновременно доставить. Это буквально невозможно. Администраторам, которые попытаются это сделать, потребуются месяцы для развертывания необходимых конфигураций, а средним компаниям буквально понадобятся годы на проведение подобного мероприятия.
IPsec и OpenVPN предлагают функцию согласования шифров. Поэтому некоторое время, после которого вы включите новое шифрование, будет работать и старое. Благодаря этому текущие клиенты смогут обновиться до новой версии. После того, как обновление будет раскатано, вы просто выключите уязвимое шифрование. И все! Готово! вы восхитительны! А клиенты этого даже не заметят.
На самом деле это очень распространенный кейс для больших развертываний, и даже OpenVPN испытывает в этом некоторые трудности. Обратная совместимость важна, и хотя вы используете более слабое шифрование, для многих это не становится причиной закрытия бизнеса. Потому что это приведет к параличу работы сотен клиентов из-за неспособности выполнять свою работу.
Команда WireGuard сделала свой протокол проще, но совершенно непригодным для людей, которые не имеют постоянного контроля над обоими пирами своего туннеля. По моему опыту именно такой сценарий — наиболее распространенный.
Перенесет ли wireguard мой roadwarrior с ноутбука в дата-центр?
Нет. Прямо сейчас в WireGuard не реализовано огромное количество важных функций, чтобы он смог сделать что-то подобное. Например, он не может использовать динамические IP-адрес на стороне сервера туннеля, и уже только это ломает весь сценарий подобного использования продукта.
IPFire часто используется для дешевых интернет-каналов, например, для DSL или кабельного соединения. Это имеет смысл для малого или среднего бизнеса, которому не нужно быстрое оптоволокно. [Примечание от переводчика: не стоит забывать, что в плане связи Россия и некоторые страны СНГ находятся далеко впереди Европы и США, потому что мы начали строить свои сети намного позже и с приходом Ethernet и оптоволоконных сетей в качестве стандарта, нам было проще перестроиться.
В тех же странах ЕС или США, xDSL широкополосный доступ на скорости 3-5 Мбит/с — до сих пор всеобщая норма, а оптоволоконное подключение стоит каких-то нереальных по нашим меркам денег. Поэтому автор статьи и говорит о DSL или кабельном подключении, как о норме, а не дремучей старине.
Существует подпроект под названием , который добавляет демон пользовательского пространства для преодоления этого недостатка. Огромная проблема пользовательского сценария, описанного выше — это усугубление ситуации динамической IPv6-адресацией.
С точки зрения дистрибьютора все это тоже выглядит не очень. Одна из целей разработки было сохранить простоту и чистоту протокола.
К сожалению, все это на самом деле стало слишком простым и примитивным, так что нам приходится использовать дополнительное ПО, чтобы вся эта конструкция была жизнеспособной в условиях реальной эксплуатации.
Подключение к wireguard серверу
Последний проблеск надежды
На сайте WireGuard много говорится о контейнерах и становится понятно, для чего он на самом деле предназначен.
Простой и быстрый VPN, который не требует настройки и может быть развернут и настроен массивными инструментами оркестровки, как, например, у Amazon в их облаке. Конкретно Amazon использует новейшие аппаратные функции, о которых я упоминал ранее, например — AVX512. Делается это для того, чтобы ускорить работу и не привязываться к x86 или любой другой архитектуре.
Они оптимизируют пропускную способность и пакеты, размер которых превышает 9000 байт — это получатся огромные инкапсулированные фреймы для общения контейнеров между собой, или для операций резервного копирования, создания снапшотов или развертывая этих самых контейнеров. Даже динамические IP-адреса никак не повлияют на работу WireGuard в случае описанного мною сценария.
Неплохо сыграно. Блестящая реализация и очень тонкий, почти эталонный протокол.
Но он просто не подходит для мира за пределами полностью контролируемого вами дата-центра. Если же вы рискнете и начнете использовать WireGuard, вам придется идти на постоянные компромиссы при разработке и реализации протокола шифрования.
Проблемы интеграции в linux
Я не до конца в курсе, какова ситуация в других операционных системах, но вероятно, она не сильно отличается от ситуации с Linux.
Протоколы шифрования openvpn
OpenVPN поддерживает множество криптографических алгоритмов, используя библиотеку
. Более точно, для шифрования и аутентификации используются следующие алгоритмы.
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb aria-128-cbc aria-128-cfb
aria-128-cfb1 aria-128-cfb8 aria-128-ctr aria-128-ecb
aria-128-ofb aria-192-cbc aria-192-cfb aria-192-cfb1
aria-192-cfb8 aria-192-ctr aria-192-ecb aria-192-ofb
aria-256-cbc aria-256-cfb aria-256-cfb1 aria-256-cfb8
aria-256-ctr aria-256-ecb aria-256-ofb base64
bf bf-cbc bf-cfb bf-ecb
bf-ofb camellia-128-cbc camellia-128-ecb camellia-192-cbc
camellia-192-ecb camellia-256-cbc camellia-256-ecb cast
cast-cbc cast5-cbc cast5-cfb cast5-ecb
cast5-ofb des des-cbc des-cfb
des-ecb des-ede des-ede-cbc des-ede-cfb
des-ede-ofb des-ede3 des-ede3-cbc des-ede3-cfb
des-ede3-ofb des-ofb des3 desx
idea idea-cbc idea-cfb idea-ecb
idea-ofb rc2 rc2-40-cbc rc2-64-cbc
rc2-cbc rc2-cfb rc2-ecb rc2-ofb
rc4 rc4-40 rc5 rc5-cbc
rc5-cfb rc5-ecb rc5-ofb seed
seed-cbc seed-cfb seed-ecb seed-ofb
sm4-cbc sm4-cfb sm4-ctr sm4-ecb
Для хеш сумм доступны такие функции.
(1:701)$ openssl dgst —list
Supported digests:
-blake2b512 -blake2s256 -md4-md5 -md5-sha1 -mdc2-ripemd -ripemd160 -rmd160-sha1 -sha224 -sha256-sha3-224 -sha3-256 -sha3-384-sha3-512 -sha384 -sha512-sha512-224 -sha512-256 -shake128-shake256 -sm3 -ssl3-md5-ssl3-sha1 -whirlpoolOpenVPN в связке с OpenSSL поддерживает PKI стандарты RSA, DSA и ECDSA, однако не все из них пригодны для любых пользовательских сценариев. Так, ключи ECDSA пока еще не получили широкой поддержки со стороны корневых CA.
Протоколы шифрования wireguard
В отличие от OpenVPN, Wireguard не использует сертификаты X.509 и лишен сопутствующих
. Вместо этого Wireguard использует асимметричное шифрование с открытым и закрытым ключом.
Реализация vpn доступа через ci pipelines в gitlab
Допустим у нас уже есть selfhosted gitlab для внутреннего использования, если нет, то его не так сложно развернуть через тот-же docker-compose.
Для начала создадим новую группу и новый проект, создадим репозиторий vpn-01 и создадим следующую структуру
Сбор логов
Допустим по счастливой случайности так оказалось, что в нашей сети есть не только GitLab, но и Elasticsearch с Kibana. Реализуем пересылку и хранение логов в Elasticsearch.
Для начала на vpn сервере исправим значение на открытие файлов
nano /etc/security/limits.conf
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536
После этого нужно будет перезагрузится
Устанавливаем на vpn сервер Fluentd
Создание клиентского конфига wireguard
Сравнение производительности
Так как Wireguard реализован в пространстве ядра, а OpenVPN в пользовательском пространстве, у первого должно быть преимущество в скорости. Связано это с тем, что пакеты постоянно копируются из одного пространства в другое и кроме того требуется постоянная фоновая служба OpenVPN.
Все это необходимо проверить на практике, к счастью есть множество замеров скорости для VPN туннелей. Для начала можно взглянуть на результаты VPN-дерби от самого автора Wireguard. Вот некоторые детали и результаты замера.
Сравнение производительности различных VPN со стороны Jason A. Donenfeld-а
В обоих тестах — на пропускную способность и время отклика ping, Wireguard значительно превзошел OpenVPN, а заодно и две вариации IPSec-а. Кроме того, во время теста на пропускную способность с использованием OpenVPN и IPSec утилизация CPU достигала 100%.
Естественно предположить, что автор Wireguard может быть предвзятым в составлении сценариев и трактовке результатов замера производительности технологий VPN. Следовательно, имеет смысл ознакомиться с другими тестами скорости разных VPN. Благо все, что для этого нужен VPS сервер, VPN и пакет iperf3.
Но и другие подобные тесты показывают превосходство Wireguard в тестах производительности.
Сравнение производительности Wireguard и OpenVPN
Неожиданным фактом можно считать, что openvpn-tcp быстрее openvpn-udp, однако при ближайшем рассмотрении все становится на свои места. TCP-поток имеет меньше завершенных тестов, чем UDP. Во всяком случае и тут Wireguard показывает лучшие результаты производительности.
В той же серии тестов любопытно сравнение скорости VPN-соединения в зависимости от числа открытых сокетов. При росте их количества производительность Wireguard скачкообразно падает, хотя продолжает оставаться выше, чем openvpn-tcp и openvpn-udp.
Сравнение производительности Wireguard и OpenVPN в зависимости от числа открытых сокетов. TestID 0-600 соответствует openvpn-udp, 700-1200 — openvpn-tcp и 1300-1800 — Wireguard
Станет ли wireguard заменой моей [ipsec] vpn-связи между сайтами?
Нет. Здесь просто нет шансов, что крупные вендоры, такие как Cisco, Juniper и другие приобретут для своих продуктов WireGuard. Они не «запрыгивают в мимо проходящие поезда» на ходу, если на это нет какой-то большой необходимости. Позже я расскажу о некоторых причинах, по которым они, вероятно, не смогут установить на борт своих продуктов WireGuard, даже если бы захотели.
Техническая документация wireguard
Эта статья основана на , которую написал Джейсон Доненфельд. Там он объясняет концепцию, цель и техническую реализацию [WireGuard] в ядре Linux.
Первое предложение гласит:
WireGuard […] стремится заменить как IPsec в большинстве кейсов его использования, так другие популярные решения на основе пользовательского пространства и/или TLS, такие как OpenVPN, при этом являясь более безопасным, производительным и простым в использовании [инструментом].
Конечно, главное достоинство всех новых технологий — это их простота [в сравнении с предшественниками]. Но VPN также должен быть эффективным и безопасным.
И что дальше?
Если вы скажете, что вам [от VPN] нужно не это, то на этом чтение можно заканчивать. Однако я замечу, что такие задачи ставятся перед любой другой технологией туннелирования.
Самое интересное из приведенной выше цитаты кроется в словах «в большинстве случаев», которые, само собой, прессой были проигнорированы. И вот, мы там, где оказались из-за созданного этой небрежностью хаоса — в этой статье.
Устанавливаем wireguard на ubuntu 18.04.5 lts
Установка ПО для различных ОС есть на официальном сайте.
Ubuntu ≥ 18.04
sudo apt install wireguard
Настройка сервера.
Генерируем публичный и приватный ключи.
Запускаем
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
Все ключи лежат /etc/wireguard/
Создаем файл wg0.conf
sudo nano /etc/wireguard/wg0.conf
Собираем конфигурационный файл
[Interface]
Address = 192.168.30.1/24 <- выбираем любой диапазон
SaveConfig = true
ListenPort = 5505 <- выбираем любой порт
PrivateKey = SERVER_PRIVATE_KEY
Во многих мануалах еще добавляют 2 строчки:
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
Последние строчки PostUp и PostDown верны если вы хотите клиента спрятать за NAT. В таком случае все клиенты при подключении будут иметь ip адрес внутреннего сетевого интерфейса сервера, но нам это не нужно, поэтому мы их не добавляем.
Перед включением интерфейса wg0, разрешим серверу пересылать пакеты вперед.
Добавим ip_forward
Устанавливаем и настраиваем shorewall
Установка shorewall
apt update
apt install -y shorewall
После установки нужно добавить параметры в файл shorewall.conf и создать несколько файлов с переменными и дополнительными параметрами. Большой мануал есть на официальном сайте.
Начнем по порядку, изменим некоторые параметры shorewall.conf
nano /etc/shorewall/shorewall.conf
STARTUP_ENABLED=Yes
LOG_LEVEL="info(tcp_options,tcp_sequence,macdecode,ip_options)"
BLACKLIST_LOG_LEVEL="$LOG_LEVEL"
INVALID_LOG_LEVEL="$LOG_LEVEL"
LOG_MARTIANS=Yes
LOG_VERBOSITY=2
LOGALLNEW="$LOG_LEVEL"
LOGFILE=/opt/logs/shorewall/firewall.log
LOGFORMAT="ip-tables %s %s "
LOGTAGONLY=No
Создадим несколько папок в /opt и перенесем логирование. В LOGFORMAT добавляем префикс по которому будем фильтровать системные сообщения от iptables и складировать в /opt/logs/shorewall/firewall.log.
mkdir /opt/logs
mkdir /opt/logs/shorewall
touch /opt/logs/shorewall/firewall.log
Сделаем сразу фильтр системных сообщений от iptables. Создаем правило и добавим фильтр по нашему префиксу ip-tables
nano /etc/rsyslog.d/10-my_iptables.conf
# Log kernel generated iptables log messages to file
:msg,contains,"ip-tables" /opt/logs/shorewall/firewall.log
& ~
Если в файл логи не будут записываться, добавьте прав на файл/папку. Не забудьте настроить ротацию лога.
Перезапустим службу
service rsyslog restart
Продолжаем настройку shorewall и создадим несколько файлов.
Создаем файл interfaces, в нем запишем переменные для наших интерфейсов и опции
nano /etc/shorewall/interfaces
?FORMAT 2
###############################################################################
#ZONE INTERFACE OPTIONS
lan eth0 tcpflags,nosmurfs,routefilter,logmartians
wg wg0 tcpflags,nosmurfs,routefilter,logmartians
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
Создадим файл с переменными подсетей и хостов и запишем все наши подсети и важные сервера в сети
nano /etc/shorewall/params.mgmt
# protocols
ALL_T_U=tcp,udp
# all services, networks and subnets
AD_DS=10.15.1.10,10.17.2.2
IPA=10.16.1.252
DNS_INT=10.15.1.10,10.16.1.252,192.168.0.253
KASPER=10.15.1.55
####
NET_OFFICE=10.15.1.0/24
NET_OFFICE_PRINTERS=10.15.14.0/24
##
NET_CLOUD_PROD=172.16.0.0/20,172.16.16.0/20,172.16.32.0/20
NET_CLOUD_DEV=192.168.128.0/24,192.168.1.0/24
####
VPN_01=192.168.30.0/24
VPN_02=192.168.40.0/24
####
ADM_IP=10.17.1.9
ADM_IP_VPN=192.168.30.3,192.168.40.3
VNC_SERVERS=10.15.1.10
###END###
Здесь нет ограничений на переменные, мы расписали все внутренние подсети, добавили контроллер домена, free ipa, внутренние DNS, подсети VPN, и административные ip адреса, добавили группу протоколов.
Добавим этот файл в общие настройки
nano /etc/shorewall/params
INCLUDE params.mgmt
Напишем политику и правила которые будут работать по умолчанию.
nano /etc/shorewall/policy
##
#SOURCE DEST POLICY LOGLEVEL LIMIT
$FW lan ACCEPT $LOG_LEVEL
$FW wg DROP $LOG_LEVEL
wg $FW DROP $LOG_LEVEL
# THE FOLOWING POLICY MUST BE LAST
all all REJECT $LOG_LEVEL
##
В данном примере логируются все соединения. Переменная $FW обозначает сам фаервол, т.е. любое соединение от любого интерфейса направленного на wg будет сброшено. Эти правила применяются последними.
Создадим файл и сделаем описания типа переменных
nano /etc/shorewall/zones
###############################################################################
#ZONE TYPE OPTIONS IN OUT
# OPTIONS OPTIONS
FW firewall
lan ipv4
wg ipv4
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE
Самый большой файл получается с сервисами, создадим его и заполним
Шифрование: отличия wireguard от openvpn
Wireguard исповедует минималистский и безапелляционный подход к шифрованию, преднамеренно исключив гибкость и альтернативу выбора протоколов, так как это слишком затратно. Если нет выбора протоколов, нет и процесса согласования, в котором традиционно находят дыры безопасности. Кроме того SSL/TLS уязвимости, идущие ровным потоком, также не в пользу богатства выбора.
Итоги: какой же vpn выбрать?
Есть огромное количество пользовательских сценариев использования VPN, и вряд ли одна и та же рекомендация будет хороша для всех. Соответственно, для разных сценариев можно выделить две группы с наиболее подходящим решением для VPN.
Используйте Wireguard.
То лучше используйте OpenVPN.
Ну а какой VPS брать под VPN вы и так знаете.
1.3.1. Set connection endpoint (IP:port)
Enter the external IP address (see 2.2.3) and the open port (see 2.1.5) of the Wireguard server. Use the following format IP:port, for example, 4.3.2.1:54321. Press Enter key to confirm.
Enter the endpoint (external ip and port) in format[ipv4:port] (e.g. 4.3.2.1:54321): 4.3.2.1:54321
Выводы по стандартам шифрования и безопасности
Архитектурно
Wireguard более безопасен за счет того, что поверхность атаки значительно меньше по сравнению с OpenVPN. Тем не менее, OpenVPN считается очень безопасным и надежным, многократно пройдя независимый аудит кода. За счет этого OpenVPN
выигрывает
при консервативном подходе к выбору VPN-решения.
Вместе с тем отсутствие гибкости, возможности выбора способа шифрования создает значительные препятствия для использования Wireguard в корпоративном сегменте пользователей VPN. Представьте стандартную для наших ситуацию, в которой сотрудники подключаются к рабочей сети по VPN с различных устройств. В такой ситуации отсутствие гибкости и выбора создаст гораздо больше проблем, чем сможет их устранить.
Вывод
Мне несложно сделать вывод о том, что WireGuard пока не готов.
Он задумывался как облегченное и быстрое решение ряда проблем у уже существующих решений. К сожалению, ради этих решений он пожертвовал многими функциями, которые будут актуальны для большинства пользователей. Именно поэтому он не может заменить IPsec или OpenVPN.
Для того, чтобы WireGuard стал конкурентным, ему нужно добавить хотя бы настройку IP-адреса и конфигурацию маршрутизации и DNS. Очевидно, что именно для этого нужны зашифрованные каналы.
Безопасность — мой главный приоритет, и сейчас у меня нет оснований полагать, что IKE или TLS как-то скомпрометированы или поломаны. Современное шифрование поддерживается в них обоих, и они были проверены десятилетиями эксплуатации. Если что-то новее не значит, что это что-то — лучше.
Функциональная совместимость крайне важна, когда вы связываетесь с третьими лицами, станции которых вы не контролируете. IPsec де-факто является стандартом и поддерживается практически повсеместно. И он работает. И как бы это не выглядело, в теории, WireGuard в будущем может быть несовместим даже с разными версиями самого себя.
Любая криптографическая защита рано или поздно взламывается и, соответственно, должна быть заменена или обновлена.
Отрицание всех этих фактов и слепое желание использовать WireGuard для подключения вашего iPhone к домашней рабочей станции — это просто мастер-класс по засовыванию головы в песок.
Выводы по конфиденциальности данных
В этой номинации OpenVPN имеет определенное преимущество ввиду того, что лишь Wireguard предполагает хранение IP-адреса пользователей на VPN-сервере в течение длительного времени.
Выводы по скорости vpn-соединения
Синтетические тесты скорости от разных авторов, с использованием пакета iperf3, позволяют предположить, что
Wireguard быстрее
, чем OpenVPN.