До тексту
  1. Статті/

Cloudflare Tunnel - доступ до сервера без відкритих портів

·3 хвилини
cat /etc/passwd
Автор
cat /etc/passwd
Технічний блог про Linux, DevOps та Open Source технології.
Зміст

Що мені потрібно зробити?
#

Один з сервісів (додаток на python) який запущений в локальній мережі (без статичного IP), повинен бути доступний для клієнта ззовні.

На роутері всі порти заблоковані (firewall) і відкрити я їх не зможу. Але ми можемо ініціалізувати вихідні зєднання куди завгодно (якщо браузер працює , нам цього досить).

Для вхідних зєднань все заблоковано, вихідні дозволено.
Хочемо мати доступ через, наприклад, браузер до сервісу який крутиться на домашньому компі.

Вирішити це можна багатьма способами (наприклад VPS з nginx + wireguard).

Можна теж скористатися готовим рішенням від cloudflare під назвою cloudflare tunnel.

Демон cloudflared встановлює вихідний тунель з нашої мережі до cloudflare і постійно підтримує цей звязок.

Клієнт заходить на URL - Зєднання йде до cloudflare -> розшифровує - > повторно шифрує - > передає до агента (cloudflared).

Опис зображення

1
linux(з cloudflared) -> tunnel <> Cloudflare <- Інтернет

Що потрібно зробити перед цим?
#

  1. Зареєструватися в cloudflare.
  2. Додати свій домен (потрібно віддати NS домена до CF).
  3. Додати субдомен (не обов’язково) дл якого сконфігуруємо tunnel. Через цей домен ми будемо потрапляти в нашу локальну мережу.

Встановлення cloudflared
#

Використовую Debian 12.13, працюю під root (знаю, що це погано).
  1. Додаємо GPG-ключ:
1
2
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg \
  | tee /usr/share/keyrings/cloudflare-main.gpg > /dev/null
  1. Додаємо репозиторій:
1
2
3
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] \
  https://pkg.cloudflare.com/cloudflared bookworm main" \
  | tee /etc/apt/sources.list.d/cloudflared.list
  1. Встановлюємо:
1
apt update && apt install cloudflared -y

alt text

  1. Перевіряємо версію та логінимось:
1
2
cloudflared version
cloudflared tunnel login

alt text
Відкрийте URL з виводу команди у браузері та авторизуйтесь у Cloudflare-акаунті.

alt text

Сертифікат збережеться у /root/.cloudflared/cert.pem.

1
2
3
2026-03-28T12:39:22Z INF You have successfully logged in.
If you wish to copy your credentials to a server, they have been saved to:
/root/.cloudflared/cert.pem

Створення тунелю
#

Створюємо тунель:

1
cloudflared tunnel create назва_тунелю

Output:

1
2
3
4
root@cloudflare-teleport-debian12:~# cloudflared tunnel create cft-tun-deb12
Tunnel credentials written to /root/.cloudflared/oowax6RaoX-dds3-4667-ac08-kai6wai2Shahnie.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel.

Created tunnel cft-tun-deb12 with id oowax6RaoX-dds3-4667-ac08-kai6wai2Shahnie

Додаємо DNS-запис:

1
cloudflared tunnel route dns назва_тунелю app1.domain.com.ua

Output:

1
2
root@cloudflare-teleport-debian12:~# cloudflared tunnel route dns cft-tun-deb12 cft-tun.domain.com.ua
2026-03-28T12:43:36Z INF Added CNAME cft-tun.domain.com.ua which will route to this tunnel tunnelID=oowax6RaoX-dds3-4667-ac08-kai6wai2Shahnie

Конфігурація
#

Створюємо файл конфігурації:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
mkdir -p /etc/cloudflared

cat <<EOF | tee /etc/cloudflared/config.yml
tunnel: ВСТАВТЕ_TUNNEL_ID
credentials-file: /root/.cloudflared/ВСТАВТЕ_TUNNEL_ID.json

ingress:
  - hostname: app1.domain.com.ua
    service: https://127.0.0.1:443
    originRequest:
      noTLSVerify: true
  - service: http_status:404
EOF

якщо попередні команди виконували не під рутом - потрібно скопіювати credentials:

1
sudo cp ~/.cloudflared/*.json /root/.cloudflared/

Перевірка
#

1
2
3
4
5
6
7
8
# Запускаємо  веб-сервер на python3 для тесту
python3 -m http.server 8080
# Змінюємо в /etc/cloudflared/config.yml на http://127.0.0.1:8080

# Запускаємо tunnel
cloudflared tunnel run назва_тунелю

# Заходимо в браузер і перевіряємо

Конфігуруємо як системний сервіс sysetmd
#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Встановлює cloudflared як сервіс systemd

cloudflared service install
# Вмикаєм старт після reboot
systemctl enable cloudflared

systemctl start cloudflared

# Перевірка
sudo systemctl status cloudflared

Користні команди
#

1
2
3
4
5
# Список всіх тунелів
cloudflared tunnel list

# Інформацію про конкретний
cloudflared tunnel info назва_тунелю