Настройка WireGuard

WireGuard — это новый VPN, работающий внутри ядра Linux и использующий криптографию по последнему слову техники. Он стремится быть быстрее, проще, компактнее и полезнее, чем IPSec, избегая при этом огромной головной боли. Он намерен быть значительно производительнее, чем OpenVPN. WireGuard разработан как VPN общего назначения для работы как на встраиваемых интерфейсах, так и на суперкомпьютерах, подходящий для многих различных обстоятельств. Он работает поверх UDP.

Возможно, вам также стоит прочитать Концептуальный обзор, Быстрый старт и Белую книгу.

Fedora CoreOS имеет полную поддержку WireGuard из коробки. На этой странице показано, как настроить одно соединение между сервером Fedora CoreOS и другим компьютером. Здесь рассматривается базовая конфигурация клиента, но не рассматривается установка WireGuard на вашем клиенте.

Есть два варианта настройки WireGuard в Fedora CoreOS:

  • Импорт конфигурации WireGuard в NetworkManager

  • Использование wg-quick

Генерация ключей

Вам нужно будет сгенерировать ключи для настройки WireGuard. Вы можете сгенерировать ключи на своей рабочей станции или на работающей системе Fedora CoreOS.

Сначала создадим ключи WireGuard для системы Fedora CoreOS:

Генерация ключей WireGuard для системы Fedora CoreOS
umask 077
wg genkey | tee fcos_private_key | wg pubkey > fcos_public_key

Теперь сгенерируем ключи WireGuard для клиента:

Генерация ключей WireGuard для клиента
umask 077
wg genkey | tee client_private_key | wg pubkey > client_public_key

При желании вы можете сгенерировать общий ключ (pre-shared key) для повышения безопасности:

Генерация общего ключа для этой пары узлов
wg genpsk > fcos_client_psk

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

Настройка WireGuard в Fedora CoreOS

Теперь вы можете изменить свою конфигурацию Butane, чтобы создать конфигурационный файл wg0:

Пример конфигурации Butane с файлом конфигурации WireGuard
variant: fcos
version: 1.7.0
storage:
  files:
    - path: /etc/wireguard/wg0.conf
      mode: 0600
      contents:
        inline: |
          [Interface]
          Address = 192.168.71.1/24,fdc9:3c6b:21c7:e6bd::1/64
          PrivateKey = 
          ListenPort = 51820

          [Peer]
          PublicKey = 
          PresharedKey = 
          AllowedIPs = 192.168.71.2/32,fdc9:3c6b:21c7:e6bd::2/128

Использование NetworkManager

Если вы хотите использовать поддержку в NetworkManager, вы можете импортировать конфигурацию WireGuard с помощью юнита типа oneshot:

Пример юнита службы systemd для импорта конфигурации WireGuard
systemd:
  units:
    - name: import-wireguard-config.service
      enabled: true
      contents: |
        [Unit]
        ConditionPathExists=!/etc/NetworkManager/system-connections/wg0.nmconnection
        Description=Import wireguard configuration to NetworkManager
        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=nmcli connection import type wireguard file /etc/wireguard/wg0.conf
        [Install]
        WantedBy=multi-user.target

NetworkManager будет игнорировать директивы PostUp и PostDown в конфигурации WireGuard. Если у вас есть конфигурация брандмауэра, которую нужно применить, обязательно примените её отдельным юнитом или вручную.

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

Повторный импорт обновлённой конфигурации WireGuard
$ sudo nmcli con delete wg0 && sudo nmcli con import type wireguard file /etc/wireguard/wg0.conf
Connection 'wg0' (1e4f869e-f95c-4221-b2b9-99726ffde92b) successfully deleted.
Connection 'wg0' (18cd8e61-1cc2-43a2-9f2e-467b75cd99da) successfully added.

Использование wg-quick

Если вы хотите использовать wg-quick вместо поддержки в NetworkManager, вы можете добавить следующее в свою конфигурацию Butane:

systemd:
  units:
    - name: wg-quick@wg0.service
      enabled: true

Если вам нужно внести дальнейшие изменения в конфигурацию WireGuard, перезагрузите службу с помощью:

systemctl reload wg-quick@wg0.conf

Проверка конфигурации в системе Fedora CoreOS

Загрузите Fedora CoreOS и войдите в систему. Когда вы выполните sudo wg show, вы должны увидеть это:

Проверка конфигурации WireGuard
[core@server ~]$ sudo wg show
interface: wg0
  public key: <fcos_public_key>
  private key: (hidden)
  listening port: 51820

peer: <client_one_public_key>
  preshared key: (hidden)
  endpoint: <Client IP Address>:51821
  allowed ips: 192.168.71.0/24, fdc9:3c6b:21c7:e6bd::/64

[core@server ~]$ sudo ip addr show wg0
12: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 192.168.71.1/24 scope global wg0
       valid_lft forever preferred_lft forever
    inet6 fdc9:3c6b:21c7:e6bd::1/64 scope global
       valid_lft forever preferred_lft forever

<Client IP address> выше — это IP или FQDN клиентского компьютера.

Настройка WireGuard на клиенте

Теперь вам нужно будет настроить WireGuard на вашем клиентском компьютере со следующей конфигурацией:

Конфигурация WireGuard на клиенте
[Interface]
Address = 192.168.71.2/24,fdc9:3c6b:21c7:e6bd::2/64
PrivateKey = <client_private_key>
ListenPort = 51821

[Peer]
PublicKey = <fcos_public_key>
PresharedKey = <fcos_client_psk>
Endpoint = <FCOS IP address>:51820
AllowedIPs = 192.168.71.0/24,fdc9:3c6b:21c7:e6bd::/64

