「チャネル2:オープンに失敗しました」との接続を拒否するsshトンネル


70

突然(パラメータを変更せずに)読むと、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でも(リモート)Webサーバーに接続しようとしましたが、結果は同じです。

リモートホストは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を根付かせたのかもしれません。

アイデア..?


1
トラブルシューティングについては、を試してください$ ssh -L 7000:127.0.0.1:7000 user@host -N -v -v。(「-v」を最大3回使用して、冗長性を高めることができます。)また、sshが最近更新された可能性もありますか?
マイクシェリル 'キャットリコール'

貼り付けた出力ログは、すでに-vで収集されています。
ロレンツォグ

1
-vを最大3回使用して、冗長性を高めることができます。したがって、ssh -L 7000... -N -v -v(2つのv)またはの出力を確認できますssh -L 7000... -N -v -v -v
マイクシェリル 'キャットリコール'

@ 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

はぁ。私がつけた100rpの賞金のためにそんなに:)


1
あ。それでは、回答としてわざわざコメントを書きません。(sshがシステムでipv6アドレスを好むかどうかを調べます。)
マイクシェリル 'キャットリコール'

-vオプションを2倍にすることをお勧めしましたが、新しいことは何も表示されませんでした。しかし、数日後に再び出力を確認することで問題を特定できました。あなたが答えを書きたいなら、私はあなたに報奨金を与えることよりも幸せです。
ロレンツォグ

1
実際、重要なポイントは「localhost」を「127.0.0.1」に置き換えることでした。追加の「-v」引数は役に立つかもしれませんが、私が目指していたものではありませんでした。ありがとう。
マイクシェリル 'キャットリコール'

スーパーユーザーの投稿によると:superuser.com/questions/346971/ssh-tunnel-connection-refused 特定のアドレスでリッスンするように構成されたプログラムは、その特定のアドレスをリッスンします
jopasserat 14年

1
私にとって、先頭に「:」を追加すると、コマンドは次のようになります
。ssh

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:localhost: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アドレスは角括弧で囲む必要があります。


1
ssh構成ファイルを使用している場合はどうなりますか?例: "LocalForwardのはlocalhost:64160 192.168.1.56:3389"
meffect

私にとって、先頭に「:」を追加すると、コマンドは次のようになります。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")を試すことができます。


3

「...明らかに、「localhost」はリモートホストに好まれませんでした。しかし、リモートの/ etc / hostsには次のものが含まれています。」

クライアントでsshを実行していた場合を除き、「localhost」はクライアントに好かれていませんでした。リモート/ etc / hostsファイルは、リモート接続するためのものであるアウトしない着信接続。


1
それも私を混乱させました。あなたはLOCALMACHINEにlocalhostを入力すると、それがローカルに解決さ
Ahmedov

3

sshトンネル経由で別のサーバーのmysqlに接続しようとしたときに、同じエラーが発生しました。ターゲットサーバーの/etc/my.cnfのbind-addressパラメーターが、内部IPアドレスではなく、外部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は1つのアドレスにのみバインドできます。
leeand00

3

localhostではなく完全なドメイン名でポートを転送しているときにこのエラーが発生しました。

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

ポートはlocalhost専用に開かれているため、完全修飾名の接続を受け入れるには、バインドポートの説明を追加する必要がありました。

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

これにより、どこからでも接続できるようになります(安全ではないため、慎重に使用してください)。


2

私にとって先頭の「:」を追加すると、コマンドは次のようになります。

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

時間がかかりすぎて、戻って確認することはできませんが、これは素晴らしいようです。
ロレンツォグ

1

???

チャネル2:開くことに失敗しました:接続に失敗しました:接続が拒否されました

で、user@hostポート7000をリスニング何もない、それは簡単だし、それがすべてです。


1
それは真実ではない。host:7000で実行されているサービスがあります。他のサービスも試しました。
ロレンツォグ

2
いいえ、接続がハングするだけです。
リッキー

4
@RickyA:実際には、そうではありません。ポートがバインドされていない場合、接続は拒否されます。間違った内部ポート(サービスが実行されていない場所)を使用するとこのエラーが発生しましたが、間違いを修正するとエラーはなくなりました。poigeは、ポートで何もリッスンしていない場合にエラーが発生するという点で正しいです。
erb

1

同じエラーメッセージが表示されました。

チャネル3:開くことに失敗しました:接続に失敗しました:接続が拒否されました

そして、原因は人為的エラーでした-リモートホスト上の指定したポートとは異なるポートにアクセスしようとしました。

私はそれを共有すると思いましたが、これはおそらくあなたのほとんどがこのエラーを経験している理由ではないでしょう。


私の場合、これはまさに私がやっていたことです。このような愚かな間違いですが、ポートをチェックするのにこの答えが必要でした。ど
ケンシャープ

1

私のために、私はssh -L <port>:<remote server IP>:<port> <login>@<remote server IP>すべきだったときにしようとしていましたssh -L <port>:127.0.0.1:<port> <login>@<remote server IP>

これが誰かの助けになることを願っています!


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:これを補足するので、同じ症状のトラブルシューティングを行う際に考えられる問題の包括的なリストがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.