infra_wireguard

WireGuard

Ansible Роль - WireGuard Site-to-Site VPN

Роль для развертывания VPN-сетей WireGuard Site-to-Site.

Купить мне кофе

Статус Molecule теста Статус YamlLint теста Статус PyLint теста Статус Ansible-Lint теста Ansible Galaxy

Логи Molecule: Короткие, Полные

Проверено на:

  • Debian 11
  • Raspbian 11
  • Debian 12

Установка

# последняя версия
ansible-galaxy role install git+https://github.com/ansibleguy/infra_wireguard

# из galaxy
ansible-galaxy install ansibleguy.infra_wireguard

# или для пользовательского пути ролей
ansible-galaxy install ansibleguy.infra_wireguard --roles-path ./roles

# установка зависимостей
ansible-galaxy install -r requirements.yml
python3 -m pip install -r requirements.txt

Участие

Не стесняйтесь:

  • Открывать PR

  • Начинать обсуждения

  • Открывать проблемы => после проверки руководства по устранению неполадок ниже!


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

Вам нужен простой графический интерфейс Ansible? Посмотрите на мой Ansible WebUI

Примеры

Вот несколько детальных примеров конфигурации и их результаты:

Конфигурация

Вы можете определить свои топологии WireGuard, охватывающие несколько хостов или групп хостов.

Роль отфильтрует топологии до тех, в которые входит текущий целевой хост, и настроит их.

Эти ключи пиров должны соответствовать вашим именам хостов в инвентаре Ansible!

wireguard:
  restart_on_change: true  # разрешить перезапуск wg-сервисов при изменениях

  topologies:
    dc_nl:
      type: 'single'
      peers:
        srv02:
          Endpoint: 'srv02.wg.template.ansibleguy.net'
          Address: '10.100.0.1/30'

        srv03:
          Endpoint: 'srv03.wg.template.ansibleguy.net'
          Address: '10.100.0.2/30'

Вы можете использовать 'ansible-vault' для шифрования файлов ключей хоста:

ansible-vault encrypt roles/ansibleguy.infra_wireguard/files/keys/some_file.key

Выполнение

Запустите плейбук:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml

Или если вы зашифровали свои ключи:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml --ask-vault-pass

Также доступны некоторые полезные теги:

  • base
  • config
  • tunnels
  • purge

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

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e only_topo=TOPOLOGY_KEY

Функциональность

  • Установка пакетов

    • WireGuard
    • Resolvconf (разрешение имен)
  • Конфигурация

    • Упрощенная конфигурация с помощью отображения топологий

    • Поддерживаемые топологии:

      • одинарная - просто соедините два узла
      • звезда - несколько краевых/ветвевых узлов соединяются с одним центральным хабом
      • сетка - каждый из пиров соединён с каждым другим
    • Ключи

      • Генерация пар открытых/закрытых ключей для каждого хоста в топологии (WG идентифицирует пир по открытом ключу)
      • Ключи записываются контроллеру для согласованности
    • Маршрутизация

      • За управление маршрутизацией отвечаете вы! Вы можете включить автоматически добавленные маршруты WG или добавить пользовательские скрипты включения/выключения.
    • Конфигурация по умолчанию:

      • Сохранение закрытого ключа в файл
      • Отключение автоматического добавления маршрутов (защита от блокировок и индивидуальная настройка)
      • Включение ведения журнала syslog с идентификаторами экземпляров
      • Перезапуск wg-сервиса при изменениях
    • Настройки по умолчанию:

      • Использование PSK для дополнительной безопасности
      • Удаление сиротских туннелей
    • Настройки по умолчанию, которые можно отключить:

      • Установка 'resolvconf' для переопределения разрешения имен
      • Перенаправление трафика (похоже на маршрутизатор)
    • Функции:

      • Показ последних логов, если перезапуск сервиса не удался
      • Авто-подключение динамического пира

Информация

  • Примечание: эта роль в настоящее время поддерживает только системы на основе debian

  • Примечание: Большинство функциональностей роли можно включить или отключить.

    Для всех доступных опций - см. конфигурацию по умолчанию в главном файле конфигурации!

  • Предупреждение: Не каждая настройка/переменная, которую вы предоставите, будет проверяться на допустимость. Неверная конфигурация может сломать роль!

  • Предупреждение: Учитывайте, что скрипты включения/выключения WireGuard выполняются при запуске СЕРВИСА ТУННЕЛЯ; НЕ САМОГО ТУННЕЛЯ.

    Вам нужно учитывать это при планировании/настройке ваших маршрутов и метрик!

  • Информация: Вы должны держать названия ваших топологий короткими. И стараться не использовать специальные символы => они будут автоматически удалены (кроме '_=+.-') так что ключ будет действительным именем интерфейса!

  • Информация: Интерфейсы получат префикс:

    • одинарная => wgs_
    • звезда => wgx_
    • сетка => wgm_
  • Информация: Как запускать тесты описано здесь

  • Информация: Ключи хоста будут по умолчанию сохранены в директории 'files' роли.

    Эта директория ключей может быть изменена с использованием переменной 'controller_key_store'!

  • Информация: Если вы используете межсетевые экраны OPNSense - вы можете использовать коллекцию Ansible ansibleguy.opnsense для управления этими туннелями WireGuard.


Устранение неполадок

Если вы столкнулись с проблемами подключения => пожалуйста, выполните следующие шаги, чтобы сократить их источник:

