Что такое NAT и почему сервер за ним не пингуется и не открывается снаружи
Дома всё работает: NAS открывается, камера показывает, ping идёт. Из интернета — таймаут, «внешний IP не пингуется». Чаще всего виноват не сервер, а NAT: свой, провайдерский или оба сразу. Разбираем, что NAT делает с пакетами, как отличить серый адрес от белого, как пробросить порт в iptables, nftables и MikroTik, как обойти CGNAT туннелем на VPS и как проверить, виден ли сервис из интернета, а не только из локалки.
NAT (Network Address Translation) — подмена IP-адресов и портов в заголовках пакетов на границе сети, благодаря которой много устройств с частными адресами выходят в интернет через один публичный адрес. Обратная сторона: снаружи этих устройств не существует — у них нет адреса, на который можно отправить пакет. Поэтому домашний сервер, камера или NAS за NAT не пингуются и не открываются из интернета, пока на роутере не настроен проброс порта, а у провайдера не получен белый IP или не поднят туннель до машины с публичным адресом.
Как работает NAT и почему он пропускает трафик только в одну сторону
NAT-роутер ведёт таблицу трансляций и создаёт запись в ней только по исходящему пакету. Когда ноутбук 192.168.1.10 с порта 51234 обращается к сайту 203.0.113.5:443, роутер переписывает источник на свой внешний адрес и свободный порт — 198.51.100.7:40001 — и запоминает соответствие; ответ сайта приходит на 40001 и по записи возвращается на 192.168.1.10:51234. Пакет, пришедший снаружи на 198.51.100.7:80 без такой записи и без правила проброса, роутеру некому отдать — он отбрасывается.
Причина существования NAT — дефицит адресов IPv4: их около 4,3 млрд. RFC 1918 (февраль 1996) зарезервировал частные диапазоны для любых сетей без согласования, а RFC 3022 (январь 2001) описал два механизма: Basic NAT (один частный адрес ↔ один публичный) и NAPT (много частных через один публичный за счёт подмены портов). Сегодня под NAT почти всегда имеют в виду NAPT. В Linux таблица трансляций живёт в conntrack:
# Записи трансляций на Linux-шлюзе (пакет conntrack-tools)
$ sudo conntrack -L -p tcp --dport 443 | head -1
# пример вывода, одна запись перенесена: слева пакет изнутри,
# справа — как его видит интернет
tcp 6 431999 ESTABLISHED src=192.168.1.10 dst=203.0.113.5
sport=51234 dport=443
src=203.0.113.5 dst=198.51.100.7 sport=443 dport=40001
[ASSURED] mark=0 use=1
Число 431999 в записи — оставшийся таймаут в секундах: установленное TCP-соединение Linux помнит 5 суток. Про таймауты и почему из-за них рвутся долгие соединения — ниже.
Какие адреса частные и почему до них нельзя достучаться из интернета
Частные диапазоны не маршрутизируются в интернете: пакет на 192.168.1.20 из другой сети отбросит первый же провайдерский маршрутизатор. Таких диапазонов несколько, и по адресу WAN-интерфейса роутера видно, какой NAT стоит между вами и интернетом.
| Диапазон | Стандарт | Назначение | Маршрутизируется в интернете |
|---|---|---|---|
| 10.0.0.0/8 | RFC 1918 | Частные сети, 16,7 млн адресов; корпоративные сети, часть провайдеров выдаёт абонентам за NAT | Нет |
| 172.16.0.0/12 | RFC 1918 | Частные сети, 1 млн адресов; Docker по умолчанию | Нет |
| 192.168.0.0/16 | RFC 1918 | Частные сети, 65 536 адресов; домашние роутеры | Нет |
| 100.64.0.0/10 | RFC 6598 (апрель 2012) | Shared Address Space: 4,2 млн адресов между CGNAT провайдера и абонентским роутером. Увидели такой на WAN — вы за CGNAT | Нет, не должен пересекать границу провайдера |
| 127.0.0.0/8 | RFC 1122 | Loopback — сам хост; сервис на 127.0.0.1 не виден даже соседям по локалке | Нет |
| 169.254.0.0/16 | RFC 3927 | Link-local: устройство само назначило себе адрес, не дождавшись DHCP | Нет |
| Остальные | Реестры RIR | Публичные («белые») адреса, выделяются провайдерам и хостерам | Да |
Какие бывают типы NAT
Все виды NAT сводятся к двум операциям: подмене источника у исходящих пакетов (SNAT) и подмене назначения у входящих (DNAT). Остальное — частные случаи и уровни, на которых они выполняются.
| Тип | Что делает | Где встречается | Пример |
|---|---|---|---|
| SNAT / masquerade | Подменяет адрес источника у исходящих пакетов. Masquerade — SNAT, который сам берёт текущий адрес интерфейса (для динамических IP) | Любой домашний роутер, Linux-шлюз, Docker | 192.168.1.10:51234 → 198.51.100.7:40001 |
| DNAT / проброс порта | Подменяет адрес и порт назначения у входящих: «всё, что пришло на внешний 8443, отдать на NAS:443» | Раздел «Переадресация портов» / «Virtual Server» в роутере | 198.51.100.7:8443 → 192.168.1.20:443 |
| PAT / NAPT | SNAT с подменой ещё и порта, чтобы один публичный адрес делили сотни соединений с разных устройств | Практически любой современный SNAT | Два ноутбука с портом 51234 получают внешние 40001 и 40002 |
| CGNAT (NAT444) | Второй уровень NAT у провайдера: абонентам выдаются адреса из 100.64.0.0/10 или 10.0.0.0/8, один публичный IP делят сотни абонентов | Мобильные операторы, часть домашних провайдеров в России | 100.71.23.148 → 5.18.204.77 (общий с соседями) |
| Hairpin NAT (NAT loopback) | Обращение из локалки к своему же внешнему адресу: роутер разворачивает пакет обратно внутрь. RFC 4787 (REQ-9) требует поддержки, реализована не везде | Домашние и офисные роутеры | Сайт по внешнему IP не открывается изнутри, хотя снаружи работает |
| 1:1 (static NAT) | Один публичный адрес целиком отображается на один внутренний, все порты | Облака (плавающие/эластичные IP), ЦОД | Виртуалка видит у себя 10.0.0.5, а снаружи доступна как 203.0.113.10 |
| Full cone … symmetric | Классификация RFC 3489 (2003): как NAT выбирает внешний порт и кого пускает обратно. Symmetric даёт новый порт на каждого собеседника — STUN не поможет, нужен ретранслятор TURN | VoIP, WebRTC, игры, P2P | Видеозвонок за CGNAT идёт через TURN-сервер |
Серый или белый IP: как понять, что вы за CGNAT
Белый IP — публичный адрес назначен непосредственно WAN-интерфейсу вашего роутера; серый — на WAN стоит адрес из 100.64.0.0/10, 10.0.0.0/8 или 172.16.0.0/12, а публичный принадлежит NAT провайдера и делится между абонентами. Проверка занимает минуту: сравнить адрес WAN с тем, что видит интернет.
# На роутере или сервере, подключённом к провайдеру напрямую
$ ip -4 addr show dev eth0 | grep inet
# пример вывода: адрес WAN из 100.64.0.0/10 — вы за CGNAT
inet 100.71.23.148/22 brd 100.71.23.255 scope global dynamic eth0
# Каким вас видит интернет (то же покажет 2ip.ru или «мой IP» в поиске)
$ curl -4 ifconfig.me
5.18.204.77
# Адреса не совпали — между вами и интернетом ещё один NAT.
# Совпали — IP белый, дальше вопрос к правилам вашего роутера.
На домашнем роутере адрес WAN виден на странице состояния, на MikroTik — /ip address print; косвенный признак — второй хоп в traceroute из 100.64.0.0/10. Мобильные операторы держат абонентов за CGNAT почти всегда, у проводных белый адрес обычно подключается как отдельная услуга. Белый, но динамический адрес меняется при переподключении — для него нужен DDNS.
Почему сервер за NAT не пингуется и не открывается снаружи
Ping из интернета доходит в лучшем случае до WAN-интерфейса роутера, а не до сервера за ним: у ICMP нет портов, «пробросить ping» на конкретное устройство нельзя. Поэтому «внешний IP не пингуется» говорит о роутере и провайдере, а не о сервере, а «открывается дома, но не снаружи» — одна из шести причин ниже.
| Причина | Как проверить | Что делать |
|---|---|---|
| Серый IP / CGNAT | WAN-адрес из 100.64/10 или 10/8 и не совпадает с 2ip; ping и порт снаружи — таймаут | Белый IP у провайдера или туннель на VPS; проброс на роутере сам по себе не поможет |
| ICMP закрыт на роутере | Порт снаружи открывается, а ping нет: большинство домашних роутеров по умолчанию не отвечают на echo с WAN | Включить «Отвечать на ping из WAN» или не считать ping критерием — проверять порт |
| Нет проброса (DNAT) | Роутер пингуется, порт снаружи — таймаут (filtered); изнутри по 192.168.x.x работает | Правило DNAT + разрешение в FORWARD, см. раздел ниже |
| Файрвол на самом сервере | Проброс есть, с роутера порт открыт, снаружи нет; ufw или брандмауэр Windows режет чужие подсети | Разрешить порт для любых источников, а не только для «частной сети» |
| Сервис слушает 127.0.0.1 | ss -ltn показывает 127.0.0.1:8080 вместо 0.0.0.0:8080; не открывается даже с соседнего компьютера | Привязать сервис к 0.0.0.0 или к адресу LAN-интерфейса |
| Двойной NAT | На WAN вашего роутера 192.168.0.x — перед ним модем провайдера в режиме роутера | Перевести модем в режим моста либо сделать проброс на обоих устройствах |
Порядок диагностики: отключите Wi-Fi на телефоне и проверьте по LTE — телефон в домашнем Wi-Fi ничего не доказывает. Затем проверьте снаружи порт, а не ping: как это сделать без своего сервера — в статье «Как проверить, открыт ли порт». Почему хост может быть жив и при этом молчать на ICMP, разобрано в материале про ping.
Как пробросить порт: iptables, nftables и MikroTik
Проброс — правило DNAT в цепочке PREROUTING плюс разрешение в FORWARD: первое переписывает адрес назначения, второе пропускает переписанный пакет через шлюз. Без второго DNAT сработает, а пакет умрёт на политике DROP.
# Linux-шлюз: внешний 8443 на eth0 → 192.168.1.20:443 в LAN (br0)
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8443 \
-j DNAT --to-destination 192.168.1.20:443
sudo iptables -A FORWARD -i eth0 -o br0 -p tcp -d 192.168.1.20 \
--dport 443 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
# Исходящий masquerade, если его ещё нет
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Проверка: правило на месте и по нему идут пакеты (pkts > 0)
$ sudo iptables -t nat -L PREROUTING -n -v
# пример вывода
Chain PREROUTING (policy ACCEPT 812 packets, 61K bytes)
pkts bytes target prot opt in out source destination
37 2220 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0
tcp dpt:8443 to:192.168.1.20:443
# То же в nftables
sudo nft add table ip nat
sudo nft add chain ip nat prerouting \
'{ type nat hook prerouting priority -100; }'
sudo nft add chain ip nat postrouting \
'{ type nat hook postrouting priority 100; }'
sudo nft add rule ip nat prerouting iif eth0 tcp dport 8443 \
dnat to 192.168.1.20:443
sudo nft add rule ip nat postrouting oif eth0 masquerade
sudo nft list ruleset
Если pkts в строке DNAT остаётся нулём после проверки снаружи — пакеты до роутера не доходят: CGNAT или фильтрация провайдера. Растёт, а сервис не открывается — ищите на сервере: файрвол или привязку к 127.0.0.1. На MikroTik то же делается одной строкой; вторая нужна для hairpin — доступа по внешнему адресу из своей же локалки:
# RouterOS: проброс 8443 с ether1 (WAN) на 192.168.88.20:443 /ip firewall nat add chain=dstnat in-interface=ether1 protocol=tcp \ dst-port=8443 action=dst-nat to-addresses=192.168.88.20 to-ports=443 # Hairpin NAT: обращение из своей LAN по внешнему адресу /ip firewall nat add chain=srcnat src-address=192.168.88.0/24 \ dst-address=192.168.88.20 protocol=tcp dst-port=443 \ out-interface=bridge action=masquerade /ip firewall nat print
Как обойти CGNAT: WireGuard-туннель на VPS
За CGNAT проброс на роутере бесполезен — входящий пакет не доходит даже до него. Рабочая схема: домашний сервер сам поднимает исходящее соединение к VPS с белым адресом, а VPS пробрасывает свой порт внутрь туннеля. Исходящие соединения NAT пропускает всегда, поэтому это работает через любой CGNAT и мобильный интернет.
Клиент из интернета ──▶ VPS 203.0.113.10:8443 (белый IP)
│ DNAT 8443 → 10.8.0.2:443 в wg0
▼ WireGuard, UDP 51820 — туннель поднят
│ ИЗНУТРИ, поэтому CGNAT его пропускает
CGNAT (100.64.x.x) ──▶ роутер ──▶ сервер wg0 = 10.8.0.2
# VPS: /etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <приватный ключ VPS>
PostUp = sysctl -w net.ipv4.ip_forward=1
# плюс правила из раздела выше: DNAT dport 8443 → 10.8.0.2:443
# и MASQUERADE на выход в wg0
[Peer]
PublicKey = <публичный ключ домашнего сервера>
AllowedIPs = 10.8.0.2/32
# Домашний сервер за CGNAT: /etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.2/24
PrivateKey = <приватный ключ сервера>
[Peer]
PublicKey = <публичный ключ VPS>
Endpoint = 203.0.113.10:51820
AllowedIPs = 10.8.0.0/24
# Держит запись в таблицах NAT живой; 25 с — рекомендация wireguard.com
PersistentKeepalive = 25
MASQUERADE на wg0 обязателен: без него домашний сервер увидит запрос от публичного адреса клиента и ответит через свой шлюз по умолчанию, а не в туннель — соединение зависнет. Если наружу нужен только HTTP(S), поверх того же туннеля ставят обратный прокси: nginx или Caddy на VPS с proxy_pass на 10.8.0.2, TLS-сертификат тогда живёт на VPS.
Какое решение выбрать для доступа снаружи
Выбор зависит от одного вопроса: белый у вас адрес или серый. С белым хватит проброса и DDNS, с серым нужен либо белый адрес от провайдера, либо точка с публичным адресом где-то ещё — обычно VPS.
| Решение | Стоимость | Сложность | Когда подходит |
|---|---|---|---|
| Белый IP у провайдера | Платная опция у проводных провайдеров; у мобильных доступна не всегда | Низкая | Проводной интернет, любые порты и протоколы. Проброс на роутере всё равно нужен |
| Проброс портов | Бесплатно | Низкая | Белый IP уже есть. Не работает за CGNAT |
| DDNS | Бесплатно или дёшево; встроен во многие роутеры | Низкая | Белый, но динамический IP: имя обновляется при смене адреса. Серый адрес не лечит |
| VPN-туннель на VPS (WireGuard) | Аренда самого дешёвого VPS | Средняя | CGNAT, мобильный интернет, произвольные порты (SSH, RDP, RTSP камер) |
| Обратный прокси на VPS | Аренда VPS | Средняя | Только веб: сайт, панель NAS, Home Assistant. TLS и доменное имя — на VPS |
Почему за NAT рвутся долгие соединения и какие таймауты у трансляций
Запись в таблице NAT живёт, пока по ней ходят пакеты; молчащее соединение NAT забывает, и следующий пакет от сервера некому доставить — SSH-сессия или WebSocket «зависает» без ошибки. Лечение одно: слать что-нибудь чаще, чем истекает таймаут, — keepalive.
| Состояние записи | Linux conntrack по умолчанию | Минимум по RFC | Что ломается и чем лечить |
|---|---|---|---|
| UDP, ответа не было | 30 с (nf_conntrack_udp_timeout) | RFC 4787: не менее 120 с, рекомендовано 300 с | DNS и одиночные запросы — не страдают |
| UDP, пакеты в обе стороны | 120 с (nf_conntrack_udp_timeout_stream) | те же 120 с | WireGuard, VoIP, игры: PersistentKeepalive = 25, RTP-пакеты сами по себе часты |
| TCP established | 432 000 с — 5 суток | RFC 5382: не менее 2 ч 4 мин (7244 с) | На CGNAT и дешёвых роутерах меньше. SSH: ServerAliveInterval 30; ядро: tcp_keepalive_time 7200 с по умолчанию — снизить до 60; WebSocket: ping-фреймы |
Отсюда и STUN с TURN в видеозвонках: STUN-сервер (RFC 8489) сообщает клиенту его внешний адрес и порт, чтобы два абонента за NAT соединились напрямую; если один за symmetric NAT — трафик идёт через ретранслятор TURN (RFC 8656). Смежная тема — MTU: туннель WireGuard забирает у пакета 60 байт заголовков IPv4, и без снижения MTU большие ответы через него теряются — подробнее в статье про MTU, MSS и фрагментацию.
Как убедиться, что сервис виден из интернета, а не только из локалки
Единственный честный способ — проверка с чужого адреса: изнутри сети NAT, hairpin и локальный DNS маскируют любую из шести причин выше. Разовая проверка с телефона отвечает на вопрос «сейчас», но не ловит смену динамического IP ночью, слетевший проброс после обновления прошивки или перевод абонента за CGNAT без предупреждения.
Пруфен выполняет проверку ping и проверку TCP-порта с интервалом от 2 минут из 20 точек мониторинга — 17 в России, а также Минск, Астана и Испания. Для сервера за NAT их стоит держать парой: сочетание результатов подсказывает, где искать.
| Ping снаружи | Порт снаружи | Что это значит |
|---|---|---|
| Нет | Открыт | Норма для домашнего роутера: ICMP с WAN выключен, сервис работает; мониторить порт |
| Есть | Закрыт | Роутер жив, проблема внутри: проброс, файрвол сервера, привязка к 127.0.0.1, упавший сервис |
| Нет | Закрыт | До роутера не доходит: CGNAT, сменился динамический IP, обрыв у провайдера, роутер выключен |
Пруфен присылает уведомление в Email, Telegram или Макс, когда порт перестал отвечать с заданной доли точек, и второе — когда доступ восстановился. Если ресурс так и не поднялся, подключается голосовой звонок. Время обнаружения равно интервалу проверки. Бесплатного плана на 5 проверок хватает на ping роутера, порт NAS, камеру, SSH и туннель до VPS.
Частые вопросы
Как узнать, серый у меня IP или белый?
Сравните адрес WAN на странице состояния роутера с тем, что показывает 2ip.ru или curl ifconfig.me. Совпали — адрес белый. Не совпали, и на WAN что-то из 100.64.0.0/10, 10.0.0.0/8 или 172.16.0.0/12 — вы за CGNAT. Если на WAN 192.168.x.x — перед вашим роутером стоит ещё один, обычно модем провайдера; смотрите адрес WAN уже на нём.
Почему сайт открывается дома, а с телефона по LTE нет?
Дома вы попадаете на сервер по локальному адресу или через hairpin NAT роутера, минуя всё, что стоит между роутером и интернетом. По LTE запрос идёт снаружи и упирается в CGNAT провайдера, отсутствие проброса или файрвол сервера. Проверьте по порядку: адрес WAN роутера, счётчик pkts в правиле DNAT, ss -ltn на сервере. И убедитесь, что на телефоне выключен Wi-Fi.
Нужен ли NAT в IPv6?
Нет: адресов IPv6 хватает, чтобы каждое устройство получило глобальный, и классический NAT там не применяется. Но «нет NAT» не значит «всё открыто»: роутер по умолчанию блокирует входящие соединения файрволом, и для доступа снаружи нужно явно разрешить порт к адресу конкретного устройства. Для локальной адресации есть ULA fc00::/7 (RFC 4193), на стыке с IPv4 — NAT64 (RFC 6146), но это трансляция протоколов, а не экономия адресов.
Что такое двойной NAT?
Две последовательные трансляции: модем провайдера раздаёт 192.168.0.x, а за ним ваш роутер — 192.168.1.x. Ваш роутер плюс CGNAT провайдера — тоже двойной NAT, только второй уровень вам не подконтролен. Проброс нужен на каждом уровне, который вы контролируете, а лучше убрать лишний: перевести модем в режим моста или свой роутер — в режим точки доступа.