ฉันกำลังพยายามเขียนโปรแกรมเซิร์ฟเวอร์ใน C โดยใช้ไคลเอนต์อื่นฉันได้รับข้อผิดพลาดนี้เมื่อพยายามเชื่อมต่อผ่านพอร์ต 2080 เช่น
connection refused
อะไรคือสาเหตุของข้อผิดพลาดนี้?
connect()
ขึ้นอยู่กับ IP เฉพาะและพอร์ตที่พร้อมใช้งาน
ฉันกำลังพยายามเขียนโปรแกรมเซิร์ฟเวอร์ใน C โดยใช้ไคลเอนต์อื่นฉันได้รับข้อผิดพลาดนี้เมื่อพยายามเชื่อมต่อผ่านพอร์ต 2080 เช่น
connection refused
อะไรคือสาเหตุของข้อผิดพลาดนี้?
connect()
ขึ้นอยู่กับ IP เฉพาะและพอร์ตที่พร้อมใช้งาน
คำตอบ:
อาจมีสาเหตุหลายประการ แต่ที่พบบ่อยที่สุด ได้แก่ :
พอร์ตไม่เปิดบนเครื่องปลายทาง
พอร์ตเปิดอยู่บนเครื่องปลายทาง แต่ค้างของการเชื่อมต่อที่รอดำเนินการเต็ม
ไฟร์วอลล์ระหว่างไคลเอนต์และเซิร์ฟเวอร์กำลังบล็อกการเข้าถึง (ตรวจสอบไฟร์วอลล์ในเครื่องด้วย)
หลังจากตรวจสอบไฟร์วอลล์และพอร์ตเปิดอยู่ให้ใช้ telnet เพื่อเชื่อมต่อกับ ip / port เพื่อทดสอบการเชื่อมต่อ วิธีนี้จะลบปัญหาที่อาจเกิดขึ้นจากแอปพลิเคชันของคุณ
ข้อผิดพลาดหมายความว่าระบบปฏิบัติการของซ็อกเก็ตการฟังรับรู้คำขอเชื่อมต่อขาเข้า แต่เลือกที่จะปฏิเสธโดยเจตนา
สมมติว่าไฟร์วอลล์ระดับกลางไม่เข้ามามีสาเหตุเพียงสองประการ (ที่ฉันรู้) ที่ระบบปฏิบัติการจะปฏิเสธคำขอเชื่อมต่อขาเข้า มีการพูดถึงเหตุผลหนึ่งหลายครั้งแล้ว - พอร์ตการรับฟังที่เชื่อมต่อไม่ได้เปิดอยู่
ยังมีอีกเหตุผลหนึ่งที่ยังไม่ได้กล่าวถึง - พอร์ตการฟังนั้นเปิดอยู่และมีการใช้งานอยู่ แต่การร้องขอการเชื่อมต่อขาเข้าที่ค้างอยู่ในคิวนั้นถึงขีดสุดแล้วดังนั้นจึงไม่มีที่ว่างสำหรับการร้องขอการเชื่อมต่อขาเข้าที่จะต้องเข้าคิวที่นั้น ช่วงเวลา. รหัสเซิร์ฟเวอร์ไม่ได้เรียกว่า accept () ครั้งเพียงพอที่จะเสร็จสิ้นการล้างช่องว่างสำหรับรายการคิวใหม่
รอสักครู่แล้วลองเชื่อมต่ออีกครั้ง น่าเสียดายที่ไม่มีวิธีแยกความแตกต่างระหว่าง "พอร์ตไม่ได้เปิดเลย" และ "พอร์ตเปิดอยู่ แต่ตอนนี้ยุ่งมาก" ทั้งสองใช้รหัสข้อผิดพลาดทั่วไปเดียวกัน
หากคุณพยายามเปิดการเชื่อมต่อ TCP ไปยังโฮสต์อื่นและพบข้อผิดพลาด "การเชื่อมต่อถูกปฏิเสธ" แสดงว่า
RST เป็นบิตบนแพ็กเก็ต TCP ซึ่งระบุว่าควรรีเซ็ตการเชื่อมต่อ โดยปกติจะหมายความว่าโฮสต์อื่นได้รับความพยายามในการเชื่อมต่อของคุณและกำลังปฏิเสธการเชื่อมต่อ TCP ของคุณอย่างแข็งขัน แต่บางครั้งไฟร์วอลล์ที่แทรกแซงอาจบล็อกแพ็กเก็ต TCP SYN ของคุณและส่ง TCP RST กลับมาให้คุณ
ดูhttps://tools.ietf.org/html/rfc793หน้า 69:
สถานะที่ได้รับการซิงค์
หากตั้งค่าบิต RST
หากการเชื่อมต่อนี้เริ่มต้นด้วยการเปิดแบบพาสซีฟ (เช่นมาจากสถานะ LISTEN) ให้คืนการเชื่อมต่อนี้เป็นสถานะ LISTEN และส่งคืน ผู้ใช้ไม่จำเป็นต้องได้รับแจ้ง หากการเชื่อมต่อนี้เริ่มต้นด้วย OPEN ที่ใช้งานอยู่ (เช่นมาจากสถานะ SYN-SENT) การเชื่อมต่อถูกปฏิเสธให้ส่งสัญญาณว่าผู้ใช้ "การเชื่อมต่อถูกปฏิเสธ" ไม่ว่าในกรณีใดควรลบส่วนทั้งหมดในคิวการส่งข้อมูลซ้ำ และในกรณีเปิดที่ใช้งานอยู่ให้ป้อนสถานะปิดและลบ TCB และส่งคืน
การเชื่อมต่อถูกปฏิเสธหมายความว่าพอร์ตที่คุณพยายามเชื่อมต่อไม่ได้เปิดอยู่จริงๆ
ดังนั้นคุณกำลังเชื่อมต่อกับที่อยู่ IP ที่ไม่ถูกต้องหรือไปยังพอร์ตที่ไม่ถูกต้องหรือเซิร์ฟเวอร์กำลังฟังพอร์ตที่ไม่ถูกต้องหรือไม่ได้ทำงานจริง
ข้อผิดพลาดทั่วไปคือการไม่ระบุหมายเลขพอร์ตเมื่อเชื่อมโยงหรือเชื่อมต่อในลำดับไบต์ของเครือข่าย ...
ตรวจสอบที่ฝั่งเซิร์ฟเวอร์ว่ากำลังฟังอยู่ที่พอร์ต 2080 ก่อนอื่นให้ลองยืนยันบนเครื่องเซิร์ฟเวอร์โดยการออก telnet ไปยังพอร์ตนั้น:
telnet localhost 2080
หากเป็นการฟังก็สามารถที่จะตอบสนอง
1. ตรวจสอบสถานะเซิร์ฟเวอร์ของคุณ
2. ตรวจสอบสถานะพอร์ต
ยกตัวอย่างเช่น netstat -nupl|grep 3306
3306
3. ตรวจสอบไฟร์วอลล์ของคุณ ตัวอย่างเช่นเพิ่ม 3306
vim /etc/sysconfig/iptables
# add
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
แม้ว่าสถานการณ์ของคุณจะไม่เป็นเช่นนั้น แต่บางครั้งข้อผิดพลาดที่ปฏิเสธการเชื่อมต่ออาจบ่งชี้ว่ามีความขัดแย้งที่อยู่ IP ในเครือข่ายของคุณ คุณสามารถค้นหาความขัดแย้งของ ip ที่เป็นไปได้โดยเรียกใช้:
arp-scan -I eth0 -l | grep <ipaddress>
และ
arping <ipaddress>
คำถาม AskUbuntu นี้มีข้อมูลเพิ่มเติมด้วย
จากมุมมองของไฟร์วอลล์ Checkpoint คุณจะเห็นข้อความจากไฟร์วอลล์หากคุณเลือกปฏิเสธเป็นการดำเนินการจริงซึ่งจะเป็นการเปิดเผยต่อผู้โจมตีที่เกี่ยวข้องว่ามีไฟร์วอลล์อยู่ด้านหน้าเซิร์ฟเวอร์ ไฟร์วอลล์จะยกเลิกการเชื่อมต่อทั้งหมดที่ไม่ตรงกับนโยบายอย่างเงียบ ๆ การเชื่อมต่อถูกปฏิเสธมักจะมาจากเซิร์ฟเวอร์
ฉันพบปัญหาเดียวกันกับคอมพิวเตอร์ที่ทำงาน ปัญหาคือเมื่อคุณป้อน localhost มันจะไปที่ที่อยู่ของพร็อกซีไม่ใช่ที่อยู่ในเครื่องคุณควรข้ามไปตามขั้นตอนนี้
Chrome => การตั้งค่า => เปลี่ยนการตั้งค่าพร็อกซี => การตั้งค่า LAN => ตรวจสอบบายพาสพร็อกซีเซิร์ฟเวอร์สำหรับที่อยู่ในเครื่อง
ใน Ubuntu พยายาม
sudo ufw allow <port_number>
อนุญาตให้ไฟร์วอลล์เข้าถึงทั้งเซิร์ฟเวอร์และฐานข้อมูลของคุณ
พยายามส่งพารามิเตอร์พอร์ต "-p":
sudo iperf -c 127.0.0.1 -p 443
ในกรณีของฉันมันเกิดขึ้นเมื่อไซต์ถูกบล็อกในประเทศของฉันและฉันไม่ได้ใช้ VPN ตัวอย่างเช่นเมื่อฉันพยายามเข้าถึง vimeo.com จากอินโดนีเซียซึ่งถูกบล็อก
ฉันมีข้อความเดียวกันโดยมีสาเหตุที่แตกต่างกันโดยสิ้นเชิง: wsock32.dll
ไม่พบข้อความ การ::socket(PF_INET, SOCK_STREAM, 0);
โทรยังคงส่งคืนINVALID_SOCKET
แต่สาเหตุก็คือไม่ได้โหลดไฟล์ Winsock dll
ในที่สุดฉันก็เปิดตัวการตรวจสอบกระบวนการของ Sysinternals และสังเกตว่ามันค้นหา dll 'ทุกที่' แต่ไม่พบ
ความล้มเหลวเงียบดีมาก!
ping
เอ็ดdownforeveryoneorjustme.comแสดงให้เห็นว่ามันไม่ใช่แค่ฉันและฉันจะยังคงเข้าถึงได้ผ่านทาง FTP หลังจากผ่านไปสองสามนาทีข้อผิดพลาดได้รับการแก้ไข