1. Активен ли vpn?

wg show all

Если нет:

  • Соединение не может быть установлено - возможно, произошла ошибка конфигурации или сетевой сбой (блокировка трафика межсетевым экраном)

  • Проверьте свои логи WireGuard:

    # 'wgs_ts2' - это интерфейс туннеля WireGuard в этом примере
    guy@srv:~# journalctl -u wg-quick@wgs_ts2
    > -- Журнал начинается с Вт 2022-02-08 15:46:07 UTC, заканчивается Вт 2022-02-08 17:01:27 UTC. --
    > Feb 08 16:12:31 test-ag-wg-s3 systemd[1]: Запуск WireGuard через wg-quick(8) для wgs_ts2...
    > Feb 08 16:12:31 test-ag-wg-s3 wireguard_wgs_ts2[10698]: [#] ip link add wgs_ts2 type wireguard
    > Feb 08 16:12:31 test-ag-wg-s3 wireguard_wgs_ts2[10698]: [#] wg setconf wgs_ts2 /dev/fd/63
    
    • Вот некоторые распространённые сообщения об ошибках, которые вы можете увидеть при неверной конфигурации туннелей:
      • Ошибка: RTNETLINK отвечает: Адрес уже используется
        • Проблема: каждый туннель должен использовать уникальный порт для прослушивания - возможно, вы назначили дублирующий порт (или забыли установить его на пользовательский)
      • Ошибка: ошибка в разрешении имени
        • Проблема: DNS-имя, к которому служба пытается подключиться, не установлено (правильно) или у вашего целевого хоста есть общие проблемы с разрешением DNS
      • Ошибка: Туннели сконфигурированы, службы работают, но соединение не установлено
        • Проблема: порт соединения может быть заблокирован межсетевым экраном

2. Проходит ли трафик через туннель?

Пропингуйте удалённый IP туннеля WireGuard - в конфигурации это 'Address'.

Важно: укажите источник для использования!

# .2 - удаленный WG-IP; .1 - локальный
ping 10.0.1.2 -I 10.0.1.1

Если нет:

  • Убедитесь, что туннель действительно работает!

  • Проверьте, совпадают ли ключи => wg show all должен показывать 'одинаковые' открытые ключи с обеих сторон:

    guy@srv1:~# wg show all
    > интерфейс: wgx_tx1
    > открытый ключ: FJgEWygMdiqRcTvij3PiXOtPJNtTENQkv301l2PGhwY=
    > ...
    
    guy@srv2:~# wg show all
    > ...
    > пир: FJgEWygMdiqRcTvij3PiXOtPJNtTENQkv301l2PGhwY=
    > ...
    

    Чтобы регенерировать несовпадающие ключи, просто удалите их из директории 'files' контроллера и перезапустите роль на серверах.

3. Проходит ли трафик по маршруту через туннель?

Это только применимо к туннелям, которые используются для соединения удалённых подсетей.

Мы протестируем это с помощью другого пинга - на этот раз используя локальную подсеть (не WG-IP).

# 172.30.1.1 - удалённая 'подсеть'; 172.20.0.1 - локальная
ping 172.30.1.1 -I 172.20.0.1
# вы также можете запустить traceroute, чтобы получить больше информации о пройденном маршруте:
traceroute 172.30.1.1

Если вы заинтересованы => вы можете запустить tcpdump на удалённом хосте, чтобы выяснить, проходит ли трафик 'через туннель'.

# 'wgs_ts2' - это интерфейс туннеля WireGuard в этом примере
guy@srv:~# tcpdump -i wgs_ts2
> tcpdump: подавление подробного вывода, используйте -v[v]... для полного декодирования протокола
> прослушивание wgs_ts2, тип связи RAW (Raw IP), длина снимка 262144 байта
> 17:00:07.336550 IP 10.0.1.2 > 10.0.1.1: ICMP echo request, id 38770, seq 1, length 64
> 17:00:07.336695 IP 10.0.1.1 > 10.0.1.2: ICMP echo reply, id 38770, seq 1, length 64

Если нет:

  • Проверьте, не блокирует ли межсетевой экран какой-либо трафик между хостами.

    IPTables/NFTables, например, должны разрешать входящий И БРОСАЙТ-ТРАФИК.

  • Проверьте вашу конфигурацию маршрутизации на наличие ошибок и сравните её с 'работающей конфигурацией':

    # показать 'простое' представление
    ip route show all
    # показать ВСЕ маршруты
    ip route show table all
    # чтобы удалить ненужные широковещательные/локальные маршруты
    ip route show table all | grep -vE '^(broadcast|local)\s'
    
  • Хосты должны поддерживать перенаправление трафика!

    Убедитесь, что параметр 'wireguard.support.traffic_forwarding' включен.

  • Вы могли забыть добавить целевую сеть в 'AllowedIPs'.

    Это необходимо для топологий звезды и сетки!

4. Все еще есть проблемы

Это может быть проблема с ролью или какой-то другой крайний случай => пожалуйста, не стесняйтесь открывать проблему на GitHub!

Пожалуйста, предоставьте результаты устранения неполадок в проблеме.

О проекте

Role to configure WireGuard Site-to-Site tunnels - topology-based

Установить
ansible-galaxy install ansibleguy/infra_wireguard
Лицензия
other
Загрузки
1645
Владелец
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg