อะไรคือสาเหตุของข้อผิดพลาดที่ปฏิเสธการเชื่อมต่อ?


114

ฉันกำลังพยายามเขียนโปรแกรมเซิร์ฟเวอร์ใน C โดยใช้ไคลเอนต์อื่นฉันได้รับข้อผิดพลาดนี้เมื่อพยายามเชื่อมต่อผ่านพอร์ต 2080 เช่น

connection refused

อะไรคือสาเหตุของข้อผิดพลาดนี้?


ฉันเพิ่งได้รับข้อผิดพลาดนี้เนื่องจากความผิดพลาดของเซิร์ฟเวอร์ที่ฉันโฮสต์เว็บไซต์ของฉัน เซิร์ฟเวอร์จะยังคงได้pingเอ็ดdownforeveryoneorjustme.comแสดงให้เห็นว่ามันไม่ใช่แค่ฉันและฉันจะยังคงเข้าถึงได้ผ่านทาง FTP หลังจากผ่านไปสองสามนาทีข้อผิดพลาดได้รับการแก้ไข
— Martin Thoma

2
@moose: ping ไม่ได้บอกคุณว่าพอร์ตที่เฉพาะเจาะจงสามารถเข้าถึงการฟังโฆษณาได้หรือไม่เฉพาะที่อยู่ IP เท่านั้นที่สามารถเข้าถึงได้ แต่connect()ขึ้นอยู่กับ IP เฉพาะและพอร์ตที่พร้อมใช้งาน
— Remy Lebeau

เซิร์ฟเวอร์ Fault มีคำถามที่บัญญัติเกี่ยวกับการปฏิเสธการเชื่อมต่อ
— Raedwald

นี่คือคำอธิบายสั้นของปฏิเสธการเชื่อมต่อ
— rbinnun

ฉันถูกปฏิเสธการเชื่อมต่อบน Ubuntu เนื่องจากฉันพยายามรับการเชื่อมต่อบน 'localhost' แต่ 'localhost' ไม่ได้รับการกำหนดค่าอย่างถูกต้องบนเครื่องของฉัน การเปลี่ยน 'localhost' เป็น '' (Python) ช่วยแก้ปัญหาได้
— user1097111

คำตอบ:


93

อาจมีสาเหตุหลายประการ แต่ที่พบบ่อยที่สุด ได้แก่ :

  1. พอร์ตไม่เปิดบนเครื่องปลายทาง

  2. พอร์ตเปิดอยู่บนเครื่องปลายทาง แต่ค้างของการเชื่อมต่อที่รอดำเนินการเต็ม

  3. ไฟร์วอลล์ระหว่างไคลเอนต์และเซิร์ฟเวอร์กำลังบล็อกการเข้าถึง (ตรวจสอบไฟร์วอลล์ในเครื่องด้วย)

หลังจากตรวจสอบไฟร์วอลล์และพอร์ตเปิดอยู่ให้ใช้ telnet เพื่อเชื่อมต่อกับ ip / port เพื่อทดสอบการเชื่อมต่อ วิธีนี้จะลบปัญหาที่อาจเกิดขึ้นจากแอปพลิเคชันของคุณ


7
โดยปกติไฟร์วอลล์จะให้ข้อผิดพลาดการหมดเวลาเนื่องจากแพ็คเก็ตการเชื่อมต่อ (SYN) จะถูกทิ้ง การเชื่อมต่อถูกปฏิเสธเนื่องจากเซิร์ฟเวอร์ได้รับและปฏิเสธแพ็กเก็ต SYN
— RedPandaCurios

15
ไม่เสมอไปเนื่องจากไฟร์วอลล์สามารถกำหนดค่าให้ปฏิเสธแทนที่จะปล่อยแพ็กเก็ต
— อา

เชื่อมต่อ () ด้วยที่อยู่ IP ของเซิร์ฟเวอร์ที่ไม่ถูกต้องและการกำหนดค่าหมายเลขพอร์ตในโปรแกรมไคลเอนต์จะส่งผลให้เกิดข้อผิดพลาด 111 ด้วย
— smRaj

