Установка и настройка VPN-сервера Wireguard в Debian 9.9

Введение

Wireguard - это быстрая и безопасная альтернатива другим программам VPN, таким как IPSec и OpenVPN. Преимущество Wireguard заключается в том, что он многопоточный и встроен в ядро, что означает, что вы можете достичь симметричной пропускной способности 1 Гбит / с даже на нижних конечных устройствах, что невозможно в OpenVPN. Сервер очень легкий и простой в настройке. Есть клиенты для большинства операционных систем, включая Windows.
Некоторые другие преимущества Wireguard включают возможность запуска внутренних служб, таких как SSH, FTP и удаленный рабочий стол, на IP-адресе VPN вместо основного IP-адреса сервера, что уменьшает возможные векторы атак на ваш сервер. Например, вы можете включить SSH-доступ для одного пользователя на вашем общедоступном IP-адресе, а для всех остальных пользователей - только для VPN-IP.
Вы также можете туннелировать часть или весь ваш интернет-трафик через проводную сеть как VPN и легко достигать скорости более 1 Гбит / с. Если вы находитесь за NAT и не можете перенаправить порт, простой сервер Wireguard на низком уровне VPS - это хороший способ обеспечить доступ серверов, работающих на вашем компьютере, из Интернета. Мы обычно используем впс провайдера Kamatera.
Этот учебник будет посвящен установке Wireguard на сервер Debian 9.9 (Stretch).


Шаг 1 - Установка

После входа на сервер через SSH, переключитесь на пользователя root, напечатав sudo su -.
Запустите следующие команды:
echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable-wireguard.list
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 150\n' > /etc/apt/preferences.d/limit-unstable
apt-get update
Установите заголовки для вашего ядра, если вы еще этого не сделали:
apt-get install linux-headers-$(uname -r|sed 's/[^-]*-[^-]*-//')
Затем установите Wireguard:
apt-get install wireguard
Вы должны увидеть вывод, похожий на:
Building for 4.9.0-8-amd64
Building initial module for 4.9.0-8-amd64
Done.
Если вы этого не видите и вместо этого видите ошибку, убедитесь, что установленные вами заголовочные файлы linux имеют ту же версию, что и ядро, которое вы используете (сравните с uname -aтем, что собирается). В противном случае вам может потребоваться перезагрузить сервер, например, если вы только что произвели dist-upgrade и не перезагружены.

Шаг 2 - Конфигурация сервера

В этом руководстве предполагается, что у вас есть сервер с одним клиентом. Wireguard поддерживает столько клиентов, сколько необходимо, просто добавьте еще одного партнера в файл конфигурации wg0.conf и снова выполните шаги установки клиента на клиенте.
Сначала создайте открытый и закрытый ключи на сервере:
wg genkey | tee /etc/wireguard/wg-private.key | wg pubkey > /etc/wireguard/wg-public.key
Убедитесь, что они могут быть прочитаны только пользователем root, установив соответствующие разрешения для вашей системы. Получить их на потом с помощью cat /etc/wireguard/wg-private.keyи cat /etc/wireguard/wg-public.key.
Этот учебник будет использоваться wg-quickдля работы сервера. Существуют и другие методы, но с этого проще всего начать.
Создайте и отредактируйте файл /etc/wireguard/wg0.confв вашем любимом текстовом редакторе.
Здесь 1.2.3.4- публичный IPv4-адрес вашего сервера, 10.0.0.1частный IPv4-адрес, используемый для VPN-сервера и 10.0.0.2используемый для клиента. Если вам нужно больше клиентов, просто используйте другие IP-адреса ( 10.0.0.3и т. Д.) Внутри подсети 10.0.0.0/24.
  • Частный ( 10.0.0.1) IPv4 будет IP-адресом VPN сервера. Этот IP-адрес недоступен из общедоступного Интернета, и любые прослушивающие его службы будут доступны только для клиентов, подключенных к VPN.
  • Эту подсеть можно изменить на другие частные сети . Кроме того, вы можете использовать и пересылать общедоступные IP-адреса, если на вашем сервере есть хотя бы 3 общедоступных IPv4, но это выходит за рамки данного руководства и требует тщательного межсетевого экрана.
Добавьте конфигурацию, такую как:
[Interface]
Address = 10.0.0.1/24
SaveConfig = false
ListenPort = 56
PrivateKey = PRIVATE KEY YOU GENERATED GOES HERE

[Peer]
PublicKey = NOTHING GOES HERE YET
AllowedIPs = 10.0.0.0/24, 10.0.0.2/32
PersistentKeepalive = 25
Чтобы объяснить каждый параметр конфигурации:
  • Addressэто вышеупомянутый приватный IPv4. Подсеть / 24 указывает, что это будет обрабатывать IP-адреса 10.0.0.1 - 10.0.0.254.
  • SaveConfig не позволяет изменениям в командной строке влиять на файл конфигурации, что может вызвать проблемы в режиме wg-quick.
  • ListenPortэто порт прослушивания вашего сервера. Это нужно будет открыть в вашем брандмауэре.
  • PrivateKeyэто закрытый ключ, сгенерированный для сервера. Открытый ключ будет выдан каждому клиенту. Практическое правило: закрытый ключ не покидает устройство, на котором он был сгенерирован, а открытый ключ - нет.
