Задать вопрос

Netbeans / xdebug (удаленно) — не устанавливается соединение... что я делаю не так?

Доброго времени суток.
Упорно не могу подружить xdebug на удаленном сервере (freebsd) с neatbeans на локальной машине (windows). Прошу подсказать, что и где еще можно подкрутить?

Итак, что имеем:

На сервере:
Хостинг от Ru-Center, FreeBSD/Apache/Nginx, PHP 5.6, установил xdebug,
PHP.INI (в части xDebug):
[debug]
zend_extension="/home/USERNAME/usr/php/lib/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host=localhost
xdebug.remote_port=9009
;xdebug.remote_connect_back=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.idekey="netbeans-xdebug"
xdebug.remote_log="/home/USERNAME/logs/xdebug/xdebug.log"
xdebug.profiler_output_dir="/home/USERNAME/logs/xdebug/profiler/"
xdebug.trace_output_dir="/home/USERNAME/logs/xdebug/trace/"

вместо USERNAME - везде корректная папка юзера, естественно;
автостарт - да, это временно, пока работоспособности хдебага не добьюсь...

phpinfo сообщает, что xdebug успешно работает, вся конфигурация отображается так же, как задано в php.ini.

Локально - WinXP, NetBeans, файрволл отключен (и штатный и комодо).
Сложность в том, что IP-адрес НЕ выделенный, поэтому на удаленке явно задать xdebug.remote_host не вариант... поэтому с помощью PUTTY проброшен обратный SSH-туннель:
R9009 - localhost:9009
Удаленный 9009 порт - пробрасывается на локальный 9009, вроде все стандартно;

Удаленный netstat -a|grep 9009 показывает, что туннель есть:
tcp6       0      0 localhost.9009         *.*                    LISTEN


Если тыкаюсь в сайт - xdebug начинает что-то отправлять на localhost:9009 :
tcp4       0      0 nosorog.nichost..14107 localhost.9009         SYN_SENT
tcp6       0      0 localhost.9009         *.*                    LISTEN

НО! до локальной машины ни коннект ни данные по тунелю не доходят.

Теперь странности:
И все бы ничего, можно было грешить на много чего - на файрволл, на провайдера, на закрытые порты у хостера (хотя за открытие портов на вход и выход я дополнительно заплатил), если бы ни одно НО:

Для проверки работоспособности туннеля локально запускаю простой листенер:
from socket import *
from time import sleep

host = ''
port = 9009
sock = socket(AF_INET, SOCK_STREAM)
print 'sock.bind...'
sock.bind((host, port))
sock.listen(5)
while 1:
	print '  sock.accept - listening for incoming connection...'
	conn, addr = sock.accept()
	print '  connected from '+str(addr)
	sleeptime = 10
	print '    sleep for ' + str(sleeptime) + ' sec before force close connection...'
	sleep(sleeptime)
	print '    conn.close...'
	conn.close()
	print '    disconnected from '+str(addr)
print 'sock.close...'
sock.close()


Удаленно запускаю
ssh -p 9009 localhost

И выясняется, что коннект-то есть (листенер на локальной машине принимает входящее соединение от сервера, нетстаты на обоих машинах видят успешное соединение, в общем - идиллия).
Но вот почему-то никто больше (кроме этой команды) на сервере может через него достучаться до локальной машины. И никто больше (кроме этого листенера) на локальной машине - не замечает сигналов от сервера через этот туннель.

ИТОГО, были испробованы все возможные варианты на сервере и локально:

С сервера:
- ssh -p 9009 localhost
- тестовым скриптом наподобие листенера выше
- собственно, xdebug (т.к. autostart, то любой запрос к сайту инициирует отправку данных на localhost:9009)

На локальной машине :
- приведенный выше листенер
- собственно NetBeans в режиме ожидания коннекта от xDebug

Из всего приведенного, только одна комбинация (ssh удаленно и listener локально) показывают коннект, что говорит о том, что впринципе туннель жив.
Тестовый скрипт на сервере отваливается по таймауту, xDebug в логи пишет то же самое "E: Time-out connecting to client. :-(", при этом нетстат на сервере видит отправку данных в обоих случаях.
Локально - что листенер, что нетбинс просто занимают порт на LISTEN, и (кроме вышеупомянутой комбинации ssh+листенер) не подают никаких признаков коннекта.

Вопрос:
Что, блин, я еще мог упустить?
Заранее спасибо за любые мысли.

PS и да, мои знания юниксов и сетевых премудростей - достаточно поверхностны, поэтому вполне допускаю, что причина может оказаться идиотской :)

UPD:
промежуточные итоги:
- оттуда удается достучаться с помощью ssh и telnet; в обоих случаях, тестовый листенер на локальной машине принимает соединение, если нетбинсом слушать - он игнорит, но wireshark все-же видит пакеты;

- оттуда НЕ может достучаться xdebug и тестовый скрипт sock.connect(('localhost', 9009)); в обоих случаях SYN_SENT на той стороне и отвал по таймауту, на этой - ноль реакции как в нетстате, так и в wireshark;
  • Вопрос задан
  • 662 просмотра
Подписаться 1 Оценить 4 комментария
Пригласить эксперта
Ответы на вопрос 1
@Nikon_NLG
А что за ошибка то? И у вас remote_host = localhost. Вы через туннель к xdebug подключаетесь?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы