อะไรเป็นสาเหตุของข้อความ 'ปฏิเสธการเชื่อมต่อ'


110

นี่เป็นคำถามที่ยอมรับได้เกี่ยวกับการเชื่อมต่อที่ถูกปฏิเสธ

เราเห็นคำถามมากมายเกี่ยวกับผลกระทบ

เมื่อฉันพยายามเชื่อมต่อกับระบบฉันได้รับข้อความ

การเชื่อมต่อถูกปฏิเสธ

ทำไมนี้


2
เราได้รับมากใน Apache Hadoop ซึ่งมักจะเกิดจากข้อผิดพลาดการกำหนดค่าในไคลเอนต์: โฮสต์ที่จะพูดคุยกับสิ่งที่พวกเขาตั้งค่า DNS หรือ / etc / โฮสต์ตารางหรือไม่ตรงกันระหว่างพอร์ตที่ใช้โดย บริการและที่ลูกค้าคิดว่าควรใช้ ดังนั้นเราจึงมีรายการ wiki เฉพาะในหัวข้อ ปัญหาหลายอย่างน่าจะอยู่ที่อื่นแม้ว่าจะมีขนาดเล็กกว่าก็ตาม การดีบักปัญหาการเชื่อมต่อในคลัสเตอร์ 1,000 โหนดนั้นไม่สนุก
Steve Loughran

ลิงก์รายการ wiki เฉพาะของคุณชี้ไปที่คำถามนี้)
user9517

1
จับดี. นี่คือการเชื่อมโยงอย่างเป็นทางการ: wiki.apache.org/hadoop/ConnectionRefused ฉันจะเพิ่มการอ้างอิงโยงย้อนกลับจากตรงนั้นถึงที่นี่สำหรับการวนซ้ำเต็มนั้น
Steve Loughran

@SteveLoughran บทความยอดนิยม - หนึ่งความคิดเห็น - ลิงก์กลับพูดว่า Stack Overflow และเราเป็น Server Fault;)
user9517

เสร็จแล้ว FWIW ลิงก์ wiki นั้นถูกเพิ่มเข้าไปในข้อยกเว้น ConnectionRefused ที่ส่งผ่านในสแต็ก Hadoop พร้อมกับข้อมูลเพิ่มเติม (โฮสต์พอร์ต) ที่จำเป็นในการแก้ไขสิ่งที่ผิดพลาด เรายังได้รับรายงานข้อผิดพลาดมากมายจากผู้ที่เห็นการติดตามสแต็กและไม่ติดตามลิงก์ไปยังวิกิ
Steve Loughran

คำตอบ:


118

หมายเหตุ : ข้อความนี้เป็นอาการของปัญหาที่คุณพยายามแก้ไข การทำความเข้าใจสาเหตุของข้อความในที่สุดจะนำคุณไปสู่การแก้ปัญหาของคุณ

ข้อความ 'การเชื่อมต่อที่ถูกปฏิเสธ' มีสองสาเหตุหลัก:

  1. ไม่มีสิ่งใดรับฟังบน IP: พอร์ตที่คุณพยายามเชื่อมต่อ
  2. พอร์ตถูกบล็อกโดยไฟร์วอลล์

ไม่มีกระบวนการรับฟัง

นี่คือสาเหตุที่พบบ่อยที่สุดสำหรับข้อความ ก่อนอื่นให้แน่ใจว่าคุณกำลังพยายามเชื่อมต่อกับระบบที่ถูกต้อง หากคุณต้องการตรวจสอบว่านี่เป็นปัญหาหรือไม่บนระบบรีโมตให้รันnetstatหรือss 1เช่นหากคุณคาดหวังว่ากระบวนการจะรับฟังพอร์ต 22222

sudo netstat -tnlp | grep :22222

หรือ

ss -tnlp | grep :22222

สำหรับ OSX คำสั่งที่เหมาะสมคือ

sudo netstat -tnlp tcp | grep '\.80 '

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

หากคุณไม่สามารถเข้าถึงระบบรีโมตและต้องการยืนยันปัญหาก่อนที่จะรายงานไปยังผู้ดูแลระบบที่เกี่ยวข้องคุณสามารถใช้ tcpdump (wireshark หรือคล้ายกัน)

