January 25, 2024

Доступ извне к хостингу у себя дома через Wireguard + Traefik

В этой статье рассмотрим вариант хостинга у себя дома с доступом извне через Wireguard + Traefik.

Для этой схемы нам понадобится

  • локальный сервер, на котором находится контейнер Traefik'а
  • удаленный сервер с публичным IP, через который будет происходить доступ

Шаг 1. Установка клиента и сервера Wireguard

Устанавливаем клиент на локальный сервер, а сервер — на удаленный. Чаще всего это происходит через установку соответствующих пакетов. Для сервера также можно воспользоваться angristan/wireguard-install.

Далее необходимо узнать адреса сервера и клиента. Это можно сделать таким образом:

$ sudo cat /etc/wireguard/wg0.conf
[Interface]
Address = 10.66.66.1/24,fd42:42:42::1/64
ListenPort = 51820
PrivateKey = ...

### Client ...
[Peer]
PublicKey = ...
PresharedKey = ...
AllowedIPs = 10.66.66.2/32

10.66.66.1 — адрес сервера. 10.66.66.2 — клиента.

Шаг 2. Настройка Traefik

Шаг 2.1 Настройка сервера

Далее представлен конфигурационные файлы для сервера, который перенаправляет 80, 443 и 22 порты.

docker-compose.yml

version: '3.7'

networks:
  default:
    name: traefik_net
    external: true

services:
  traefik:
    image: traefik:v2.10.7
    container_name: traefik
    restart: unless-stopped
    environment:
      - TZ=Europe/Moscow
    ports:
      - "80:80"
      - "443:443"
      - "22:22"
    volumes:
      - "./traefik.yml:/etc/traefik/traefik.yml:ro"
      - "./acme:/etc/traefik/acme"
      - "./providers:/etc/traefik/providers"
      - "/var/run/docker.sock:/var/run/docker.sock"

traefik.yml

accesslog:
  fields:
    names:
      StartUTC: drop

entryPoints:
  ssh:
    address: ":22"
  web:
    address: ":80"
  websecure:
    address: ":443"
    
providers:
  docker:
    network: traefik_net
    exposedByDefault: false
  file:
    directory: /etc/traefik/providers

providers/config.yaml

tcp:
  {{ $ip := "10.66.66.2" }}
  {{ $entrypointsPorts := dict
        "web" 80
        "websecure" 443
        "ssh" 22
  }}
  {{ $entrypoints := list }}
  {{ range $key, $_ := $entrypointsPorts }}
    {{ $entrypoints = append $entrypoints $key }}
  {{ end }}
  routers:
    {{range $entrypoints }}
    local_traefik_{{ . }}:
      rule: "HostSNI(`*`)"
      entrypoints:
      - "{{ . }}"
      service: local_traefik_{{ . }}
    {{end}}
  services:
    {{range $entrypoints }}
    local_traefik_{{ . }}:
      loadBalancer:
        proxyProtocol:
          version: 2
        servers:
        - address: {{ $ip }}:{{ get $entrypointsPorts . }}
    {{end}}

Шаг 2. Настройка клиента

docker-compose.yml

version: '3.7'

networks:
  default:
    name: traefik_net
    external: true

services:
  traefik:
    image: traefik:v2.10.7
    container_name: traefik
    environment:
      - TZ=Europe/Moscow
    ports:
      - 80:80
      - 443:443
      - 22:22
    restart: unless-stopped
    volumes:
      - ./traefik.yml:/etc/traefik/traefik.yml:ro
      - ./acme:/etc/traefik/acme
      - ./providers:/etc/traefik/providers
      - /var/run/docker.sock:/var/run/docker.sock

providers/config.yaml

accesslog:
  fields:
    names:
      StartUTC: drop

...

entryPoints:
  ssh:
    address: :22
    proxyProtocol:
      trustedIPs:
      - 10.66.66.1
  web:
    address: :80
    http:
      redirections:
        entryPoint:
          permanent: true
          scheme: https
          to: websecure
    proxyProtocol:
      trustedIPs:
      - 10.66.66.1
  websecure:
    address: :443
    proxyProtocol:
      trustedIPs:
      - 10.66.66.1
providers:
  docker:
    exposedByDefault: false
    network: traefik_net
  file:
    directory: /etc/traefik/providers