接続拒否エラーの理由は何ですか?


114

別のクライアントを使用してCでサーバープログラムを作成しようとしています。たとえば、ポート2080を介して接続しようとすると、このエラーが発生します。

connection refused

このエラーの原因は何ですか?


私のウェブサイトをホストしているサーバーのミスが原因で、このエラーが発生しました。サーバーは引き続きping編集可能であり、downforeveryoneorjustme.comはそれが私だけではなく、FTP経由でもアクセスできることを示しました。数分後、間違いは解決されました。
Martin Thoma 14

2
@moose:pingは、特定のポートがアクセス可能でリスニング可能かどうかを通知するのではなく、IPアドレスが到達可能かどうかを通知するだけです。ただしconnect()、特定のIPとポートが使用できる状態であるかどうかに依存します。
レミールボー・

サーバー障害には、接続拒否に関する標準的な質問があります
Raedwald

接続拒否の簡単な説明は次のとおりです。
rbinnun

「localhost」で接続を受信しようとしたが、「localhost」が自分のマシンで適切に構成されていなかったため、Ubuntuで接続が拒否されました。'localhost'を ''(Python)に変更すると、問題が解決しました。
user1097111

回答:


93

多くの理由が考えられますが、最も一般的な理由は次のとおりです。

  1. ポートが宛先マシンで開いていません。

  2. 宛先マシンでポートが開いていますが、保留中の接続のバックログがいっぱいです。

  3. クライアントとサーバー間のファイアウォールがアクセスをブロックしています(ローカルファイアウォールも確認してください)。

ファイアウォールをチェックし、ポートが開いていることを確認したら、Telnetを使用してIP /ポートに接続し、接続をテストします。これにより、潜在的な問題がアプリケーションから削除されます。


7
接続(SYN)パケットは破棄されるだけなので、ファイアウォールは通常タイムアウトエラーを出します。接続が拒否されたのは、サーバーがSYNパケットを受信して​​拒否したためです。
RedPandaCurios 2010

15
パケットをドロップするのではなく拒否するようにファイアウォールを構成できるため、常にではありません。
2010

CONNECT()クライアント・プログラムに誤ったサーバーのIPアドレスとポート番号の設定にもerrnoに111になります
smRaj

さらに、httpsにアクセスする必要があるが、http:// ...を指定した場合にも、このエラーが発生する可能性があります。
Fico 2015

4
@ a'rバックログのステータスはどのようにしてわかりますか?
Naveen Verma

75

エラーは、リスニングソケットのOSがインバウンド接続要求を認識したが、意図的に拒否することを選択したことを意味します。

中間ファイアウォールが邪魔にならないと仮定すると、OSがインバウンド接続要求を拒否する理由は2つだけです(私が知っています)。1つの理由はすでに何度か言及されています-接続されているリスニングポートが開いていません。

まだ言及されていない別の理由があります-リスニングポートは実際に開いており、アクティブに使用されていますが、キューに入れられたインバウンド接続要求のバックログが最大に達したため、インバウンド接続要求をキューに入れるための空き容量がありません瞬間。サーバーコードは、新しいキューアイテムの使用可能なスロットのクリアを完了するのに十分な回数、accept()を呼び出していません。

しばらく待ってから、接続を再試行してください。残念ながら、「ポートがまったく開いていない」と「ポートは開いているがビジーである」を区別する方法はありません。どちらも同じ一般的なエラーコードを使用します。


4
ここで説明するように、1つのエッジケースもあります。softlab.ntua.gr / facilities / documentation / unix / unix-socket-faq / です。基本的に、クライアント/サーバーアプリのストレステストを行っていて、3.6で述べたような素朴なアプローチを使用している場合、「接続拒否」エラーが発生する可能性があり、上記の2つとは異なります。
ernesto 2014

これは賛成する必要があります。明白な原因(何も聞いていない)が解決されると、これが実際に最も可能性の高い説明であり、修正は複雑な問題になる可能性があります。
Graham Nicholls

キューに入れられたインバウンド要求のバックログが最大に達した場合、これをどのように修正できますか?
ACarter 2018年

バックログはIPによってキューに入れられますか?EC2インスタンスとローカルマシンからtelnet email-smtp.eu-west-1.amazonaws.com 25を使用してみましたが、EC2インスタンスのtelnetコールにより、ローカルマシンからの接続は拒否されました
dresh

「何もリッスンしていない」は、マシンが起動していることが原因である可能性がありますが、サーバー(ソフトウェア)、たとえばApacheが実行されていません。
ttulinsky

