ssh_exchange_identification: การเชื่อมต่อถูกปิดโดยโฮสต์ระยะไกล (ไม่ได้ใช้ hosts.deny)


74

ฉันไม่ได้ใช้hosts.allowหรือhosts.denyยิ่งกว่านั้น SSH ยังทำงานได้จากเครื่อง windows ของฉัน (แล็ปท็อปเดียวกันฮาร์ดไดรฟ์อื่น) แต่ไม่ใช่เครื่อง Linux ของฉัน

ssh -vvv root@host -p port ให้:

OpenSSH_6.6, OpenSSL 1.0.1f 6 Jan 2014
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 20: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to host [host] port <port>.
debug1: Connection established.
debug1: identity file /home/torxed/.ssh/id_dsa type -1
debug1: identity file /home/torxed/.ssh/id_dsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.6
ssh_exchange_identification: read: Connection reset by peer

บนเครื่อง windows ทุกอย่างทำงานได้ดีดังนั้นฉันจึงตรวจสอบบันทึกการรักษาความปลอดภัยและบรรทัดที่มีเหมือนกันเซิร์ฟเวอร์ปฏิบัติกับ "เครื่อง" สองเครื่องที่แตกต่างกันไม่ต่างกันและพวกเขาทั้งคู่ได้รับอนุญาตผ่านการตรวจสอบกุญแจสาธารณะ ..

ดังนั้นจึงนำไปสู่ข้อสรุปว่านี่จะต้องเป็นปัญหากับแล็ปท็อป ArchLinux ในพื้นที่ของฉัน .. แต่อะไรนะ?

[torxed@archie ~]$ cat .ssh/known_hosts 
[torxed@archie ~]$ 

นั่นไม่ใช่ปัญหา ..

[torxed@archie ~]$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

ไม่มีข้อขัดแย้งกับการตั้งค่าไฟร์วอลล์ (ตอนนี้) ..

[torxed@archie ~]$ ls -la .ssh/
total 20
drwx------  2 torxed users 4096 Sep  3  2013 .
drwx------ 51 torxed users 4096 May 11 11:11 ..
-rw-------  1 torxed users 1679 Sep  3  2013 id_rsa
-rw-r--r--  1 torxed users  403 Sep  3  2013 id_rsa.pub
-rw-r--r--  1 torxed users  170 May 11 11:21 known_hosts

สิทธิ์ดูเหมือนว่าจะใช้ได้ (เหมือนกันบนเซิร์ฟเวอร์) .. นอกจากนี้ยังพยายามโดยไม่กำหนดค่า/etc/ssh/ssh_configด้วยผลลัพธ์เดียวกันยกเว้นการกำหนดค่าอัตโนมัติจำนวนมากดำเนินการในไคลเอนต์ซึ่งจบลงด้วยข้อผิดพลาดเดียวกัน


โปรดให้ผลลัพธ์iptables-save|grep -v '^#'ที่จะรวมถึงตารางอื่น ๆ (เช่นnatและmangle) หากพวกเขาว่างเปล่าเพียงระบุว่า iptablesผลลัพธ์ของคุณด้านบนคือการ จำกัด ตามfilterตารางเริ่มต้น นอกจากนี้บนเซิร์ฟเวอร์ SSH ให้รัน SSH บนพอร์ตทางเลือกเช่นนี้และให้ผลลัพธ์การดีบัก
0xC0000022L


อีกสองสิ่ง คุณต้องเชื่อมต่อกับอินสแตนซ์บนพอร์ตอื่น มิฉะนั้นคุณจะไม่สามารถเห็นปัญหาที่เป็นไปได้ สิ่งที่เกี่ยวข้องกับ Windows และ Linux เป็นหนึ่งในนั้นที่ใช้ IPv6 อาจจะ ( ip6tables-save)?
0xC0000022L

@ 0xC0000022L ฉันขอโทษเป็นอย่างยิ่ง ฉันเชื่อมต่อกับ IP ผิด .. กำลังรัน SSH บนพอร์ต 8080 นั่นคือสาเหตุที่ฉันได้รับปัญหานี้เมื่อเชื่อมต่อกับโฮสต์ที่ใช้งานเว็บแคชบนพอร์ต 8080> _ <
Torxed

1
เรื่องนี้เกิดขึ้นกับฉันเป็นระยะในขณะที่เซิร์ฟเวอร์ของฉันถูกโจมตีโดยผู้โจมตีบางคนพยายามที่จะใช้กำลัง sshd แก้ไขโดยการเพิ่มกฎไฟร์วอลล์เพื่อปล่อยการเชื่อมต่อจากผู้โจมตี
Andrew Hows