Каждый узел (вы можете добавить несколько в одном файле) имеет открытый ключ, который будет сгенерирован на клиенте, а также:
  • AllowedIPsЗдесь мы размещаем подсеть для наших клиентов, а также разрешенный IP-адрес для клиента. Ограничьте это по мере необходимости (например, удалите, 10.0.0.0/24если вы не хотите, чтобы каждый клиент мог общаться с другими клиентами в этой подсети).
  • PersistentKeepalive: Поддерживает соединение, отправляя рукопожатие каждые 25 секунд.

Шаг 3 - Настройка клиента

Повторите шаги установки до «конфигурации», если вы используете Linux на клиенте, в противном случае загрузите https://tunsafe.com/ или другой клиент для других операционных систем, таких как Windows.
Создайте открытый и закрытый ключ на клиенте через тот же процесс, что и на сервере, или с помощью File -> Generate Key Pair в TunSafe. Стандартная конфигурация TunSafe поставляется с открытым / закрытым ключом, который необходимо изменить в целях безопасности, он одинаков для всех установок.
Добавьте открытый ключ, который вы только что сгенерировали, на сервер wg0.conf в разделе PublicKey партнера.
Далее вам нужно будет настроить клиент. Конфигурация очень похожа на сервер. Фактически, вы можете запустить клиент как сервер, добавив директиву ListenPort, и таким образом соединить несколько серверов.
Пример конфигурации Linux-клиента, который только туннелирует VPN-трафик 10.0.0.0/24, а не весь интернет клиентского компьютера:
[Interface]
Address = 10.0.0.2/32
SaveConfig = false
PrivateKey = PRIVATE KEY OF CLIENT GOES HERE

[Peer]
PublicKey = PUBLIC KEY OF SERVER GOES HERE
AllowedIPs = 10.0.0.0/24
Endpoint = 1.2.3.4:56
PersistentKeepalive = 25
Пример конфигурации клиента Windows (Windows не поддерживает /31или /32), которая туннелирует весь трафик через сервер с поддержкой IPv6:
[Interface]
PrivateKey = PRIVATE KEY OF CLIENT GOES HERE
# Switch DNS server while connected
DNS = 8.8.8.8 
Address = 10.0.0.2/30, 2a01:4f8:1234::2/128

[Peer]
PublicKey = PUBLIC KEY OF SERVER GOES HERE
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 1.2.3.4:56
PersistentKeepalive = 25
Где 1.2.3.4находится публичный IPv4-адрес вашего сервера. Удалите адреса IPv6, если вы не хотите поддерживать IPv6.
Если вам нужна поддержка IPv6, вам также необходимо добавить IPv6-адрес клиента в конфигурацию сервера в AllowedIPs однорангового узла. Каждый сервер получает, /64так что вы можете выделить отдельный IP-адрес для вашего клиента (или меньшую подсеть). Имейте в виду, что при пересылке общедоступного IPv6 вам нужно будет правильно настроить его брандмауэр, что выходит за рамки данного руководства (например, его можно использовать как для брандмауэра на клиенте с брандмауэром Windows, так и на сервере с iptables). Можно пересылать общедоступный IPv4 аналогичным образом. Преимущество этого состоит в том, что вам не нужен NAT на стороне сервера для переадресации портов.

Шаг 4 - Дальнейшая настройка сервера в особых случаях

Параметр AllowedIPs на клиенте будет указывать, какие диапазоны IP-адресов проходят через туннель, а какие - нет. Вам нужно будет настроить iptables на сервере, например, чтобы включить внешний доступ в Интернет при пересылке всего трафика (то есть 0.0.0.0/0конфигурации):
echo 1 > /proc/sys/net/ipv4/ip_forward

nano /etc/sysctl.conf
Найти и изменить net.ipv4.ip_forward = 0 на net.ipv4.ip_forward = 1
Установить пакет iptablesи iptables-persistentзатем iptables-save > /etc/iptables/rules.v4сохранить конфигурацию при перезагрузке:
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o enp1s0 -j SNAT --to-source 1.2.3.4
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
Замените enp1s0 на основной интерфейс (вы можете проверить это с помощью ifconfig).
Если вы хотите перенести порт вперед, подумайте:
iptables -t NAT -A PREROUTING -d 1.2.3.4/32 -i enp1s0 -p tcp -m tcp --dport 45000 -j DNAT --to-destination 10.0.0.2:48000
Это сделает службу TCP, работающую на клиенте, 10.0.0.2:48000доступной из Интернета по адресу 1.2.3.4:45000. Обратный прокси-сервер nginx также может использоваться в качестве альтернативы proxy_passдирективе.

