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

Внезапно (читай: без изменения каких-либо параметров) моя виртуальная машина 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.

Идеи..?

15 ответов

Решение

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

$ 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рп я надел:)

Хотя проблема 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 должен быть в квадратных скобках.

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

$ 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").

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

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

Я столкнулся с этой же ошибкой при попытке подключиться к 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

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

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

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

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: я дополняю это, чтобы у нас был полный список возможных проблем при устранении тех же симптомов.

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

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

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

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

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

???

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

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

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

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

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

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

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

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

В интересах других, которые допустили такую ​​​​глупую ошибку, как я (которая не упоминается в других ответах): убедитесь, что на вашем удаленном компьютере действительно есть процесс, прослушивающий порт, к которому вы пытаетесь туннелировать!

Как говорит @Kenster здесь:

Когда вы подключаетесь к порту 8783 в вашей локальной системе, это соединение туннелируется через ваш ssh-ссылка на ssh-сервер на server.com. Оттуда ssh-сервер устанавливает TCP-соединение с портом 8783 локального хоста и передает данные между туннельным соединением и соединением с целью туннеля. Ошибка «соединение отклонено» исходит от ssh-сервера на server.com, когда он пытается установить TCP-соединение с целью туннеля. «Соединение отклонено» означает, что попытка подключения отклонена. Самое простое объяснение отклонения состоит в том, что на сервере server.com ничего не прослушивает соединения через порт 8783 локального хоста. Другими словами, серверное программное обеспечение, к которому вы пытались туннелировать, не запущено, или оно работает, но работает не прослушивает этот порт.

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

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

      sudo lsof -i -P -n | grep LISTEN
sudo netstat -tulpn | grep LISTEN
sudo ss -tulpn | grep LISTEN

Если ваша командаssh -L -N 7000:127.0.0.1:6000 user@hostи вы не видите ничего прослушивающего на 6000, тогда это ваша проблема - вам нужно выяснить, почему процесс не прослушивает порт или тот порт, который вы ожидаете.

Отсутствует IP-адрес --ip=n.n.n.nв конце строки. Вы должны указать, с каким именно IP подключаться.

Для меня работало переключение порядка команд.

Так что в основном -

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

Странный

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

Другие вопросы по тегам