นอกจากนี้: เมื่อคุณต้องการเข้าถึง https แต่คุณได้ระบุ http: // ... ข้อผิดพลาดนี้อาจเกิดขึ้นได้เช่นกัน
— Fico

4
@ a'r คุณจะทราบสถานะสินค้าค้างได้อย่างไร?
— Naveen Verma

75

ข้อผิดพลาดหมายความว่าระบบปฏิบัติการของซ็อกเก็ตการฟังรับรู้คำขอเชื่อมต่อขาเข้า แต่เลือกที่จะปฏิเสธโดยเจตนา

สมมติว่าไฟร์วอลล์ระดับกลางไม่เข้ามามีสาเหตุเพียงสองประการ (ที่ฉันรู้) ที่ระบบปฏิบัติการจะปฏิเสธคำขอเชื่อมต่อขาเข้า มีการพูดถึงเหตุผลหนึ่งหลายครั้งแล้ว - พอร์ตการรับฟังที่เชื่อมต่อไม่ได้เปิดอยู่

ยังมีอีกเหตุผลหนึ่งที่ยังไม่ได้กล่าวถึง - พอร์ตการฟังนั้นเปิดอยู่และมีการใช้งานอยู่ แต่การร้องขอการเชื่อมต่อขาเข้าที่ค้างอยู่ในคิวนั้นถึงขีดสุดแล้วดังนั้นจึงไม่มีที่ว่างสำหรับการร้องขอการเชื่อมต่อขาเข้าที่จะต้องเข้าคิวที่นั้น ช่วงเวลา. รหัสเซิร์ฟเวอร์ไม่ได้เรียกว่า accept () ครั้งเพียงพอที่จะเสร็จสิ้นการล้างช่องว่างสำหรับรายการคิวใหม่

รอสักครู่แล้วลองเชื่อมต่ออีกครั้ง น่าเสียดายที่ไม่มีวิธีแยกความแตกต่างระหว่าง "พอร์ตไม่ได้เปิดเลย" และ "พอร์ตเปิดอยู่ แต่ตอนนี้ยุ่งมาก" ทั้งสองใช้รหัสข้อผิดพลาดทั่วไปเดียวกัน


4
นอกจากนี้ยังมีกรณีหนึ่งขอบตามที่อธิบายไว้ที่นี่: softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/... โดยพื้นฐานแล้วหากคุณกำลังทดสอบแอปไคลเอนต์ / เซิร์ฟเวอร์ของคุณและคุณกำลังใช้วิธีการที่ไร้เดียงสาตามที่กล่าวไว้ในข้อ 3.6 ข้อผิดพลาด "การเชื่อมต่อถูกปฏิเสธ" อาจเกิดขึ้นและเป็นกรณีที่แตกต่างจากสองข้อข้างต้น
— ernesto

สิ่งนี้จะต้องได้รับการโหวต เมื่อสาเหตุที่ชัดเจน (ไม่มีอะไรฟัง) ได้รับการแก้ไขแล้วนี่เป็นคำอธิบายที่เป็นไปได้มากที่สุดและการแก้ไขอาจเป็นเรื่องที่ซับซ้อน
— Graham Nicholls

หากคำขอขาเข้าที่ค้างอยู่ในคิวถึงจำนวนสูงสุดแล้วเราจะแก้ไขได้อย่างไร
— ACarter

เป็นงานที่ค้างอยู่ในคิวโดย IP หรือไม่? ฉันลองใช้ telnet email-smtp.eu-west-1.amazonaws.com 25 จากอินสแตนซ์ EC2 และเครื่องในพื้นที่ของฉันการโทรผ่าน Telnet ของอินสแตนซ์ EC2 ให้การเชื่อมต่อถูกปฏิเสธในขณะที่เครื่องในพื้นที่ของฉันใช้งานได้
— 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:

