Запустить туннель бесплатно
☰
Дом без белого IP

Как открыть порты, если открыть их нельзя: CGNAT и мобильный интернет

Как открыть порты на роутере, проверить, открыт ли порт, и что делать, если мешает CGNAT, мобильный интернет или нет доступа к роутеру.

Чтобы открыть порт, на роутере создают правило проброса: «всё, что пришло на внешний порт 25565, отдавай компьютеру 192.168.1.10». Работает это только при двух условиях: у роутера белый IP-адрес, и у вас есть доступ к его настройкам. Если провайдер держит абонентов за общим NAT (CGNAT), интернет мобильный или роутер принадлежит провайдеру или арендодателю, правило ничего не даст. Входящее подключение не доходит до вашего роутера. В таком случае порт не открывают вовсе, задачу решают иначе: клиент туннеля сам подключается к серверу в интернете, и сервер выдаёт вам публичный адрес вида fxtun.ru:15432.

Ниже разберём по порядку: как устроен проброс, почему он часто не срабатывает, как проверить порт снаружи и что делать, когда проброс невозможен.

Как работает проброс порта на роутере

Дома у всех устройств внутренние адреса вроде 192.168.1.10. В интернет квартира выходит под одним адресом роутера. Когда вы открываете сайт, роутер запоминает, кто спрашивал, и возвращает ответ нужному устройству. С исходящими соединениями проблем нет.

Входящие устроены иначе. Кто-то стучится на внешний адрес роутера, порт 25565, и роутер не знает, какому компьютеру это отдать. Правило проброса (оно же port forwarding, «виртуальный сервер», NAT-правило) отвечает на этот вопрос заранее:

  • внешний порт: какой порт открыть снаружи;
  • внутренний адрес: какой компьютер в сети получит подключение;
  • внутренний порт: на каком порту там слушает программа;
  • протокол: TCP, UDP или оба.

В Keenetic, TP-Link и MikroTik раздел называется по-разному, но поля в нём те же. Инструкции производителей молча предполагают две вещи: что вы можете войти в настройки роутера и что у него белый адрес. Коротко о том, что делать, если одного из двух нет, — на странице «Проброс портов». Если правило создано, программа запущена, а порт снаружи всё равно закрыт, читайте дальше.

Почему проброс не срабатывает

Серый адрес и CGNAT

Самая частая причина. Провайдер экономит адреса и сажает за один публичный IP сотни абонентов. Ваш роутер получает внутренний адрес провайдера, часто из диапазона 100.64.0.0/10, который RFC 6598 выделил специально под такой общий NAT.

Правило на вашем роутере в этой схеме бесполезно. Подключение из интернета приходит на общий адрес провайдера, и оборудование провайдера понятия не имеет, что его надо отдать именно вам. До вашего роутера пакет не доходит.

Как проверить за минуту: сравните WAN-адрес в настройках роутера с адресом, который показывает curl -4 ifconfig.me или любой сервис проверки IP. Не совпадают — адрес серый. Подробно, с таблицей диапазонов, это разобрано в статье «Серый IP: как узнать и что делать».

Мобильный интернет

4G-модем, раздача с телефона, роутер с SIM-картой. Мобильные операторы, как правило, выдают абонентам адреса за своим NAT, поэтому проброс на модеме упирается в ту же стену, что и CGNAT. Проверяется так же: WAN-адрес модема против адреса, который видят сайты. Можно ли получить у оператора публичный адрес и на каких условиях, узнавайте у него самого.

Нет доступа к роутеру

Роутер стоит у арендодателя, в общежитии, в офисе или его настроил провайдер и не дал пароль. Технически проброс возможен, но сделать его может только тот, у кого есть доступ. Иногда проще попросить, иногда нельзя вовсе, например если сеть общая на весь дом.

Два роутера подряд

Оптический терминал провайдера плюс ваш роутер. WAN-адрес вашего роутера тогда тоже вида 192.168.x.x, и порт нужно пробрасывать дважды: сначала на терминале, потом на своём роутере. Если к терминалу доступа нет, вы в ситуации из предыдущего пункта.

Программа не слушает порт

Бывает, что сеть ни при чём. Сервер игры упал при запуске, слушает другой порт или только 127.0.0.1. Проверить это можно прямо на компьютере, об этом ниже.

