Как реших проблема с достъпа до локалните си услуги чрез Cloudflare Tunnel и NGINX Proxy Manager

Как реших проблема с достъпа до локалните си услуги чрез Cloudflare Tunnel и NGINX Proxy Manager

Поради липса на статично IP от доставчика ми, а и с цел по-добра сигурност и гъвкавост, трябваше да намеря надеждно решение за достъп до локалните си услуги (като WordPress сайтове, панели за управление, и т.н.), хостнати зад MikroTik рутер и NAT.

След редица експерименти, най-доброто и стабилно решение, което реализирах, беше чрез Cloudflare Tunnel в комбинация с NGINX Proxy Manager (NPM).

В тази статия ще ви покажа как стъпка по стъпка изградих работеща конфигурация с wildcard под-домейни, сигурност и централизирано управление.

Какво използвам:

  • Cloudflare акаунт и домейн (пример: fedya.com)
  • Docker + docker-compose
  • Cloudflared Tunnel
  • NGINX Proxy Manager (NPM)
  • Локална мрежа с MikroTik (но важи и за други рутери)

1. Настройване на Cloudflare

1.1. Създайте акаунт в Cloudflare и добавете домейна си (пример: fedya.com).

1.2. Настройте DNS сървърите според инструкциите на Cloudflare.

1.3. Влезте в секцията DNS и добавете следния запис:

  • Тип: CNAME
  • Име: *.fedya.com
  • Стойност: your-tunnel-id.cfargotunnel.com (ще го получите по-късно)
  • Proxy status: Proxied (оранжево облаче)

💡 Важно: Записът *.fedya.com трябва да сочи към тунела, за да функционират всички под-домейни през Cloudflare Tunnel. Ако използвате само A запис, няма да работи с тунел.


2. Инсталиране на cloudflared и създаване на Tunnel

docker run -v ~/.cloudflared:/etc/cloudflared cloudflare/cloudflared:latest tunnel login

Това ще отвори браузър и ще свърже акаунта ви с Cloudflare.

След това създайте тунел:

docker run -v ~/.cloudflared:/etc/cloudflared cloudflare/cloudflared:latest tunnel create fedya-tunnel

Това ще създаде credentials-file и ще ви даде Tunnel ID.

Създайте конфигурационен файл config.yml в ~/.cloudflared/:

tunnel: fedya-tunnel-id
credentials-file: /etc/cloudflared/fedya-tunnel-id.json

ingress:
  - hostname: "*.fedya.com"
    service: http://127.0.0.1:80

  - service: http_status:404

originRequest:
  noTLSVerify: true

След това стартирайте тунела като Docker контейнер:

# docker-compose.yml за cloudflared
dversion: '3.8'
services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    restart: unless-stopped
    command: tunnel run
    volumes:
      - ~/.cloudflared:/etc/cloudflared

Стартирайте с:

docker-compose up -d

3. Инсталиране на NGINX Proxy Manager

Създайте docker-compose.yml:

version: '3.8'
services:
  npm:
    image: jc21/nginx-proxy-manager:latest
    restart: unless-stopped
    ports:
      - "80:80"
      - "81:81"  # UI на NPM
      - "443:443"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

Стартирайте:

docker-compose up -d

Първи вход: http://lp...:81 ([email protected] / changeme)


4. Конфигурация в NGINX Proxy Manager

Вече имаме публичен достъп чрез Cloudflare Tunnel до порт 80 на сървъра. Сега добавяме поддомейни:

Пример: WordPress сайт на site1.fedya.com

  1. В NPM → Add Proxy Host
  2. Domain: site1.fedya.com
  3. Scheme: http
  4. Forward Hostname / IP: 10.110.110.20
  5. Port: 80
  6. SSL tab → Request new SSL certificate
  7. Force SSL & HTTP/2 → ON

5. Ограничаване на административен достъп

Не е добра практика admin.fedya.com да е публичен. Ето три начина да го защитите:

A) Локален достъп само по IP (NPM Access List)

  1. NPM → Access Lists → Add new list (пример: LocalOnly)
  2. Rules:
    • Allow → 10.110.110.0/24
    • Deny → 0.0.0.0/0
  3. Приложете го към admin.fedya.com

B) Без публичен DNS (не го включвайте в ingress:)

C) Ползване на VPN (WireGuard / ZeroTier)


6. Допълнителни бележки

  • Cloudflare Tunnel не изисква отворени портове към рутера (дори MikroTik NAT не пречи).
  • С един wildcard *.fedya.com можете да проксирате безкрайно много услуги.
  • Можете да добавяте Basic Auth (в таб „Access“) към всеки поддомейн.

Заключение

С комбинация от Cloudflare Tunnel и NGINX Proxy Manager успях да изградя стабилна, сигурна и удобна система за достъп до всичките си локални услуги. Това решение е особено полезно, когато нямате публично IP, но искате публично достъпни услуги – с контрол и сигурност.

Ако и вие сте в подобна ситуация, силно препоръчвам този подход.


Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:

Подобни статии