สถานะที่ได้รับการซิงค์

หากตั้งค่าบิต RST

หากการเชื่อมต่อนี้เริ่มต้นด้วยการเปิดแบบพาสซีฟ (เช่นมาจากสถานะ LISTEN) ให้คืนการเชื่อมต่อนี้เป็นสถานะ LISTEN และส่งคืน ผู้ใช้ไม่จำเป็นต้องได้รับแจ้ง หากการเชื่อมต่อนี้เริ่มต้นด้วย OPEN ที่ใช้งานอยู่ (เช่นมาจากสถานะ SYN-SENT) การเชื่อมต่อถูกปฏิเสธให้ส่งสัญญาณว่าผู้ใช้ "การเชื่อมต่อถูกปฏิเสธ" ไม่ว่าในกรณีใดควรลบส่วนทั้งหมดในคิวการส่งข้อมูลซ้ำ และในกรณีเปิดที่ใช้งานอยู่ให้ป้อนสถานะปิดและลบ TCB และส่งคืน


11

การเชื่อมต่อถูกปฏิเสธหมายความว่าพอร์ตที่คุณพยายามเชื่อมต่อไม่ได้เปิดอยู่จริงๆ

ดังนั้นคุณกำลังเชื่อมต่อกับที่อยู่ IP ที่ไม่ถูกต้องหรือไปยังพอร์ตที่ไม่ถูกต้องหรือเซิร์ฟเวอร์กำลังฟังพอร์ตที่ไม่ถูกต้องหรือไม่ได้ทำงานจริง

ข้อผิดพลาดทั่วไปคือการไม่ระบุหมายเลขพอร์ตเมื่อเชื่อมโยงหรือเชื่อมต่อในลำดับไบต์ของเครือข่าย ...


4
นี่เป็นเพียงหนึ่งในเงื่อนไขที่เป็นไปได้หลายประการที่อาจทำให้เกิดข้อผิดพลาด
— Remy Lebeau

1
พอร์ตสามารถเปิดได้ แต่ข้อผิดพลาดนี้ยังคงเกิดขึ้น
— IgorGanapolsky

6

ตรวจสอบที่ฝั่งเซิร์ฟเวอร์ว่ากำลังฟังอยู่ที่พอร์ต 2080 ก่อนอื่นให้ลองยืนยันบนเครื่องเซิร์ฟเวอร์โดยการออก telnet ไปยังพอร์ตนั้น:

telnet localhost 2080

หากเป็นการฟังก็สามารถที่จะตอบสนอง


3

1. ตรวจสอบสถานะเซิร์ฟเวอร์ของคุณ

2. ตรวจสอบสถานะพอร์ต

ยกตัวอย่างเช่น netstat -nupl|grep 33063306

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

จากมุมมองของไฟร์วอลล์ Checkpoint คุณจะเห็นข้อความจากไฟร์วอลล์หากคุณเลือกปฏิเสธเป็นการดำเนินการจริงซึ่งจะเป็นการเปิดเผยต่อผู้โจมตีที่เกี่ยวข้องว่ามีไฟร์วอลล์อยู่ด้านหน้าเซิร์ฟเวอร์ ไฟร์วอลล์จะยกเลิกการเชื่อมต่อทั้งหมดที่ไม่ตรงกับนโยบายอย่างเงียบ ๆ การเชื่อมต่อถูกปฏิเสธมักจะมาจากเซิร์ฟเวอร์


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 ไม่มีส่วนเกี่ยวข้องกับ 'การเชื่อมต่อถูกปฏิเสธ' 'Silent failures' จะเกิดขึ้นได้ก็ต่อเมื่อรหัสของคุณไม่มีการจัดการข้อผิดพลาดที่จำเป็น
— Marquis of Lorne

1
คุณหมายความว่าฉันควรมีการตรวจสอบว่ามีการโหลด dll หรือไม่? คุณอาจจะใช่
— xtofl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.