0
<< предыдущая заметка 
04 июля 2025
Туннели CloudFlare.com: делаем вебсервер дома без публичного IP

Жизнь постоянно меняется. Вот я, например, остался без работы. А еще переехал на другую квартиру. Нет уже того милого домика у провинциального озера с комнаткой под лестницей, грущу. Зато теперь мне 7 минут до метро. Но рассказ не об этом. Заодно сменился интернет-провайдер, и нынешний наотрез отказывается давать публичный IP, даже за деньги. Это для меня неожиданность, я привык жить с внешним IP. Но, оказалось, сегодня и это настраиваемо. И сейчас расскажу, как я настраивал. Кому техническая тема не интересна, может дальше не читать.

Когда вы открываете мой домашний сайт в поддомене https://qs.lleo.me (там ничего интересного для посетителей нет), вы попадаете на вот эту фитюльку, которая висит на домашнем WiFi и не имеет публичного IP — ни сама, ни WiFi-роутер. Так же самая фигня, когда вы слушаете «Радио Рыбий Жир» https://lleo.me/radio — аудиовещание тоже идёт именно оттуда, хотя и кэшируется на CloudFlare. И ещё много открытых и закрытых проектов, которые висят дома на домашнем wifi и теперь работают в условиях отсутствия публичного ip. Как это возможно?

Сервис cloudflare.com по праву имеет самый блатной IP-адрес: 1.1.1.1 Много лет он является центром здравомыслия, нестяжательства и главным хабом интернета. Все мои сайты проксируются через cloudflare.com Что это дает?
-- защиту от DDoS-атак
-- закрывает реальный IP сервера от неумных карих глаз
-- автоматом снимает вопросы https и головные боли с обновлением сертификата
-- кроме того, это неплохая защита от дурного глаза и порчи: блокировать сайт за cloudflare.com гораздо сложнее. Письма Роскомнадзора тоже идут на cloudflare — он просто не знает, куда их еще слать. Хотя cloudflare честно их переправляет владельцу сайта — так было у меня недавно, я выполнил требование Роскомнадзора, убрал статью о настройке VPN, и Роскомнадзор сообщил опять же cloudflare, что мой дневник выполнил требования и больше не в реестре. Итак, существует миллион причин использовать cloudflare, но речь сегодня не про них и не про VPN, а про настройку личного сервера дома.

Как работает cloudflare с сайтами? Вы прописываете для своего домена записи от cloudflare (там есть инструкция), и отныне браузеры посетителей идут туда. Дальше cloudflare разбирается, какой сайт вызвал, и сам бежит к вам на сайт с клиентским запросом (в простом случае — по порту 80), а ответ вашего сайта передает клиенту. То есть, работает шлюзом. Ходит он к вам со своих IP, но IP клиента приносит в специальном заголовке CF-Connecting-IP Хорошо даже, если ваш сайт не будет вообще отвечать никому, кроме cloudflare. Но, как минимум, если вас интересуют по какой-то причине реальные IP посетителей, вы можете настроить nginx возвращать реальный IP клиента из заголовка. В nginx в секции server это делается так:

[показать спрятанное]
# Говорим nginx, где искать настоящий IP
    set_real_ip_from 173.245.48.0/20;
    set_real_ip_from 103.21.244.0/22;
    set_real_ip_from 103.22.200.0/22;
    set_real_ip_from 103.31.4.0/22;
    set_real_ip_from 141.101.64.0/18;
    set_real_ip_from 108.162.192.0/18;
    set_real_ip_from 190.93.240.0/20;
    set_real_ip_from 188.114.96.0/20;
    set_real_ip_from 197.234.240.0/22;
    set_real_ip_from 198.41.128.0/17;
    set_real_ip_from 162.158.0.0/15;
    set_real_ip_from 104.16.0.0/13;
    set_real_ip_from 104.24.0.0/14;
    set_real_ip_from 172.64.0.0/13;
    set_real_ip_from 131.0.72.0/22;
    set_real_ip_from 2400:cb00::/32;
    set_real_ip_from 2606:4700::/32;
    set_real_ip_from 2803:f800::/32;
    set_real_ip_from 2405:b500::/32;
    set_real_ip_from 2405:8100::/32;
    set_real_ip_from 2a06:98c0::/29;
    set_real_ip_from 2c0f:f248::/32;
    real_ip_header CF-Connecting-IP;

