Туннель SSH отказывает соединения с «канал 2: открыть не удалось»

71

Внезапно (читай: без изменения каких-либо параметров) моя виртуальная машина netbsd начала работать странно. Симптомы касаются туннелирования ssh.

С моего ноутбука я запускаю:

$ ssh -L 7000:localhost:7000 user@host -N -v

Затем в другой оболочке:

$ irssi -c localhost -p 7000

Отладка ssh говорит:

debug1: Connection to port 7000 forwarding to localhost port 7000 requested.
debug1: channel 2: new [direct-tcpip]
channel 2: open failed: connect failed: Connection refused
debug1: channel 2: free: direct-tcpip: listening port 7000 for localhost port 7000, connect from 127.0.0.1 port 53954, nchannels 3

Я попытался также с localhost: 80 подключиться к (удаленному) веб-серверу, с одинаковыми результатами.

Удаленный хост запускает NetBSD:

bash-4.2# uname -a
NetBSD host 5.1_STABLE NetBSD 5.1_STABLE (XEN3PAE_DOMU) #6: Fri Nov  4 16:56:31 MET 2011  root@youll-thank-me-later:/m/obj/m/src/sys/arch/i386/compile/XEN3PAE_DOMU i386

Я немного растерялся. Я попытался запустить tcpdumpна удаленном хосте, и я обнаружил эти «плохой chksum»:

09:25:55.823849 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 67, bad cksum 0 (->3cb3)!) 127.0.0.1.54381 > 127.0.0.1.7000: P, cksum 0xfe37 (incorrect (-> 0xa801), 1622402406:1622402421(15) ack 1635127887 win 4096 <nop,nop,timestamp 5002727 5002603>

Я попытался перезапустить демон ssh безрезультатно. Я еще не перезагружался - возможно, кто-то здесь может предложить другую диагностику. Я думаю, что это может быть либо драйвер виртуальной сетевой карты, либо кто-то рутировал наш ssh.

Идеи ..?

lorenzog
источник
1
Для устранения неполадок попробуйте $ ssh -L 7000:127.0.0.1:7000 user@host -N -v -v. (Вы можете использовать «-v» до 3 раз, чтобы увеличить детализацию.) Кроме того, возможно ли, что ssh был недавно обновлен?
Майк Шеррилл 'Cat Recall'
Лог вывода, который я вставил, уже собран с -v.
Лоренцог
1
Вы можете использовать -v до трех раз, чтобы увеличить детализацию. Так что вы можете посмотреть на вывод ssh -L 7000... -N -v -v(два v) или ssh -L 7000... -N -v -v -v.
Майк Шеррилл 'Cat Recall'
@ MikeSherrill'CatRecall 'Также можно использовать стенографию: -vvv
jnns

Ответы:

42

Задача решена:

$ ssh -L 7000:127.0.0.1:7000 user@host -N -v -v

... очевидно, localhost не понравился удаленному хосту. Тем не менее, удаленный /etc/hostsсодержит:

::1                     localhost localhost.
127.0.0.1               localhost localhost.

в то время как интерфейс локальной сети

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33184
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2

Вздох. столько за щедрость в 100рп я надел :)

lorenzog
источник
1
Ах. Ну, тогда я не буду писать свой комментарий в качестве ответа. (Узнайте, предпочитает ли ssh адреса ipv6 в вашей системе.)
Майк Шеррилл 'Cat Recall'
Что ж, вы предложили удвоить опцию -v, но это не показало ничего нового ... однако, заставив меня снова взглянуть на результат через несколько дней, я смог определить проблему. Если вы хотите написать ответ, я более чем счастлив предоставить вам награду.
lorenzog
1
На самом деле, важным моментом была замена «localhost» на «127.0.0.1». Дополнительные аргументы "-v" могли бы быть полезными, но они не были тем, к чему я стремился. Благодарю.
Майк Шеррилл 'Cat Recall'
согласно этому посту на superuser: superuser.com/questions/346971/ssh-tunnel-connection-refused программа, настроенная на прослушивание по определенному адресу, будет прослушивать этот конкретный адрес
jopasserat
1
Для меня добавление ведущего ":" работает так, чтобы команда в вашем случае выглядела так: ssh -L: 7000: 127.0.0.1: 7000 user @ host -N -v -v
valentt
21

Хотя проблема OP уже решена, я решил поделиться решением этой проблемы, потому что я получил такое же сообщение об ошибке от ssh, и я не нашел никакого решения на других сайтах.

В моем случае мне пришлось подключиться к сервису, который прослушивает только IPv6. Я пытался:

ssh -f root@192.168.0.18 -L 51005: 127.0.0.1: 51005 -N
ssh -f root@192.168.0.18 -L 51005: локальный хост: 51005 -N

и несколько других способов, но это не сработало. Любая попытка подключения к http://localhost:51005вызывает ошибки, подобные этой: channel 2: open failed: connect failed: Connection refused