Как проверить, открыт ли порт

Главное правило: проверять надо снаружи. Проверка изнутри своей сети по внешнему адресу часто врёт: многие роутеры не умеют отправлять пакет «сами себе» через внешний адрес, и порт выглядит закрытым, хотя друзьям он доступен. Надёжнее всего проверять с телефона на мобильном интернете (Wi-Fi выключить) или попросить друга.

Шаг 1. Программа слушает порт

Сначала убедитесь, что на самом компьютере порт вообще кто-то слушает.

Linux:

BASH
ss -ltnp | grep 25565     # TCP
ss -lunp | grep 19132     # UDP

Windows, PowerShell:

POWERSHELL
Get-NetTCPConnection -LocalPort 25565 -State Listen

Пустой вывод значит, что программа не запущена или слушает другой порт. Дальше проверять бессмысленно, сначала разберитесь с ней.

Шаг 2. Порт виден из интернета

Онлайн-сервис. Сервисы проверки портов, например portchecker.co, пробуют подключиться к вашему внешнему адресу со своего сервера. Это как раз проверка снаружи. Учтите, что они проверяют TCP: для UDP ответ «закрыт» ничего не значит.

nc на Linux и macOS с другой машины за пределами вашей сети:

BASH
nc -vz 203.0.113.10 25565

Флаг -z только проверяет подключение, ничего не отправляя, -v печатает результат. Сообщение об успешном подключении (succeeded или Connected, зависит от версии nc) значит, что порт открыт. Connection refused — до компьютера дошли, но там никто не слушает. Долгое ожидание и timed out — пакет потерялся по дороге: проброс не работает, мешает брандмауэр или NAT провайдера.

Test-NetConnection на Windows:

POWERSHELL
Test-NetConnection 203.0.113.10 -Port 25565

Смотрите на последнюю строку: TcpTestSucceeded : True значит, что порт открыт, False — что нет. Параметр -Port проверяет именно TCP (документация Microsoft).

UDP так не проверить. У UDP нет рукопожатия, и nc -vzu сообщает «успех» почти всегда, даже когда пакеты уходят в никуда. UDP-порт честно проверяет только сама программа: подключитесь к игровому серверу клиентом игры снаружи.

Туннель вместо проброса

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

Клиент fxTunnel на вашем компьютере сам устанавливает исходящее соединение с сервером fxTunnel. Исходящие соединения работают за любым NAT, включая провайдерский и мобильный. Сервер выдаёт публичный порт, принимает на него подключения и передаёт их по этому соединению вашему клиенту, а клиент — локальной программе.

интернетдруг или вы с работыfxtun.ru:15432
сервер fxTunnelпубличный портfxtun.ru:15432
дом за CGNATклиент fxtunnelfxtunnel tcp 25565
локальноваша программаlocalhost:25565
Рис. 1. Входящих подключений к вашей сети нет: клиент сам держит соединение с сервером fxTunnel.

Установите клиент. Linux и macOS:

BASH
curl -fsSL https://fxtun.ru/install.sh | sh

Windows, PowerShell:

POWERSHELL
irm https://fxtun.ru/install.ps1 | iex

Откройте новый терминал и войдите в аккаунт (заводится на fxtun.ru, вход нужен один раз):

BASH
fxtunnel login

Откройте порт той программы, которая вам нужна. Например, сервер Minecraft Java на 25565:

BASH
fxtunnel tcp 25565
CONSOLE
Connecting to fxtunnel server...
Tunnel established!
TCP: fxtun.ru:15432
Forwarding to localhost:25565
Ready to receive connections

Адрес fxtun.ru:15432 и есть ваш «открытый порт». Друзья подключаются к нему вместо вашего IP. Номер у вас будет свой, из диапазона 10000–20000.

Для веб-интерфейсов, например NAS или Home Assistant, удобнее HTTP-туннель: fxtunnel http 8123 выдаст адрес вида https://lemon.fxtun.ru с готовым сертификатом.

Чем туннель отличается от проброса

Проброс на роутереТуннель
Нужен белый IPДаНет
Нужен доступ к роутеруДаНет
Работает на мобильном интернетеОбычно нетДа
Номер порта снаружиЛюбой, какой задалиИз диапазона сервера: TCP 10000–20000, UDP 20001–30000
Ваш домашний IP виден подключающимсяДаНет, они подключаются к серверу fxTunnel
Работает, когда клиент выключенДа, пока включён сам сервисНет, только пока запущен fxtunnel

