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


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.