คำตอบ:


60

หากคุณได้พิจารณาปัจจัย "ภายนอก" ใด ๆ ชุดของขั้นตอนต่อไปนี้มักจะช่วยให้แคบลง ดังนั้นแม้ว่าสิ่งนี้จะไม่ตอบคำถามของคุณโดยตรง แต่อาจช่วยติดตามสาเหตุของข้อผิดพลาดได้

การแก้ไขปัญหา sshd

สิ่งที่ฉันพบโดยทั่วไปมีประโยชน์มากในกรณีเช่นนี้คือการเริ่มต้นsshdโดยไม่ปล่อยให้ดีมอน ปัญหาในกรณีของฉันคือการที่ค่าsyslogมิได้auth.logแสดงให้เห็นว่าอะไรที่มีความหมาย

เมื่อฉันเริ่มมันจาก terminal ฉันได้รับ:

# $(which sshd) -Ddp 10222
/etc/ssh/sshd_config line 8: address family must be specified before ListenAddress.

ดีกว่ามาก! ข้อความแสดงข้อผิดพลาดนี้ทำให้ฉันเห็นว่ามีอะไรผิดปกติและแก้ไขได้ ไม่มีไฟล์บันทึกที่มีเอาต์พุตนี้

หมายเหตุ:อย่างน้อยใน Ubuntu $(which sshd)เป็นวิธีที่ดีที่สุดเพื่อตอบสนองsshdความต้องการของเส้นทางที่แน่นอน sshd re-exec requires execution with an absolute pathมิฉะนั้นคุณจะได้รับข้อผิดพลาดต่อไปนี้: -p 10222ทำให้sshdฟังพอร์ตทางเลือกที่เอาชนะแฟ้มการกำหนดค่า - เป็นเช่นนี้ว่ามันไม่ได้ปะทะกับอาจเรียกใช้sshdอินสแตนซ์ อย่าลืมเลือกพอร์ตฟรีที่นี่

สุดท้าย: เชื่อมต่อกับพอร์ตทางเลือก ( ssh -p 10222 user@server)

วิธีนี้ช่วยฉันหลายครั้งในการค้นหาปัญหาไม่ว่าจะเป็นปัญหาการตรวจสอบหรือประเภทอื่น ๆ ในการรับเอาต์พุต verbose จริงๆให้stdoutใช้$(which sshd) -Ddddp 10222(จดบันทึกการเพิ่มddเพื่อเพิ่ม verbosity) man sshdสำหรับการแก้จุดบกพร่องการตรวจสอบความดีมากขึ้น


ฉันเชื่อมต่อกับ IP ที่ผิด แต่สิ่งนี้ทำให้ฉันไป .. สังเกตว่าไม่มีความพยายามในการเชื่อมต่อของฉันปรากฏขึ้นในผลลัพธ์ของการดีบัก ..
Torxed

2
$ (sshd) -Ddp 10222 ในที่สุดให้ฉันดูสิ่งที่ทำให้เกิดปัญหาของฉัน ขอบคุณมัด!
Cuga

9

นอกจากนี้คุณยังสามารถมีโฮสต์ที่หน่วยความจำมีการแยกส่วนอย่างรุนแรงซึ่งไม่สามารถจัดสรรหน้าหน่วยความจำที่ต่อเนื่องกันเพื่อแยกกระบวนการสำหรับการโฮสต์เซสชัน SSH

ในกรณีเช่นนี้คุณสามารถรับข้อความใดข้อความหนึ่งได้:

ssh_exchange_identification: read: Connection reset by peer

หรือ:

Connection closed by aaa.bbb.ccc.ddd

ขึ้นอยู่กับว่าโฮสต์ได้รับก่อนที่จะออกไปไกลแค่ไหน

หากการแตกแฟรกเมนต์หน่วยความจำเป็นสาเหตุที่ชัดเจนทางออกคือการเข้าถึงเซิร์ฟเวอร์ผ่านวิธีการอื่นและเพื่อเริ่มบริการที่เกี่ยวข้องบางส่วน ฉันได้พบ Apache และ MySQL เป็นผู้ร้ายใน VM เพราะ VM ไม่มี swap partition หากล้มเหลวให้รีบูตโฮสต์


6

ในกรณีนี้เพราะเกิดขึ้นกับฉัน ตรวจสอบให้แน่ใจว่าคุณมี sshd ทำงานอยู่ในโฮสต์!

มันเป็นความล้มเหลวที่โง่ แต่อาจเป็นปัญหาของคุณ


10
หากsshdไม่ได้ใช้การเชื่อมต่อจะไม่ถูกปิด แต่ปฏิเสธ (ลองssh -p someportwithoutsshd localhost)
Anthon