Честно о том, что стоит знать заранее:

  • Порт после перезапуска клиента новый. Пока fxtunnel работает, порт держится и при обрыве сети возвращается тот же. Перезапустили — сервер выдаст первый свободный. Попросить конкретный номер можно флагом --remote-port 15432 (только из диапазона и если его никто не занял). Если занят, клиент ответит Failed to connect: server rejected tunnel: port 15432 is already in use.
  • Один туннель — один порт. Если программе нужно два порта (у некоторых игр так), нужно два туннеля.
  • На бесплатном тарифе один HTTP-туннель. TCP, UDP и до пяти туннелей сразу — с тарифа Base.

Чем туннель и проброс отличаются по безопасности, разобрано в статье «Туннель vs проброс портов».

Брандмауэр: что он блокирует, а что нет

Брандмауэр Windows или Linux тоже часто оказывается виновником «закрытого порта». Мешает он, правда, не при любой схеме.

При пробросе на роутере подключение приходит на компьютер из сети, и брандмауэр должен его пропустить. Windows при первом запуске сервера обычно сама спрашивает, разрешить ли программе доступ к сети. Если вы нажали «Отмена» или окна не было, правило можно создать вручную в PowerShell от администратора (документация Microsoft):

POWERSHELL
New-NetFirewallRule -DisplayName "Minecraft 25565" -Direction Inbound -Protocol TCP -LocalPort 25565 -Action Allow

На Linux с ufw:

BASH
sudo ufw allow 25565/tcp

При туннеле входящих подключений к компьютеру из сети нет. Клиент fxtunnel сам выходит в интернет исходящим соединением, а к программе обращается на этом же компьютере, по адресу 127.0.0.1. Правило для входящих ему не нужно, и брандмауэр обычно не мешает.

Но одно условие остаётся при любой схеме: программа должна слушать порт. Туннель не запускает сервер за вас. Если сервер игры не стартовал, клиент туннеля всё равно напишет Ready to receive connections, а соединение у друга сразу оборвётся. Проверка — та же, что в шаге 1: ss -ltnp или Get-NetTCPConnection.

Ещё одна ловушка: программа, которая слушает только внешний сетевой адрес компьютера (например, 192.168.1.10), а не 127.0.0.1 или все адреса (0.0.0.0). Клиент туннеля стучится на 127.0.0.1 и получает отказ. Обычно это настраивается в конфиге сервера, параметром вроде bind, listen или server-ip: оставьте его пустым или укажите 0.0.0.0.

Если открываете что-то серьёзнее игры

Открытый порт видят все, включая сканеры, которые круглые сутки перебирают адреса. Для удалённого рабочего стола, NAS и баз данных это реальный риск, и туннель его не отменяет: сервис за ним доступен из интернета так же, как при пробросе.

  • Ограничьте, кто может подключаться: fxtunnel tcp 3389 --allow-ip 203.0.113.10 пропустит только указанный адрес. --allow-ip работает у HTTP-, TCP- и UDP-туннелей.
  • Пароль на уровне туннеля (--auth user:пароль) есть только у HTTP-туннелей. Для TCP защищайтесь средствами самого сервиса: сложный пароль, NLA для RDP, вход по ключу для SSH.
  • Туннель, который нужен на пару часов, закрывайте по таймеру: --max-lifetime 3h.

Про доступ к рабочему столу есть отдельная страница «Удалённый доступ».

Что дальше

Когда нужен TCP или несколько туннелей

TCP и UDP доступны на платных тарифах: Base — 210 ₽/мес и 5 туннелей одновременно, Pro — 420 ₽/мес и 15 туннелей, Business — 630 ₽/мес и 50 туннелей. Free включает один HTTP-туннель с HTTPS.

Выберите клиент на странице скачивания: GUI для работы через графический интерфейс или CLI для терминала.

$ curl -fsSL https://fxtun.ru/install.sh | sh
@mephistofx

Пишу fxTunnel — туннели для разработчиков без белого IP. Рассказываю, как это устроено изнутри.

Написать в Telegram →

Читайте дальше