เมื่อพยายามเชื่อมต่อกับ IP: พอร์ตที่ไม่มีสิ่งใดรับฟังการตอบสนองจากระบบรีโมตไปยังแพ็กเก็ต SYN เริ่มต้นคือแพ็กเก็ตที่ตั้งค่าสถานะ RST, ACK นี่เป็นการปิดการเชื่อมต่อและทำให้ข้อความปฏิเสธการเชื่อมต่อเช่น

$ sudo tcpdump -n โฮสต์ 192.0.2.1 และพอร์ต 22222
tcpdump: ระงับเอาต์พุต verbose, ใช้ -v หรือ -vv สำหรับการถอดรหัสโปรโตคอลเต็ม
ฟัง enp14s0, ลิงค์ประเภท EN10MB (Ethernet), ขนาดการจับภาพ 262144 bytes

12: 31: 27.013976 192.0.2.2.34390> 192.0.2.1.22222: Flags [S] , seq 1207858804, ชนะ 29200, ตัวเลือก [mss 1460, sackOK, TS val 15306344 ecr 0, nop, wscale 7], ความยาว 0

12: 31: 27.020162 IP 192.0.2.1.22222> 192.0.2.2.34390: Flags [R. ] , seq 0, ack 1207858805, ชนะ 0, ความยาว 0

โปรดทราบว่า tcpdump ใช้ เพื่อแทนค่าสถานะACK

พอร์ตถูกบล็อกโดยไฟร์วอลล์

หากพอร์ตถูกบล็อกโดยไฟร์วอลล์และไฟร์วอลล์ได้รับการกำหนดค่าให้ตอบกลับicmp-port-unreachableสิ่งนี้จะทำให้ข้อความปฏิเสธการเชื่อมต่อ คุณสามารถเห็นสิ่งนี้อีกครั้งด้วย tcpdump (หรือคล้ายกัน)

$ sudo tcpdump -n icmp
tcpdump: ระงับเอาต์พุต verbose, ใช้ -v หรือ -vv สำหรับการถอดรหัสโปรโตคอลแบบเต็ม

ฟัง enp14s0, ลิงค์ประเภท EN10MB (Ethernet), ขนาดการจับ 262144 ไบต์ 13: 03: 24.149897 IP 192.0.2.1> 192.0 2.2: ICMP 192.0.2.1 พอร์ต tcp 22222 เข้าไม่ถึงความยาว 68

โปรดทราบว่าสิ่งนี้จะบอกเราว่าไฟร์วอลล์บล็อกอยู่ที่ไหน


ดังนั้นตอนนี้คุณรู้ว่าสิ่งที่ทำให้ข้อความปฏิเสธการเชื่อมต่อคุณควรดำเนินการที่เหมาะสมเช่นติดต่อผู้ดูแลระบบไฟร์วอลล์หรือตรวจสอบสาเหตุของกระบวนการที่ไม่ฟัง

1มีเครื่องมืออื่นที่มีให้ใช้งาน


2
เวอร์ชั่น ELI5: มันหมายถึงการร้องขอการเชื่อมต่อไปยังคอมพิวเตอร์เครื่องอื่นและคอมพิวเตอร์เครื่องอื่นไม่มีสิ่งที่คุณพูดถึง
Immibis

"ไม่มีกระบวนการฟังอยู่" เหตุผลสำคัญ .. !
Samitha Chathuranga

ในกรณีของฉันมีบางอย่างกำลังฟัง ... แต่บนโหนดอื่นที่ฉันพยายามเชื่อมต่อ อุ่ย
ijoseph

1
@ijoseph ดังนั้นไม่มีอะไรฟังแล้ว
user9517

5

สำหรับฉันใน Debian 6 บีบมันง่ายเหมือนการตรวจสอบบริการ SSH :

sudo service ssh status

และค้นหาสิ่งที่ไม่มีอยู่ (พร้อมข้อความssh: unrecognized service) เพียงแค่ติดตั้งบริการ :

sudo apt-get install openssh-server

วิธีนี้ใช้ได้หากคุณไม่ได้รับการเชื่อมต่อ SFTP เนื่องจาก SFTP เป็นส่วนหนึ่งของ SSH (ในขณะที่ FTPS เป็นส่วนย่อยของ FTP)

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