infra_wireguard
Ansible Роль - WireGuard Site-to-Site VPN
Роль для развертывания VPN-сетей WireGuard Site-to-Site.
Логи 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