Шаг 5 - Включить сервер

Чтобы запустить сервер,
  • systemctl enable wg-quick@wg0 (начать при загрузке)
  • systemctl status/stop/start/restart wg-quick@wg0 (по мере необходимости)
Вы также можете запустить это на любом клиенте Linux. Для клиентов Windows запустите клиент в клиенте TunSafe. Если он застревает при «Отправке рукопожатия», возникает проблема конфигурации или брандмауэра. Вы увидите «Соединение установлено», когда соединение установится успешно.
Чтобы проверить, все ли работает, введите wg. Это отобразит вывод, такой как:
interface: wg0
  public key: removed
  private key: (hidden)
  listening port: 56

peer: removed
  endpoint: 12.13.14.15:31844
  allowed ips: 10.0.0.2/32, 2a01:4f8:1234::1/128
  latest handshake: 11 seconds ago
  transfer: 2.16 TiB received, 1.67 TiB sent
  persistent keepalive: every 25 seconds
Если ваш клиент подключился правильно, вы увидите последнее рукопожатие и общий перевод.
Теперь вы можете пропинговать ваш сервер / клиент через туннель (ping 10.0.0.1). Любые услуги, связанные 0.0.0.0или 10.0.0.1также будут доступны от ваших клиентов через VPN. Наконец, при AllowedIPs = 0.0.0.0/0настройке весь интернет-трафик будет проходить через VPN-соединение.
Чтобы защитить сервисы для VPN, либо установите их адрес привязки на VPN IP (10.0.0.1), либо ограничьте доступ 10.0.0.0/24(например, директива AllowUsers в sshd_config: AllowUsers root@10.0.0.*). Избегайте полной блокировки себя на сервере, делая это, и всегда оставляйте службу открытой для всех IP-адресов при внесении изменений на случай, если что-то пойдет не так. Если вы заблокируете себя, вам потребуется запросить консоль KVM в роботе и исправить ошибки.

Шаг 6 - Перезагрузка конфигурационного файла (необязательно)

Чтобы полностью перезагрузить файл конфигурации, вам необходимо перезапустить сервер (это приведет к разрыву текущих подключений): systemctl restart wg-quick@wg0
Если вы просто хотите добавить клиента после обновления файла конфигурации, вы можете вместо этого выполнить: wg addconf wg0 <(wg-quick strip wg0) Это не нарушит существующие соединения.

Шаг 7 - Устранение неисправностей

  • Можно ли вообще подключиться к серверу? Тип sudo wg. Вы видите рукопожатие, имевшее место недавно? Если это так, вы связаны. Если нет, проверьте ваш открытый и закрытый ключи, а также правила брандмауэра.
  • Можно ли подключиться к серверу, но не получить доступ к Интернету в 0.0.0.0/0конфигурации? Если вы можете пропинговать сам сервер ( 10.0.0.1), это может быть проблемой iptables. Убедитесь, что вы правильно добавили правило и cat /proc/sys/net/ipv4/ip_forwardвозвращаете 1.
  • Можете ли вы не пинговать клиента Windows? Windows блокирует ICMP по умолчанию в 10.0.0.0/8диапазоне, поэтому вам нужно будет включить его в брандмауэре Windows. То же самое относится к любой службе, работающей на клиенте Windows.
  • Медленные скорости? Проверьте использование вашего процессора на клиенте и сервере. Если ваш процессор работает на максимуме, это проблема, но у вас не должно быть проблем с мульти-гигабитными скоростями на современном 4-ядерном процессоре. Попробуйте убить или арендовать другие приложения, которые могут использовать процессор. Вы не увидите Wireguard как процесс, так как он работает в ядре, но вы увидите, что его загрузка процессора отображается в виде красных полос htop.
  • Не можете получить доступ к сервису по адресу https://10.0.0.1:port? Наберите netstat -tulpnи проверьте, прослушивает 0.0.0.0или 10.0.0.1нет, 127.0.0.1или 1.2.3.4.
  • TunSafe может потребоваться перезагрузить компьютер.
  • Как клиент, не можете получить доступ к тому, что работает на другом клиенте? Убедитесь, что сервер разрешает FORWARDмежду двумя клиентами в iptables / ufw. Также убедитесь, что /proc/sys/net/ipv4/ip_forward= 1.

Заключение и дальнейшее чтение

К настоящему времени у вас должен быть работающий VPN-сервер с WireGuard, поздравляю!
https://wiki.debian.org/Wireguard имеет альтернативы wg-quick и полезен для дальнейшего чтения, если вы хотите использовать systemd или / etc / network / interfaces для конфигурации.

Добавить комментарий

Автору будет очень приятно узнать обратную связь о своем руководстве.

Комментариев 0