Port forwarding (проброс портов) — правило, по которому пакет, пришедший на внешний IP:port, транслируется на внутренний IP:port. Используется в двух главных сценариях: доступ извне к сервису за NAT (домашний Wi-Fi роутер) и маппинг портов Docker-контейнера на хост.
На домашнем роутере: заходите в веб-интерфейс → Port Forwarding → правило `WAN:8080 → 192.168.1.42:80`. Теперь запрос на `<ваш_публичный_IP>:8080` дойдёт до внутреннего сервера. Часто ломается из-за CGNAT — провайдер сам сидит за NAT, публичного IPv4 у вас нет. Решение: попросить white IP или использовать WireGuard-туннель через VPS.
В Docker: `docker run -p 8080:80 nginx` — тот же принцип, но правило пишется в iptables хоста автоматически. Хост слушает 8080, форвардит на порт 80 контейнера. `docker-compose` секция `ports: ["8080:80"]`.
SSH-туннели дают то же самое поверх SSH: `ssh -L 8080:localhost:3000 user@server` — локальный 8080 форвардится на `server:3000`. Работает через любой firewall, где открыт SSH. Reverse-туннель `ssh -R` — из внешнего мира на локальный порт (полезно, когда сидите за NAT без publicIP).
Опасно: (1) открыть 22 наружу без fail2ban — попадёт в брут. (2) форвардить БД (5432, 3306, 6379) без TLS — украдут пароль sniffером. (3) забыть закрыть форвард после debug — открыли Redis всему интернету, потеряли данные.