24

別のホストへのTCP接続を開こうとすると、「接続が拒否されました」というエラーが表示される場合は、

  1. TCP SYNパケットを他のホストに送信しました。
  2. 次に、返信でTCP RSTパケットを受け取りました。

RSTはTCPパケットのビットであり、接続をリセットする必要があることを示します。通常、これは他のホストが接続試行を受信し、TCP接続をアクティブに拒否していることを意味しますが、介在するファイアウォールがTCP SYNパケットをブロックし、TCP RSTを送信する場合があります。

https://tools.ietf.org/html/rfc793の 69ページを参照してください

SYN-RECEIVED状態

RSTビットが設定されている場合

この接続がパッシブOPENで開始された場合(つまり、LISTEN状態からのもの)、この接続をLISTEN状態に戻して戻ります。ユーザーに通知する必要はありません。この接続がアクティブなOPENで開始された(つまり、SYN-SENT状態から来た)場合、接続は拒否され、ユーザーに「接続拒否」を通知します。どちらの場合も、再送信キューのすべてのセグメントを削除する必要があります。アクティブなOPENの場合は、CLOSED状態に入り、TCBを削除して戻ります。


11

接続が拒否されたことは、接続しようとしているポートが実際に開いていないことを意味します。

そのため、間違ったIPアドレスまたは間違ったポートに接続しているか、サーバーが間違ったポートでリッスンしているか、実際には実行されていません。

よくある間違いは、ネットワークバイトオーダーでバインドまたは接続するときにポート番号を指定しないことです...


4
これは、エラーの原因となる可能性のあるいくつかの状態の1つにすぎません。
レミールボー

1
ポートは開いている可能性がありますが、このエラーは引き続き発生する可能性があります。
IgorGanapolsky

6

サーバー側で、ポート2080でリッスンしていることを確認します。まず、そのポートにtelnetを発行して、サーバーマシンでそれを確認します。

telnet localhost 2080

聞いていれば対応できます。


3

1.サーバーのステータスを確認します。

2.ポートの状態を確認します。

たとえば3306 netstat -nupl|grep 3306です。

3.ファイアウォールを確認します。たとえば、3306を追加します。

vim /etc/sysconfig/iptables
# add
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT

netstat -aが役立つ
Philip

1

状況には当てはまらないように見えますが、接続拒否エラーは、ネットワーク上でIPアドレスの競合があることを示している場合もあります。次のコマンドを実行すると、可能性のあるIPの競合を検索できます。

 arp-scan -I eth0 -l | grep <ipaddress>

そして

arping <ipaddress>

この AskUbuntuの質問には、さらに多くの情報があります。


0

チェックポイントファイアウォールの観点から見ると、アクションとして拒否を実際に選択すると、ファイアウォールのメッセージが表示され、サーバーの前にファイアウォールの存在が攻撃者にさらされます。ファイアウォールは、ポリシーに一致しないすべての接続を警告なしでドロップします。ほとんどの場合、サーバーからの接続拒否


0

職場のコンピューターでも同じ問題が発生します。問題は、localhostを入力すると、ローカルアドレスではなくプロキシのアドレスに移動し、次の手順に従ってバイパスする必要があることです。

Chrome =>設定=>プロキシ設定の変更=> LAN設定=>ローカルアドレスのプロキシサーバーをバイパスするを確認します。


0

Ubuntuでは、sudo ufw allow <port_number> サーバーとデータベースの両方へのファイアウォールアクセスを許可してください 。



0

私の場合、私の国でサイトがブロックされていて、VPNを使用していないときに発生します。たとえば、ブロックされているインドネシアからvimeo.comにアクセスしようとすると、


-1

まったく異なる原因で同じメッセージが表示されました:wsock32.dllが見つかりませんでした。::socket(PF_INET, SOCK_STREAM, 0);呼び出しが戻っままINVALID_SOCKETしかし理由は、Winsock DLLがロードされていなかったということでした。

結局、私はSysinternalsのプロセスモニターを起動し、「どこでも」dllを検索しましたが、見つからなかったことに気付きました。

サイレント障害は素晴らしいです!


1
INVALID_SOCKETは、「接続拒否」とは関係ありません。「サイレントエラー」は、コードに必要なエラー処理がない場合にのみ発生します。
ローン侯爵

1
DLLが読み込まれたことを確認する必要があったのでしょうか。あなたはおそらく正しいです。
xtofl 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.