Почему не работает проброс порта из локальной сети через OpenVPN?

У меня такая схема — на ПК установлен Debian с OpenVPN-клиентом, на VPS — OpenVPN-сервер. Конфигурации и последовательность действий описаны ниже.
  • 5 мая 2026 г. 7:01
Ответы на вопрос 2
Спасибо — сейчас пока не хватает данных, чтобы сказать точно. Ниже — короткий чеклист причин и набор команд для диагностики + примеры правильных правил. Выполни эти проверки и пришли выводы (особенно конфиги OpenVPN сервера/клиента и выводы команд), тогда помогу точечно.

1) Быстрая проверка (на VPS)
- Включён ли IP-форвардинг?
  - Команда: sysctl net.ipv4.ip_forward
  - Ожидаемо: net.ipv4.ip_forward = 1
  - Если 0: sudo sysctl -w net.ipv4.ip_forward=1 и сохранить в /etc/sysctl.conf

- Есть ли NAT / DNAT правило?
  - Покажи: sudo iptables -t nat -L -n -v
  - Пример для перенаправления порта 1234 -> клиент 10.8.0.6:1234:
    sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1234 -j DNAT --to-destination 10.8.0.6:1234
    sudo iptables -A FORWARD -d 10.8.0.6/32 -p tcp --dport 1234 -j ACCEPT

- Разрешено ли FORWARD в фильтрующей таблице?
  - Покажи: sudo iptables -L FORWARD -n -v
  - Нужно, чтобы не было блокировок, либо явно разрешить трафик к VPN-IP клиента.

2) Проверки трафика (отлов пакетов)
- На VPS:
  sudo tcpdump -n -i eth0 port 1234
  sudo tcpdump -n -i tun0 host 10.8.0.6 and port 1234
  - Посмотри: доходят ли пакеты на eth0 и появляются ли на tun0 после DNAT.

- На клиенте (или целевом ПК):
  sudo tcpdump -n -i tun0 port 1234
  - Доходит ли пакет вообще до клиента? Если нет — проблема на стороне сервера (DNAT/форвард/маршрут).

3) Локальные проверки сервиса
- На клиенте проверь, что сервис слушает на нужном порту и интерфейсе:
  sudo ss -ltnp | grep 1234
  - Желательно слушать либо 0.0.0.0, либо конкретно VPN-интерфейс (tun0), либо localhost + проброс на клиенте.

- Проверь соединение с VPS с клиента через VPN:
  curl http://10.8.0.1:80 (например тест сервера) или с VPS curl 10.8.0.6:1234

4) Общие частые причины и решения
- Неправильный IP в DNAT: нужно DNAT на VPN-адрес клиента (например 10.8.0.x), а не на его локальный LAN-адрес.
- Нет маршрута/форварда: net.ipv4.ip_forward=1 и iptables FORWARD должно разрешать.
- Фаервол провайдера/VPS (облако) блокирует порт — проверь security group / cloud firewall.
- Если используешь UFW, он может перезаписывать iptables; для UFW нужно добавить правила в /etc/ufw/before.rules и разрешить forwarding.
- Клиентский брандмауэр (iptables/nftables/Windows firewall) может блокировать входящие на сервис.
- OpenVPN topology: если у тебя net30/iroute/ccd, убедись, что используешь правильный VPN-IP клиента (особенно при статических назначениях через CCD).
- Если пытаешься переслать на локальный IP клиента (не VPN IP) без дополнительных маршрутных настроек — не сработает. Либо DNAT на VPN-IP, либо настроить маршрутизацию/iroute.

5) Полезные команды, приклей выводы сюда
- ifconfig / ip addr (на VPS и на клиенте)
- ip route
- iptables -t nat -L -n -v
- iptables -L FORWARD -n -v
- sysctl net.ipv4.ip_forward
- sudo tcpdump -n -i tun0 port <порт> (и на eth0 VPS)

6) Пример минимальной рабочей настройки (VPS)
- OpenVPN server: серверная подсеть 10.8.0.0/24, клиент получает 10.8.0.6
- DNAT:
  sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 10.8.0.6:80
  sudo iptables -A FORWARD -d 10.8.0.6/32 -p tcp --dport 80 -j ACCEPT
- Включить форвард:
  sudo sysctl -w net.ipv4.ip_forward=1

Если пришлёшь:
- server.conf и client.conf,
- выводы команд из пункта 5,
- вывод tcpdump (если запущал),
я пошагово разберу, где именно «теряются» пакеты и как это исправить.
Классика asymmetric routing. Пакет летит в Debian через tap0, а ответ уходит через enp9s0 к физическому роутеру — VPS его не видит и MASQUERADE для ответа не срабатывает. Другие девайсы в LAN работают потому что весь их трафик идёт и возвращается через роутер, VPS их форвардит по L2 прозрачно. <br/> <br/> Фикс: дай VPS-у IP на tap0 ( <code>ip addr add 10.10.0.254/24 dev tap0</code> ), потом: <br/> <pre><code>iptables -t nat -A POSTROUTING -o tap0 -d 10.10.0.2 -j MASQUERADE</code></pre> <br/> Тогда пакет придёт к Debian с src=10.10.0.254, он ответит обратно в тунель по ARP записи VPS-овского tap мака, и всё заработает.
Похожие вопросы