Решение:

ssh -f root@192.168.0.18 -L 51005: [:: 1]: 51005 -N

Адрес IPv6 должен быть в квадратных скобках.

rzymek
источник
1
Что делать, если вы используете конфигурационный файл ssh? Например: «LocalForward localhost: 64160 192.168.1.56:3389»
эффект
Для меня добавление ведущего ":" работает так, чтобы команда в вашем случае выглядела так: ssh -f root@192.168.0.18 -L: 51005: 127.0.0.1: 51005 -N
valentt
9

Я бы сначала попробовал это.

$ ssh -L 7000:127.0.0.1:7000 user@host -N -v -v

Вы можете использовать «-v» до 3 раз, чтобы увеличить детализацию.

Я думаю, что это сообщение об ошибке может появиться, если брандмауэр блокирует порт 7000, но вы уже исключили это. (Если более поздние читатели не исключают этого, посмотрите на вывод netstat --numeric-ports.)

Я думаю, что я мог видеть это сообщение об ошибке давным-давно, когда ssh впервые узнал об адресах IPV6 после обновления. Я могу ошибаться по этому поводу. Если вы хотите поэкспериментировать, попробуйте адрес обратной связи IPV6 «0: 0: 0: 0: 0: 0: 0: 1» (или «:: 1»).

Майк Шеррилл 'Cat Recall'
источник
3

"... очевидно, localhost не понравился удаленному хосту. Тем не менее, удаленный / etc / hosts содержит:"

За исключением того, что вы запускали ssh на клиенте, поэтому localhost не понравился вашему клиенту. Удаленный файл / и т.д. / хосты для удаленных , соединяющими из не входящих соединений.

бильбо бэггинс
источник
1
это также смущало меня. Когда вы набираете localhost в своей локальной машине, это решается локально
Ахмедов
3

Я столкнулся с этой же ошибкой при попытке подключиться к mysql на другом сервере через туннель ssh. Я обнаружил, что параметр bind-address в /etc/my.cnf на целевом сервере был связан с моим внешним ip (двойной NIC-сервер), а не внутренним, который я не использовал.

Когда я установил bind-address = 127.0.0.1, я мог успешно использовать мой ssh-туннель следующим образом:

ssh -N -f -L 3307:127.0.0.1:3306 user@server.name

mysql -h 127.0.0.1 --port=3307 --protocol=TCP -uusername -ppassword
Том МакКуарри
источник
Это сработало и для меня. Вы можете привязать MySQL только к одному адресу.
leeand00
3

Я столкнулся с этой ошибкой, когда переадресовывал порты с полным доменным именем вместо localhost:

ssh -L 5900:host.name.com:5900 x11vnc

Порт открывался только для localhost, поэтому, чтобы принимать соединения с полностью определенным именем, мне пришлось добавить описание связывающего порта :

ssh -L *:5900:host.name.com:5900 x11vnc

что позволило бы соединения из любого места (так что это не так безопасно, используйте его экономно).

cengique
источник
2

Для меня добавление ведущего ":" работает так, что команда в вашем случае будет выглядеть так:

ssh -L :7000:localhost:7000 user@host -N -v
valentt
источник
Слишком много времени прошло, и я не могу вернуться и проверить, но это выглядит великолепно.
Лоренцог
1

???

канал 2: открытие не удалось: подключение не удалось: подключение отказано

В user@hostэтом нет ничего слушать порт 7000, это просто , и это все.

poige
источник
1
Это не правда. На хосте работает служба: 7000. Я тоже пробовал с другими сервисами.
Лоренцог
2
Нет, тогда бы просто зависло соединение.
RickyA
4
@RickyA: На самом деле это не так. Если порт не привязан, соединение будет отклонено. Я получил эту ошибку от использования неправильного внутреннего порта (где не работала служба), ошибка исчезла, когда я исправил ошибку. Poige прав в том, что если ничего не слушает порт, это вызовет ошибку.
эр
1

Я получил то же сообщение об ошибке:

канал 3: не удалось открыть: не удалось установить соединение: соединение отклонено

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

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

Рой Бахуми
источник
В моем случае: это именно то, что я делал. Такая глупая ошибка, но этот ответ потребовал, чтобы я проверил порт. Doh.
Кен Шарп,
1

Для меня я пытался, ssh -L <port>:<remote server IP>:<port> <login>@<remote server IP>когда я должен был сделать ssh -L <port>:127.0.0.1:<port> <login>@<remote server IP>.

Я надеюсь, что это поможет кому-то!

ryanwc
источник
1

Альтернативная интерпретация - в моем случае, вы печатаете неправильно.

user@host ~ $ ssh -vvvNL 4444:127.0.0.0.1:4444
...
channel 2: open failed: connect failed: Name or service not known

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

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

Hincor
источник