<FCOS IP address> — это IP или FQDN сервера FCOS.

Запишите приведённую выше конфигурацию в /etc/wireguard/wg0.conf, задайте режим доступа к конфигурационному файлу и затем импортируйте конфигурацию на вашем клиенте:

Импорт конфигурации WireGuard на клиенте
[core@client ~]$ sudo chmod 0600 /etc/wireguard/wg0.conf
[core@client ~]$ sudo nmcli con import type wireguard file /etc/wireguard/wg0.conf

Затем проверьте вашу конфигурацию:

Проверка конфигурации WireGuard на клиенте
[core@client ~]$ sudo wg show
interface: wg0
  public key: <client_one_public_key>
  private key: (hidden)
  listening port: 51821

peer: <fcos_public_key>
  preshared key: (hidden)
  endpoint: <FCOS IP address>:51820
  allowed ips: 192.168.71.0/24, fdc9:3c6b:21c7:e6bd::/64

[core@client ~]$ sudo ip addr show wg0
21: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 192.168.71.2/24 scope global wg0
       valid_lft forever preferred_lft forever
    inet6 fdc9:3c6b:21c7:e6bd::2/64 scope global
       valid_lft forever preferred_lft forever

Тестирование соединения WireGuard

Теперь вы можете пропинговать IP-адрес WireGuard сервера Fedora CoreOS:

Пинг сервера Fedora CoreOS через WireGuard с клиента
[core@client ~]$ ping 192.168.71.1
PING 192.168.71.1 (192.168.71.1) 56(84) bytes of data.
64 bytes from 192.168.71.1: icmp_seq=1 ttl=64 time=0.439 ms
64 bytes from 192.168.71.1: icmp_seq=2 ttl=64 time=0.422 ms
64 bytes from 192.168.71.1: icmp_seq=3 ttl=64 time=0.383 ms
^C
--- 192.168.71.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2027ms
rtt min/avg/max/mdev = 0.383/0.414/0.439/0.023 ms

[core@client ~]$ ping6 fdc9:3c6b:21c7:e6bd::1
PING fdc9:3c6b:21c7:e6bd::1(fdc9:3c6b:21c7:e6bd::1) 56 data bytes
64 bytes from fdc9:3c6b:21c7:e6bd::1: icmp_seq=1 ttl=64 time=1.55 ms
64 bytes from fdc9:3c6b:21c7:e6bd::1: icmp_seq=2 ttl=64 time=0.454 ms
64 bytes from fdc9:3c6b:21c7:e6bd::1: icmp_seq=3 ttl=64 time=0.424 ms
64 bytes from fdc9:3c6b:21c7:e6bd::1: icmp_seq=4 ttl=64 time=0.424 ms
^C
--- fdc9:3c6b:21c7:e6bd::1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3054ms
rtt min/avg/max/mdev = 0.424/0.712/1.546/0.481 ms

Когда вы выполните sudo wg show на вашем клиенте, вы должны увидеть недавнее рукопожатие и разделы передачи с отправленными и полученными данными:

Проверка рукопожатия и метрик передачи
[core@client ~]$ sudo wg show
interface: wg0
  public key: <client_one_public_key>
  private key: (hidden)
  listening port: 51821

peer: <fcos_public_key>
  preshared key: (hidden)
  endpoint: <Client IP address>:51820
  allowed ips: 192.168.71.0/24, fdc9:3c6b:21c7:e6bd::/64
  latest handshake: 9 seconds ago
  transfer: 22.02 KiB received, 22.28 KiB sent

Маршрутизация всего трафика через WireGuard

Если вы планируете перенаправлять весь трафик вашего клиента через экземпляр Fedora CoreOS, вам нужно будет включить IP-форвардинг и задать некоторые директивы PostUp и PostDown:

Пример конфигурации WireGuard для Fedora CoreOS с IP-форвардингом
variant: fcos
version: 1.7.0
storage:
  files:
    - path: /etc/sysctl.d/90-ipv4-ip-forward.conf
      mode: 0644
      contents:
        inline: |
          net.ipv4.ip_forward = 1

    - path: /etc/sysctl.d/90-ipv6-ip-forwarding.conf
      mode: 0644
      contents:
        inline: |
          net.ipv6.conf.all.forwarding = 1

    - path: /etc/wireguard/wg0.conf
      mode: 0600
      contents:
        inline: |
          [Interface]
          Address = 192.168.71.1/24,fdc9:3c6b:21c7:e6bd::1/64
          PrivateKey = 
          ListenPort = 51820

          PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE
          PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE

          [Peer]
          PublicKey = 
          PresharedKey = 
          AllowedIPs = 192.168.71.0/24,fdc9:3c6b:21c7:e6bd::/64

systemd:
  units:
    - name: wg-quick@wg0.service
      enabled: true

Fedora CoreOS по умолчанию использует предсказуемые имена интерфейсов (по умолчанию). Обязательно используйте правильное имя интерфейса для вашего оборудования в приведённых выше командах PostUp и PostDown.

Затем задайте AllowedIPs = 0.0.0.0/0,::/0 в /etc/wireguard/wg0.conf в конфигурации клиента, чтобы маршрутизировать весь трафик IPv4 и IPv6 на клиентском компьютере через интерфейс WireGuard:

Конфигурация для маршрутизации всего трафика на клиенте через WireGuard:
[Interface]
Address = 192.168.71.1/24,fdc9:3c6b:21c7:e6bd::2/64
PrivateKey = <client_private_key>
ListenPort = 51821

[Peer]
PublicKey = <fcos_public_key>
PresharedKey = <fcos_client_psk>
Endpoint = <FCOS IP Address>:51820
AllowedIPs = 0.0.0.0/0,::/0