4
กรณีของฉันไม่ได้เชื่อมต่อโดยตรง ฉันสร้าง Reverse Tunnel ไปยังเครื่องที่ไม่ฟังและนั่นคือผลลัพธ์ในการเชื่อมต่อไคลเอ็นต์ ssh
txomon

1
โง่ฉันยังไม่ทราบว่าผมไม่ได้มี sshd ใด ๆ ที่ทำงานคงได้โดยการติดตั้งเซิร์ฟเวอร์ openssh
ไบรอัน Estrito

4

ฉันพบว่าข้อผิดพลาดนี้เกิดจากการเกินเซสชัน ssh ไปยังเซิร์ฟเวอร์ ฉันพบโฮสต์ที่พยายามเชื่อมต่อและฆ่าเซสชันทั้งหมดจากลูกค้าทั้งหมด ปัญหาได้รับการแก้ไขหลังจากล้างเซสชันทั้งหมด


20
คุณทำได้อย่างไร?
ยกเลิก

4
คุณทำได้อย่างไร? ปิง ...
knocte

วิธีหนึ่งคือการค้นหาเซสชันเปิดโดยใช้whoและฆ่ากระบวนการของผู้ใช้
Flatron

วิธีฆ่าเซสชัน ssh: unix.stackexchange.com/questions/127571/…
Tejas Kale

4

ฉันพบssh_exchange_identification: read: Connection reset by peerปัญหาในสคริปต์ที่เริ่ม 16 เซสชันขึ้นไปในการวนซ้ำ เห็นได้ชัดว่า sshd ติดตามไม่ได้; การเพิ่มการนอนหลับระยะสั้นช่วยแก้ปัญหาของฉันได้:

for i in $(seq 32)
do
    ssh -f root@$HOST "./test_server -p $(expr $BASE_PORT + $i)" > svr${i}.out
    # for > 8 connections, ssh has ssh_exchange_identification issues
    sleep 0.1
done

3

หรือคุณอาจทำสิ่งที่ฉันทำเมื่อคืนและลบ / var / ว่างเปล่า เห็นได้ชัดว่าไดเรกทอรีและการอนุญาตมีความสำคัญต่อการทำงานของ sshd และจะไม่สร้างไดเรกทอรีใหม่เมื่อเริ่มต้นใหม่ /etc/init.d/sshdจะล้มเหลวในการเริ่มต้นใหม่และไม่มีอะไร systemd จะบอกคุณว่าทำไม

ฉันพบปัญหาด้วยการเรียกใช้ sshd ในเบื้องหน้า:

# /usr/sbin/sshd -Dd
  Missing privilege separation directory: /var/empty/sshd

การสร้างไดเรกทอรีขึ้นใหม่แก้ปัญหาในกรณีของฉัน:

drwxr-xr-x. root root  /var/empty
drwx--x--x. root root  /var/empty/sshd

หมายเหตุถึงโปรแกรมเมอร์ Linux: สิ่งที่สำคัญอย่างยิ่งใน/var/empty... จริงๆ ???


ls -ld /var/emptyls: cannot access '/var/empty': No such file or directory→ ดังนั้นการกระจายอย่างน้อยหนึ่งครั้งก็ทำได้โดยสิ้นเชิง ดูที่/etc/init.d/sshdสคริปต์ดูเหมือนว่าอย่างน้อยใน Debian ไดเรกทอรีการแบ่งสิทธิพิเศษจะ/var/run/sshdถูกสร้างขึ้นในเวลาเริ่มต้นหากยังไม่มีอยู่
roaima

1

ฉันได้รับข้อผิดพลาดssh_exchange_identification: Connection closed by remote hostเมื่อพยายามเชื่อมต่อกับ SSH: ฉันได้ส่งต่อพอร์ตระยะไกลสำหรับพอร์ต 22 SSH ของคอมพิวเตอร์ท้องถิ่นของฉันเพื่อให้ฉันสามารถเข้าถึงได้ชั่วคราวจากเซิร์ฟเวอร์ระยะไกลบนอินเทอร์เน็ต

ในความเป็นจริงข้อผิดพลาดแสดงเพียงเพราะฉันไม่ได้จำได้ว่าผมปิดการใช้งานบริการ SSH ในการเริ่มต้นเพื่อให้ฉันได้เริ่มให้บริการ SSH sudo service ssh startบนเครื่องคอมพิวเตอร์ของเรา


1
ขอบคุณคุณช่วยชีวิตฉันไว้
Al Kasih

0