Но дело-то не в этом. Со временем умным людям пришла в головы светлая мысль: тропинка между cloudflare и вашим сервером может быть не только по порту 80 или 433, а вообще любым способом! И cloudflare предложил свой тоннель. Который отличается от беганья по порту тем, что тоннелю не нужен публичный IP вашего сайта, достаточно, чтобы ваш сервер как-то поддерживал его, например, со своей стороны, а это можно делать даже с серым IP.

Итак, у вас есть Самый Обычный Домашний Интернет, без статического публичного IP, без динамического публичного IP, а просто с каким-то непубличным сереньким IP 192.168.xxx.xxx или 10.xxx.xxx.xxx, который вам присвоил провайдер. Но вы все равно хотите иметь сайт и прочие интернет-сервисы у себя в квартире. Я часто слышу хныканье, мол, у какого провайдера купить место и серверные мощности для нашей домашней странички... Чуваки, поверьте, ваша сраная домашняя страничка и даже ваш сраный корпоративный сайт, куда ходят в сутки полторы калеки, дают такой мизерный трафик, что любое домашнее соединение вполне обслужит ваших клиентов, даже Raspberry PI, брошенная под стол. Итак, настраиваем домашний вебсайт.

1. Для начала на домашнем компе или микрокомпе, который станет вебсервером, качаем свежий бинарник тоннеля cloudflare:

# Свежий arm64 (Raspberry 4) бинарник
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64

# Либо для amd64
# wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64

chmod +x cloudflared-linux-arm64
sudo mv cloudflared-linux-arm64 /usr/local/bin/cloudflared

2. Создаем папку в вашей домашней области /home/lleo/.cloudflared — отныне работаем в ней. Логинимся браузером на сайте cloudflare.com, чтоб заранее были залогинены. И регистрируем свой тоннель с этого компьютера, чтобы создался файл cert.pem Внимание, root не нужен, здесь и далее всё делаем от пользователя:

cloudflared tunnel login

Если на компе есть браузер, он запустится сам, если нет (например, Raspberry), просто скопируйте из консоли ссылку и откройте в браузере ан своем компе, где были залогинены на cloudflare. Сайт предложит зарегистрировать этот тоннель для одного из ваших сайтов, например для lleo.me Итого: в папке создался cert.pem

3. Создаем тоннель этого компьютера с неким именем (я выбрал qs):

cloudflared tunnel create qs

Смотрим, появился ли файл json:

ls /home/lleo/.cloudflared/*.json

Ура, появился, запоминаем его имя, оно сейчас пригодится: cdc47fa4-8097-b41a-2bba-56ecb2c9902a.json

Заодно можно посмотреть, какие вообще на вашем cloudflare зарегистрированы тоннели — может, у вас много компьютеров со своим тоннелем, и на каждом висят свои поддомены, как у меня.

cloudflared tunnel list

Кстати, если надо удалить тоннель:

[показать спрятанное]
# удалить — ну это потом если надо
cloudflared tunnel stop qs
cloudflared tunnel delete qs
rm /home/lleo/.cloudflared/*.json
cloudflared tunnel list

4. Создаем файл config-qs.yml (имя произвольное). В нем вы задаете имя тоннеля (qs), хэш (cdc47fa4-8097-b41a-2bba-56ecb2c9902a из имени json), а также прописываете в ingress пары hostname/service для всех сервисов, какие у вас на этом компе есть. В простом случае это должна быть одна пара с портом 80, а в конце "- service: http_status:404", но у меня много разных сервисов, и все их я вешаю на один тоннель:

tunnel: qs
credentials-file: /home/lleo/.cloudflared/cdc47fa4-8097-b41a-2bba-56ecb2c9902a.json

ingress:
  — hostname: homecomp.lleo.me
    service: http://localhost:80
  — hostname: qs.lleo.me
    service: http://localhost:80
  — hostname: nas.lleo.me
    service: http://localhost:8250
  — hostname: webcam1.lleo.me
    service: http://localhost:2025
  — hostname: webcam2.lleo.me
    service: http://localhost:2024
  — service: http_status:404

5. Теперь создадим в cloudflare dns записи для этих доменов. Сейчас подумал: если вам нужно не для поддомена, а для корневого сайта, наверно и ее надо как-то создать, но я делал только поддомены. Учтите, что если поддомены с этим именем уже были, их надо руками удалить из админки cloudflare через сайт! Иначе из консоли оно не умеет. Создаем поддомены:

cloudflared tunnel route dns qs homecomp.lleo.me
cloudflared tunnel route dns qs qs.lleo.me
cloudflared tunnel route dns qs nas.lleo.me
cloudflared tunnel route dns qs webcam1.lleo.me
cloudflared tunnel route dns qs webcam2.lleo.me

6. Всё готово. Запускаем систему для проверки:

cloudflared tunnel --config /home/lleo/.cloudflared/config-qs.yml run qs

Если всё сделано правильно, ваш сайт уже откроется как https — то есть, заведомо из любой точки мира.

7. Если все работает, создаем демона. Делаем файлик cloudflared-qs.service

[Unit]
Description=Cloudflare Tunnel qs
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/cloudflared tunnel --config /home/lleo/.cloudflared/config-qs.yml run qs
Restart=always
RestartSec=5

[Install]
WantedBy=default.target

Проводим манипуляции по инсталляции сервиса:

sudo loginctl enable-linger lleo # так надо чтобы работало само от вашего юзера
mkdir -p ~/.config/systemd/user
rm -f ~/.config/systemd/user/cloudflared-qs.service # на всякий случай
sudo ln -s /home/lleo/.cloudflared/cloudflared-qs.service ~/.config/systemd/user/cloudflared-qs.service
systemctl --user daemon-reload
systemctl --user enable cloudflared-qs
systemctl --user restart cloudflared-qs

8. Поздравляю, теперь ваш домашний комп доступен как важный сайт из большого интернета, несмотря на отсутствие публичного IP. Скорость будет приемлемая, ваши посетители или клиенты никогда не догадаются, в какую коробочку под столом они на самом деле попадают. Заодно можно поднять VPN VLESS (он же через web), чтобы иметь доступ к своей внутренней сети через VPN, не забудьте только в клиенте Андроида v2rayNG убрать вот такую оцпию, запрещающую бегать через VPN в вашу внутреннюю сеть: Профиль → ⚙️ → «Routing» → «Bypass LAN» или «绕过局域网». А в настройках VLESS надо добавить routing для вашей внутренней сетки (у меня она 10.1.1.*):

[показать спрятанное]
"outbounds":[...],
 "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "ip": ["10.1.1.0/24"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["0.0.0.0/0"],
        "outboundTag": "direct"
      }
    ]
  }

На всякий случай напоминаю, что все вышеописанное не имеет вообще никакого отношения к инструкциям по настройке VPN и обходу блокировок. Как мы помним из недавнего письма, тема настройки VPN у нас в стране запрещена. Здесь же речь о том, как настроить свой вебсайт на домашнем компьютере через тоннель. Инструкций по настройке VPN VLESS здесь тоже нет и не будет, я лишь упомянул, какие доплнительные опции нужны чтобы через тоннель открыть себе доступ внутрь собственной домашней сети, не имея публичного IP — например, я не дома, а мне надо срочно посмотреть свои файлы на домашнем накопителе.

UPD: Мне вот пишут, что CloudFlare иногда не открывается из России. Это история про TLS 1.3, подробнее об этом я писал год назад. Вкратце: пока достаточно в настройках CloudFlare отключить опцию TLS 1.3, и проблем не будет. У меня на lleo.me отключено, как видите, и проблем нет.

<< предыдущая заметка  
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок

Комментарии к этой заметке скрываются - они будут видны только вам и мне.

Оставить комментарий