Туннель 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. Как будто это произошло из-за того, что я пытался подключиться к нему слишком рано, и порты были перепутаны или что-то в этом роде.