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 порты.
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"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/providerstcp:
{{ $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. Настройка клиента
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.sockaccesslog:
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