diff --git a/docs/docker-compose/plextraktsync.md b/docs/docker-compose/plextraktsync.md old mode 100644 new mode 100755 diff --git a/docs/docker-compose/traefik.md b/docs/docker-compose/traefik.md new file mode 100755 index 0000000..b214039 --- /dev/null +++ b/docs/docker-compose/traefik.md @@ -0,0 +1,376 @@ +Traefik — это обратный прокси-сервер с открытым исходным кодом, обеспечивающий простую работу с микросервисами и/или просто контейнерами с вашими приложениями. + +Обратный прокси-сервер (reverse proxy, реверс-прокси) служит для ретрансляции запросов из внешней сети к каким-либо серверам/сервисам внутренней сети (например веб-сервера, БД или файловые хранилища) и позволяет: +- обеспечить сокрытие структуры внутренней сети и подробностей о находящейся в ней сервисах; +- осуществлять балансировку нагрузки (load balancing) между экземплярами одного и того же сервиса или серверами с одинаковыми задачами; +- обеспечить зашифрованное (HTTPS) соединение между клиентом и любым сервисом, в таком случае SSL сессия создается между клиентом и прокси, а между прокси и сервисом во внутренней сети устанавливается незашифрованное HTTP соединение, если сервис поддерживает HTTPS то можно организовать зашифрованное соединение и во внутренней сети; +- организовать контроль доступа к сервисам (аутентификацию клиента), а также установить файрвол (брандмауэр). + +В статье будет описываться использование Traefik в Docker в качестве реверс-прокси для других контейнеров Docker, а также не контейнеризированных сервисов. + +## Введение +Traefik позиционируется разработчиками как “Edge Router”, то есть можно направить его непосредственно в глобальную сеть одной стороной и во внутреннюю другой. Если у читателя создалось впечатление что таким образом создается единая точка отказа всей системы, то так и есть, но есть несколько моментов: +- во-первых, **Traefik** имеет развитый функционал для автоматического восстановления при сбоях; +- во-вторых, существует **Traefik EE** — платная версия, в которой помимо прочих преимуществ имеется HA (Hight Availability, Высокая доступность), что подразумевает распределение нагрузки между несколькими экземплярами сервиса (узлами), таким образом при отказе одного его задачи перераспределяются на другие узлы, а отказавший узел отключается и затем немедленно вводится обратно в эксплуатацию. + +> В качестве примечания отметим, что в статье будет рассматриваться бесплатная версия Traefik. + +Одним из основных достоинств Traefik является возможность изменения его конфигурации без приостановки работы (“на лету”) при применении любого из поддерживаемых бэкэндов, называемых провайдерами. + +Список основных провайдеров: +- Docker +- Kubernetes +- Consul Catalog +- Marathon +- Rancher +- File + +В рамках этой статьи будут рассмотрены первый и последний провайдеры из этого списка. + +Вероятно, не знакомому с темой читателю будет не понятно, чем является провайдер с именем — “File”, это некоторый файл (или папка с файлами), в котором описана конфигурация какого-либо сервиса, не связанного с другими провайдерами, но который должен быть скрыт за реверс-прокси. Остальные же провайдеры являются различными системами оркестрации контейнеров. + +Файл конфигурации Traefik, а также файлы для провайдера “File” могут быть написаны на TOML либо YAML, в статье будут приведены примеры на YAML так как этот синтаксис больше нравится автору, а какой-либо функциональной разницы между ними нет, а также не составляет трудности переписать файлы на другой формат конфигурации. Traefik будет развернут в Docker. Для развертывания будет использоваться docker-compose, для обеспечения простоты повторного развертывания. + +> В статье будут приведены команды для ОС Linux. + +## Деплой Traefik + +Предполагается что у читателя установлены и настроены `docker` и `docker-compose`, их установка выходит за рамки этой статьи. + +Создадим в домашней папке пользователя папку `traefik`, в которой будем хранить всю конфигурацию, и перейдем в эту папку + +```bash +mkdir ~/traefik +cd ~/traefik +``` + +Для развертывания (деплоя) Traefik создадим файл `docker-compose.yml` и отредактируем его в любом удобном вам редакторе. Для начала этот файл будет иметь следующий вид: +```yaml +version: '3.9' +services: + traefik: + image: traefik:v2.10 + container_name: traefik + restart: unless-stopped + security_opt: + - no-new-privileges:true + ports: + - 80:80 + - 443:443 + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./data/traefik.yml:/traefik.yml:ro +``` + +Во внешний мир будут смотреть порты 80 и 443 для HTTP и HTTPS соответственно. Также пробросим в контейнер сокет демона Docker для работы механизма автоматической конфигурации. Конфигурацию Traefik будем описывать в файле `traefik.yml` находящемся в папке `data` в текущей директории. + +> Если для разделения внешней и внутренней сетей используются networks Docker-а, то Traefik должен иметь доступ к внешней сети и ко всем внутренним в которых находятся целевые сервисы. + +Создадим и будем постепенно наполнять этот файл. + +Для начала опишем точки входа в наш прокси (те самые порты, которые смотрят во внешний мир): +```yaml +entryPoints: + http: + address: ":80" + https: + address: ":443" +``` + +Здесь `http` и `https` это просто названия (могут быть любыми, хоть `a` и `b`) и были выбраны так для удобства. + +Теперь добавим первого провайдера — Docker, это делается следующим образом: + +```yaml +providers: + docker: + endpoint: "unix:///var/run/docker.sock" + exposedByDefault: false +``` + +Параметром указываем что Traefik не должен брать все контейнеры подряд, далее будет объяснено каким образом мы будем сообщать какие контейнеры нас интересуют. Также здесь видно зачем мы пробрасывали сокет в контейнер — именно через него Traefik будет получать сведения о запускаемых контейнерах на этом хосте (можно подключиться и к демону на другом хосте). + +Следующим шагом развернем весь HTTP трафик в HTTPS (почему это было сделано именно таким образом будет описано дальше): + +```yaml +http: + routers: + http-catchall: + rule: HostRegexp(`{host:.+}`) + entrypoints: + - http + middlewares: + - redirect-to-https + middlewares: + redirect-to-https: + redirectScheme: + scheme: https + permanent: false +``` + +Traefik может проксировать не только HTTP трафик, но и просто TCP и UDP, поэтому указываем что этот блок конфигурации относится к `http`. + +Здесь мы встречаем два из трех основных элементов роутинга в Traefik 2 routers (роутеры) и middlewares(промежуточные обработчики), рассмотрим их подробнее. + +### Routers (роутеры) + +Рассмотрим на примере описанного выше роутера: + +- `http-catchall` — имя роутера, может быть любым, но обязано быть уникальным в рамках блока `http` всей конфигурации Traefik; +- `rule:` — правило, описывает какой трафик попадает в этот роутер, в данном случае описывается `HostRegexp`, то есть поле `Host` запроса должно попадать под регулярное выражение `.+` (то есть любое), здесь мы видим специфику регулярных выражений в Traefik — оно должно быть заключено в фигурные скобки и иметь наименование (`host` в данном случае), то есть синтаксис имеем вид `{name:reg_exp}`; +- `entrypoints` — массив описанных ранее точек входа, которые будут использоваться этим роутером, в нашем случае используем только `http`; +- `middlewares` — массив промежуточных обработчиков, куда попадает трафик перед передачей к сервису (сервисы будут рассмотрены позднее). + +Подробнее о различных видах правил можно прочитать в [документации](https://docs.traefik.io/routing/routers/#rule). + +### Middlewares(промежуточные обработчики) + +- `redirect-to-https` — имя обработчика, может быть любым, но обязано быть уникальным в рамках блока `http` всей конфигурации Traefik; +- `redirectScheme` — тип обработчика, в данном случае изменение схемы запроса; +- `scheme: https` — вынуждает клиента использовать схему HTTPS при запросе к прокси; +- `permanent: false` — говорит клиенту что это не навсегда и может измениться в будущем. + +Подробнее о различных обработчиках можно прочитать в [документации](https://docs.traefik.io/middlewares/overview/) (дальше в статье будет описан ещё один обработчик — BasicAuth). + +??? note "Полностью файл traefik.yml" + ```yaml + entryPoints: + http: + address: ":80" + https: + address: ":443" + providers: + docker: + endpoint: "unix:///var/run/docker.sock" + exposedByDefault: false + http: + routers: + http-catchall: + rule: HostRegexp(`{host:.+}`) + entrypoints: + - http + middlewares: + - redirect-to-https + middlewares: + redirect-to-https: + redirectScheme: + scheme: https + permanent: false + ``` + +Таким образом мы получим первую рабочую конфигурацию. Выполняем +```bash +sudo docker-compose up -d +``` +И прокси должен подняться, можно почитать логи (`sudo docker-compose logs -f`) и убедиться, что всё работает. + +## Let’s Encrypt + +Поскольку мы хотим использовать HTTPS нам нужно где-то взять SSL сертификаты для сервисов, есть возможность использовать свои сертификаты, но мы настроем автоматическое получение бесплатных сертификатов от Let’s Encrypt. + +Добавим в конфигурацию (`traefik.yml`) новый блок: + +```yaml +certificatesResolvers: + letsEncrypt: + acme: + email: postmaster@example.com + storage: acme.json + caServer: "https://acme-staging-v02.api.letsencrypt.org/directory" + httpChallenge: + entryPoint: http +``` + +Здесь: +- `letsEncrypt` — это просто имя резолвера; +- `acme` — тип резолвера (других типов в общем-то и нет); +- `storage` — файл, в котором хранятся сведения о полученных сертификатах; +- `httpChallenge` — тип acme-челенжа, дополнительно указываем параметр — точку входа; +- `caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"` — позволяет использовать не основной сервер Let’s Encrypt в тестовых целях, так как основной имеет строгие лимиты API (можно закомментировать, когда наладите получение сертификатов). + +Также дополним пункт `volumes` в файле `docker-compose.yml`, чтобы сохранять сертификаты при перезапуске контейнера (предварительно создав файл `data/acme.json`): + +```yaml + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./data/traefik.yml:/traefik.yml:ro + - ./data/acme.json:/acme.json +``` + +## Docker провайдер + +HTTPS настроен, пришло время поднять первый сервис, пусть это будет дашборд самого Traefik, так как Traefik у нас в Docker, воспользуемся этим провайдером. + +Для описания конфигурации в Docker Traefik использует метки (labels) контейнеров. Допишем в наш файл `docker-compose.yml`: +```yaml + labels: + - "traefik.enable=true" + - "traefik.http.routers.traefik.entrypoints=https" + - "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)" + - "traefik.http.routers.traefik.tls=true" + - "traefik.http.routers.traefik.tls.certresolver=letsEncrypt" + - "traefik.http.routers.traefik.service=api@internal" + - "traefik.http.services.traefik-traefik.loadbalancer.server.port=888" +``` +Разберем построчно: +- `traefik.enable=true` — указываем что Traefik должен обеспечить + доступ к этому контейнеру, необходимо для всего остального; +- `traefik.http.routers.traefik.entrypoints=https` — создаем новый + роутер с точной входа `https`; +- `traefik.http.routers.traefik.rule=Host(`traefik.example.com`)` — + роутер будет жить по адресу traefik.example.com; +- `traefik.http.routers.traefik.tls=true` — указываем что используется + TLS; +- `traefik.http.routers.traefik.tls.certresolver=letsEncrypt` — + указываем через какой резолвер получать сертификат; +- `traefik.http.routers.traefik.service=api@internal` — указываем, что + сервер за этим роутером — `api@internal`, это специальный сервис, + созданный по умолчанию, это как раз и есть дашбоард который мы хотели + увидеть; +- `traefik.http.services.traefik-traefik.loadbalancer.server.port=888` + — издержки интерфейса, без этого не заработает, но можно написать + абсолютно любую цифру. + +Дашбоард надо включить, для этого добавим в файл `traefik.yml`: + +```yaml +api: + dashboard: true +``` + +На данном этапе можно пересоздать контейнер (нужно так как мы меняли `docker-compose.yml`): + +```bash +sudo docker-compose down && sudo docker-compose up -d +``` + +Когда всё поднимется можно перейти на `traefik.example.com` (тут на самом деле должен быть ваш домен, который направлен на хост с Traefik) и увидеть дашборд. + +Дашбоард это хорошо, но мы не хотим, чтобы все пользователи интернета имели к нему доступ, закроем его от внешнего мира с помощью BasicAuth, для это в Traefik есть специальный middleware. + +Для начала сгенерируем для нас строку с логином и паролем (admin/password)^ + +```bash +$ htpasswd -nb admin password +admin:$apr1$vDSqkf.v$GTJOtsd9CBiAFFnHTI2Ds1 +``` + + +Теперь добавим в наш `docker-compose.yml` новые строчки: +```yaml +- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$vDSqkf.v$$GTJOtsd9CBiAFFnHTI2Ds1" +- "traefik.http.routers.traefik.middlewares=traefik-auth" +``` + +Заметим, что символы `$` из полученной строки мы должны заменить на `$$`. +- `traefik.http.middlewares.traefik-auth.basicauth.users=...` — создаем middleware типа `basicauth` с параметром `users`; +- `traefik.http.routers.traefik.middlewares=traefik-auth` — указываем что роутер `traefik` использует только что-то созданный middleware. + +??? note "Весь docker-compose.yml" + ```yaml + version: '3.9' + services: + traefik: + image: traefik:v2.10 + container_name: traefik + restart: unless-stopped + security_opt: + - no-new-privileges:true + ports: + - 80:80 + - 443:443 + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./data/traefik.yml:/traefik.yml:ro + - ./data/acme.json:/acme.json + labels: + - "traefik.enable=true" + - "traefik.http.routers.traefik.entrypoints=https" + - "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)" + - "traefik.http.routers.traefik.tls=true" + - "traefik.http.routers.traefik.tls.certresolver=letsEncrypt" + - "traefik.http.routers.traefik.service=api@internal" + - "traefik.http.services.traefik-traefik.loadbalancer.server.port=888" + ``` + +Теперь при попытке доступа к дашборду у нас спросят логин и пароль. + +Приведем также кофигурацию некого другого сервиса, развернутого через docker-compose (аналогично работает и для обычного docker): + +```yaml + labels: + - "traefik.enable=true" + - "traefik.http.routers.test.entrypoints=https" + - "traefik.http.routers.test.rule=Host(`test.example.com`)" + - "traefik.http.routers.test.tls=true" + - "traefik.http.routers.test.tls.certresolver=letsEncrypt" + - "traefik.http.services.test-service.loadbalancer.server.port=80" +``` + +Здесь одна новая метка `traefik.http.services.test-service.loadbalancer.server.port=80` — присваиваем этому контенеру имя сервиса `test-service` и порт 80, он автоматически присоединится к роутеру `test`, Traefik автоматически постороит маршрут до этого контенера, даже если он находится на другом хосте. + +## File провайдер + +С контейнерами работает, а как быть если есть какой-то сервис работающий на выделенном хосте (пускай IP 192.168.1.222 и порт 8080) и мы его хотим пропустить через этот же прокси, заодно закрыв его с помощью HTTPS. Для этого есть решение. + +Добавим в `docker-compose.yml` ещё один `volume`: + +```yaml + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./data/traefik.yml:/traefik.yml:ro + - ./data/custom/:/custom/:ro + - ./data/acme.json:/acme.json +``` + +Пускай описания таких хостов у нас будут лежать в `data/custom/` (а что, вдруг ещё появятся). + +Добавим в `traefik.yml` конфигурацию file провайдера для этих файлов: + +```yaml +providers: +... + file: + directory: /custom + watch: true +``` + +Директория следует из нашего `docker-compose.yml`, а `watch: true` значит что Traefik будет автоматически обновлять конфигурацию при обнаружении изменений в этих файлах (помните про обновление конфигурации “на лету”, вот работает даже для файлов, а не только для оркестраторов). + +Перезапускаем Traefik и теперь можно создать файл с описанием нашего отдельного хоста (`data/custom/host.yml`): + +```yaml +http: + routers: + host: + entryPoints: + - https + service: service-host + rule: Host(`host.example.com`) + tls: + certResolver: letsEncrypt + services: + service-host: + loadBalancer: + servers: + - url: http://192.168.1.222:8080/ + passHostHeader: true +``` + +Роутер описывался раньше, тут добавилось только `service: service-host` — связь с нашим сервисом, и конфигурация для TLS. + +Описание для сервиса имеет вид: + +```yaml +имя_сервиса: + loadBalancer: + servers: + - хосты для балансировки нагрузки + - ... +``` + +Дополнительно мы указываем параметр `passHostHeader: true` чтобы тот хост думал, что он на самом деле смотрит в сеть и прокси нет. \ No newline at end of file diff --git a/docs/docker-compose.md b/docs/docker.md similarity index 100% rename from docs/docker-compose.md rename to docs/docker.md diff --git a/docs/images/docker/traefik2.png b/docs/images/docker/traefik2.png new file mode 100644 index 0000000..19f77f4 Binary files /dev/null and b/docs/images/docker/traefik2.png differ diff --git a/docs/network/mikrotik/wireguard.md b/docs/network/mikrotik/wireguard.md new file mode 100644 index 0000000..8393fe1 --- /dev/null +++ b/docs/network/mikrotik/wireguard.md @@ -0,0 +1,210 @@ +# Настройка WireGuard на Mikrotik + +# Что такое WireGuard + +Если не касаться wiki и официального сайта, и объяснять как можно проще, то это VPN туннелирование через UDP. + +Это возможность быстро, максимально просто и надёжно, с хорошим уровнем безопасности соединить две точки между собой. + +Соединение одноранговое, открытый исходный код, и полу-автоматизированное создание маршрутов(для некоторых клиентов) – что еще нужно, для счастья 😉 + +Возможность использовать WireGuard появилась в mikrotik начиная с седьмой версии RouterOS. + +## Как работает подключение (простым языком) + +У нас есть две точки: +- Точка А с внешним адресом 111.111.111.111 +- Точка Б с внешним адресом 222.222.222.222 + +С точки зрения WireGuard эти адреса называются `Endpoint`. + +Также у точек есть внутренние сети или LAN: +- Точка А. 192.168.100.0/24 +- Точка Б. 192.168.200.0/24 + +Эти сети мы и хотим связать между собой. Для WireGuard это называется **AllowedAddress**, или разрешенные адреса для точки. Для Точки А нам нужно будет указать разрешенные адреса – `192.168.200.0/24`. Для Точки Б, соответственно – `192.168.100.0/24` + +Помимо этого мы должны определить для точек А и Б их адреса. Они используются для интерфейса, который создает WireGuard и передачи внутри протокола. В настройках большинства клиентов это будет называться `Address`. В mikrotik мы создадим отдельный адрес. + +- Точка А. 10.10.10.1 +- Точка Б. 10.10.11.1 + +Всё! Этого достаточно для создания подключения и его работы. + +В итоге всё это будет выглядеть так: + +![Краткая схема работы WireGuard](https://habrastorage.org/r/w1560/getpro/habr/upload_files/ba4/847/961/ba48479616baa45e5a2d49e35668e926.png) + +## Отличия WireGuard и OpenVPN + +Я не являются специалистом по сетевым протоколов и криптографических систем, поэтому не могу дать детальное сравнение этих решений. Но могу выделить несколько основных отличий для меня, как пользователя и администратора: + +- В WireGuard не нужно создавать сертификаты, в отличии от OpenVpn, и следить за ними. Это и плюс и минус в зависимости от цели использования. +- В WireGuard создаются одноранговые соединения, где каждая точка может быть как сервером так и клиентом. Это позволяет создавать, помимо классических “звёзд”, ещё и mesh сети. +- OpenVPN позволяет более тонко управлять клиентами и их подключениями. Например, можно индивидуально раздавать маршруты и DNS-серверы для клиентов. WireGuard так не умеет. +- Отдельно для mikrotik есть недостаток в том, что для каждой подсети нужно настраивать маршруты. Для win-клиентов они определяются и задаются исходя из `AllowedAddress`. + +В целом я для себя сделал вывод, что для внешних пользователей удобнее и, возможно, безопаснее использовать OpenVPN. А для железных(ака аппаратных) или программных роутеров и их связи между собой удобнее WireGuard. По принципу – настроил и забыл. + +## Подготовка к настройке + +Для начала нужно убедится в том, что наш роутер Mikrotik умеет работать с WireGuard. Далее я буду показывать на примере интерфейса winbox. Если Вы пользуете командную строку, то Вы, скорее всего, сами сможете определить наличие WireGuard. + +Проверить, это можно просто взглянув на пункты меню (актуально для версии 7.5): + +![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/a70/2fb/4ac/a702fb4ac21cbfc064c036eceae95c7c.png) + +Обновить можно попробовать так: + +![стандартный способ обновления](https://habrastorage.org/r/w1560/getpro/habr/upload_files/fb4/029/b5d/fb4029b5d003f6b1ed3a639b140f47fa.png "стандартный способ обновления") + +стандартный способ обновления + +Если так не получилось, то смотрите свою версию в заголовке winbox устройства + +![в данном случае это mipsbe](https://habrastorage.org/r/w1560/getpro/habr/upload_files/a59/8d9/653/a598d9653e2ad09ce2ff88de5bc85854.png "в данном случае это mipsbe") + +в данном случае это mipsbe + +и идите на [официальный сайт mikrotik](https://mikrotik.com/download) для скачивания последней версии ОС. + +Коротко, как обновить через загрузку файла на Mikrotik: + +![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/cde/592/687/cde592687e0b10fc7cb74d0255d31c3f.png) + +Если у Вас много точек и так же для удобства настройки и дальнейшего обслуживания я рекомендую создать Вам подобную таблицу: + +| Name | Address | Endpoint | EndpointIp | AllowedIPs | ListenPort | PrivateKey | PublicKey | | +|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--| +| PointA | 10.10.10.1 | www.pointA.com | 222.222.222.222 | 10.10.11.1/32,192.168.200.0/24 | 13231 | ucwL8IWLNYrPHOu9qk70ZOagPgjJXhzvvkg7ZLooaj4= | +| PointB| 10.10.11.1 | www.pointB.com | 111.111.111.111 | 10.10.10.1/32,192.168.100.0/24 | 13231 | FxNwKIFINspWh5pkoFpS5LzNKMDjkqcAV/Ypo2Ed8ys= | + +Вам так будет проще ориентироваться в дальнейшем + +## Настройка WireGuard на Mikrotik + +Итак, у Вас есть WireGuard на Mikrotik, и теперь мы можем начать настройку. + +Прежде всего нам нужно создать интерфейс, чтобы получить публичный ключ или `Public Key`. Я ранее про него не писал умышленно, чтобы было проще понять принцип работы WireGuard. + +Но без публичного ключа установить соединение не получится. Он служит ключом шифрования и, можно сказать, паролем точки и для каждой точки он должен быть уникальным. При создании интерфейса он генерируется автоматически, так что Вам не нужно об этом переживать: + +![Создаем интерфейсы и копируем публичные ключи](https://habrastorage.org/r/w1560/getpro/habr/upload_files/e22/93a/b58/e2293ab586ed08adc7734ded260ea949.png " + +## Скрипт для быстрой настройки + +Далее я дам два варианта настройки простой и быстрый, и немного подольше. Для начала простой, которым пользуюсь сам. Вот скрипт который, я сделал для Вашего удобства: +``` +# EXAMPLE start +# Peer A params +# Name peerAname "PointA" +# Interaface Address peerAifAddress "10.10.10.1/24" +# AllowedIPs peerAallowed 10.10.11.1/32,192.168.200.0/24 +# EndPoint peerAendAddress "111.111.111.111" +# EndPort peerAendPort 13231 +# PublicKey peerAkey "ucwL8IWLNYrPHOu9qk70ZOagPgjJXhzvvkg7ZLooaj4=" +# Peer B params +# Name peerBname "PointB" +# Interaface peerBif "PointB" +# AllowedIPs peerBallowed 10.10.10.1/32,192.168.100.0/24 +# EndPoint peerBendAddress "222.222.222.222" +# EndPort 13231 +# PublicKey "FxNwKIFINspWh5pkoFpS5LzNKMDjkqcAV/Ypo2Ed8ys=" +# EXAMPLE end + +{ +# Peer A params +# SET PARAMS HERE +:local peerAname "PointA" +:local peerAifAddress "10.10.10.1/24" +:local peerAallowed 10.10.11.1/32,192.168.200.0/24 +:local peerAendAddress "111.111.111.111" +:local peerAendPort 13231 +:local peerAkey "ucwL8IWLNYrPHOu9qk70ZOagPgjJXhzvvkg7ZLooaj4=" +# Peer B params +:local peerBname "PointB" +:local peerBifAddress "10.10.11.1/24" +:local peerBallowed 10.10.10.1/32,192.168.100.0/24 +:local peerBendAddress "222.222.222.222" +:local peerBendPort 13231 +:local peerBkey "FxNwKIFINspWh5pkoFpS5LzNKMDjkqcAV/Ypo2Ed8ys=" +# start select +:local input do={:put $input;:return} +:local selectedPeer [$input "Enter current Peer A or B"] +:put "You select is $selectedPeer. Finished!" +# end select +{ +# start for A +:if ($selectedPeer = "A") do={ +# add address +/ip address +add address=$peerAifAddress interface=$peerAname comment=$peerAname +# add firewall rule +/ip firewall filter +add action=accept chain=input dst-port=$peerAendPort in-interface-list=WAN protocol=udp comment="WireGuard $peerAname" +# add peer +/interface/wireguard/peers +add allowed-address=$peerBallowed endpoint-address=$peerBendAddress endpoint-port=$peerBendPort interface=$peerAname public-key=$peerBkey persistent-keepalive=10 comment=$peerBname +# add route +/ip/route +:foreach peer in=$peerBallowed do={ +add dst-address=$peer gateway=$peerAname comment=$peerBname +} +} +# end for A +# start for B +:if ($selectedPeer = "B") do={ +# add address +/ip address +add address=$peerBifAddress interface=$peerBname comment=$peerBname +# add firewall rule +/ip firewall filter +add action=accept chain=input dst-port=$peerBendPort in-interface-list=WAN protocol=udp comment="WireGuard $peerBname" +# add peer +/interface/wireguard/peers +add allowed-address=$peerAallowed endpoint-address=$peerAendAddress endpoint-port=$peerAendPort interface=$peerBname public-key=$peerAkey persistent-keepalive=10 comment=$peerAname +# add route +/ip/route +:foreach peer in=$peerAallowed do={ +add dst-address=$peer gateway=$peerBname comment=$peerAname +} +} +# end for B +} +} +``` + +Его можно запускать прямо из терминала, либо из winbox открыв терминал. Так же вы можете добавить его в `System -> Scripts` и запустить из терминала, но так как это разовая процедура, не вижу в этом особого смысла. + +> Для начала внесите все необходимые параметры в строки переменных +`:local`, затем скопируйте и вставьте скрипт в терминал. Вам нужно будет только выбрать точку в которой вы находитесь `А` или `B`. Введите её и нажмите `Enter`. + +Так нужно будет повторить в каждой точке! + +Скрипт создаёт `address`, правило firewall для доступа из вне по списку `interface list` `WAN`. Список интерфейсов `WAN` создаётся по умолчанию. Если его нет, то добавьте. + +Далее, скрипт создаёт настройки точки `Peers` для подключения и добавляет все необходимые маршруты `Routes`, которые берёт из `Allowed Address` + +Ну или вы можете прописать всё руками по следующим скриншотам: + +![Создаём адрес и подсеть для нашего интерфейса](https://habrastorage.org/r/w1560/getpro/habr/upload_files/b6a/79c/890/b6a79c8907d945705ade7dd112fc5816.png) + +Создаём адрес и подсеть для нашего интерфейса + +![Создаём правило Firewall](https://habrastorage.org/r/w1560/getpro/habr/upload_files/776/c16/094/776c16094a52aa01d1b20ee7568ef440.png) + +Создаём правило Firewall + +![Прописываем маршруты](https://habrastorage.org/r/w1560/getpro/habr/upload_files/cb2/9d0/b13/cb29d0b1306b94391612fc9118770cdb.png "Прописываем маршруты") + +Прописываем маршруты + +![Добавляем точку к которой хотим подключится](https://habrastorage.org/r/w1560/getpro/habr/upload_files/291/636/634/291636634012a197fd5f611b026e9829.png) + +Добавляем точку к которой хотим подключится + +Надеюсь эта статья помогла кому-то быстро всё понять и настроить. Так как я на понимание, тесты и настройку потратил минимум один день, а то и больше. + +И в конце добавлю общую схему со всеми параметрами: + +![Общая схема работы и настройки WireGuard](https://habrastorage.org/r/w1560/getpro/habr/upload_files/7c0/a5c/cb8/7c0a5ccb8f649e9b51533b0ef75b1a1e.png) \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index b5cf8ba..0f08c17 100755 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -6,8 +6,8 @@ edit_uri: edit/main/docs/ nav: - Привет!: index.md - - 🐳 Docker Compose: - - Install Docker Compose: docker-compose.md + - 🐳 Docker: + - Install: docker.md - Linx Server: docker-compose/linx-server.md - Samba: docker-compose/samba.md - Redis: docker-compose/redis.md @@ -17,6 +17,7 @@ nav: - Plex Meta Manager: docker-compose/plex-mm.md - Plex Trakt Sync: docker-compose/plextraktsync.md - Traefik: + - docker-compose/traefik.md - Traefik Forward Auth: docker-compose/traefik-forward-auth.md - Ubuntu 22: - HPE: @@ -30,6 +31,9 @@ nav: - Помойка: - SSL для сайта: other/ssl-for-site.md - Ubuntu bash aliases: other/ubuntu-bash-aliases.md + - Сеть: + - Mikrotik: + - Wireguard: network/mikrotik/wireguard.md - Блог: - Начальная: blog/index.md - Traefik FA: blog/posts/traefik-fa.md