สิ่งแรกแรก; telnet ไปยังที่อยู่ IP ของโฮสต์เพื่อตรวจสอบว่าพอร์ต 22 กำลังฟัง (เปิด) จริง ๆ บนโฮสต์นั้นหรือไม่:

telnet x.x.x.x 22

(ถ้าไม่เช่นนั้นคุณอาจขอสายคอนโซลเพื่อเข้าสู่ระบบ)

ในกรณีของฉันมันไม่ทำงานและฉันเชื่อมต่อสายคอนโซลเพื่อเข้าสู่ระบบ เมื่อฉันลงชื่อเข้าใช้ฉันพบว่า VTY ทั้ง 5 สายไม่ว่างบนโฮสต์นั้น (เราเตอร์ Cisco)

ฉันล้างการเชื่อมต่อเก่าที่แขวนอยู่ที่นั่นเพื่อเพิ่มบรรทัด VTY มันใช้งานได้ ฉันเพิ่มคำสั่ง "exec-timeout 15" ภายใต้บรรทัด VTY จากนั้นฉันก็ถอดสายคอนโซลออก

บทเรียน:

ตรวจสอบให้แน่ใจว่าได้ตั้งค่าการหมดเวลา 5-10 นาทีในอุปกรณ์ทั้งหมดของคุณ - (หากตรวจไม่พบกิจกรรม)


2
ในกรณีดังกล่าวคุณจะได้รับ“ การเชื่อมต่อถูกปฏิเสธ” เหมือนกับคำตอบอื่นโดยนัยไม่ใช่“ การเชื่อมต่อสร้างขึ้น” ตามด้วย“ การเชื่อมต่อรีเซ็ตโดยเพียร์”
Jeff Schaller

1
การมี telnet ให้พร้อมใช้งาน (daemon กำลังฟังสำหรับ telnet) เป็นข้อบกพร่องด้านความปลอดภัยที่ค่อนข้างรุนแรงข้อบกพร่องที่เป็นสาเหตุหลักที่ ssh คือรีโมตคอนโซลที่ต้องการ
Xalorous

การใช้ไคลเอ็นต์ telnet เพื่อสอบสวน ssh daemon ที่พอร์ต 22 ไม่ใช่ข้อบกพร่องด้านความปลอดภัย การใช้ไคลเอ็นต์ telnet เพื่อเชื่อมต่อกับ telnet daemon ที่พอร์ต 23 เป็นข้อบกพร่องด้านความปลอดภัย
Dan Anderson

0

กรณีของฉันตั้งซ็อกเก็ตพร็อกซีผิดพลาด (ซึ่งไม่ทำงาน) ฉันได้เอาท์พุท ssh -vvv เดียวกันและบันทึก sshd ที่ว่างเปล่า


0

ข้อผิดพลาดssh_exchange_identification: Connection closed by remote hostสามารถเกิดขึ้นได้ด้วยเหตุผลที่ไม่ทราบสาเหตุ เมื่อฉันถูกใช้รหัส Visual Studio ข้อผิดพลาดเดียวกันเกิดขึ้นเมื่อฉันพยายามดึงจาก repo ระยะไกลโดยใช้git pullคำสั่ง

ฉันเพิ่งปิดเทอร์มินัลฝังตัวและเปิดเทอร์มินัลของ Ubuntu แล้วดึงอีกครั้ง และมันก็ประสบความสำเร็จ


0

จากที่มีCentOS Linux release 7.4.1708 (Core)กับOpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017เบื้องหลังการเชื่อมต่อไม่ได้กรองพอร์ตผมมี:

ssh_exchange_identification: การเชื่อมต่อถูกปิดโดยโฮสต์ระยะไกล

และปรากฎว่า Raspberry Pi ของฉันถูกปิด!

ฉันคิดว่าโฮสต์ที่ไม่ได้เปิดจะทำให้เกิดข้อผิดพลาด "ไม่มีเส้นทางไปยังโฮสต์" Raspberry Pi อยู่หลังเราเตอร์ ISP ของฉันดังนั้นอาจเป็นไปได้ว่าเป็นการปิดการเชื่อมต่อ

จากนั้นฉันก็ทำการทดลองซ้ำ (พยายามเชื่อมต่อกับ Raspberry Pi ที่ปิดการเชื่อมต่อ) จากการเชื่อมต่ออินเทอร์เน็ตอื่นยังไม่ได้กรองพอร์ตด้วย Debian Stretch ด้วยOpenSSH_7.4p1 Debian-10+deb9u3, OpenSSL 1.0.2l 25 May 2017และคราวนี้ฉันก็คาดหวังไว้:

ไม่มีเส้นทางไปยังโฮสต์

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