ข้อ จำกัด ของมัลติเพล็กซิ่ง SSH


26

ฉันมีรายการต่อไปนี้ใน.ssh/configไฟล์ของฉัน

Host AAA
    User BBB
    HostName CCC
    ControlMaster auto
    ControlPath ~/.ssh/%r@%h:%p

ด้านบนช่วยให้ฉันสามารถคูณหลาย ssh เซสชันผ่านการเชื่อมต่อ ssh เดียวกันโดยไม่ต้องพิมพ์รหัสผ่านทุกครั้งที่ฉันต้องการเซสชันใหม่ (ตราบใดที่การเชื่อมต่อหลักยังคงเปิดอยู่)

อย่างไรก็ตามฉันสังเกตเห็นว่าเมื่อฉันมีจำนวนการเชื่อมต่อแบบมัลติเพล็กซ์ (~ 7) ค่อนข้างสูงฉันไม่สามารถเพิ่มเซสชันในการเชื่อมต่อแบบมัลติเพล็กซ์เดียวกันได้อีกและฉันเริ่มได้รับข้อผิดพลาดต่อไปนี้:

> ssh -X AAA

mux_client_request_session: session request failed: Session open refused by peer
Password: 

คำถามของฉัน:

เหตุใดฉันจึงได้รับข้อผิดพลาดนี้ มีการ จำกัด ใน # ของ ssh รอบที่ฉันสามารถ multiplex ในการเชื่อมต่อเดียวกันหรือไม่ ฉันสามารถเปลี่ยนขีด จำกัด นั้นได้หรือไม่ นั่นเป็นความคิดที่ไม่ดีเหรอ?


2
ฉันไม่สามารถตอบคำถามได้โดยตรง แต่สามารถให้คำแนะนำในการติดตามปัญหาได้ เนื่องจากเพียร์ปฏิเสธการเชื่อมต่อฉันจะเริ่มต้นด้วยการดูบันทึกในระบบที่คุณกำลังเชื่อมต่อ ดูว่า sshd ให้ข้อผิดพลาดใด ๆ ถ้าไม่เพิ่ม LogLevel แล้วลองอีกครั้ง หากคุณพบข้อความบันทึกที่ไม่ชัดเจนในทันทีและการค้นหาวลีไม่ช่วยคุณสามารถใช้ grep ในซอร์สโค้ด ข้อความแสดงข้อผิดพลาดมักจะถูกล้อมรอบด้วยชุดของเงื่อนไข - หนึ่ง (หรือบางส่วน) ไม่พบและนั่นเป็นสาเหตุที่ข้อความนี้เกิดขึ้น
Shawn J. Goff

คำตอบ:


26

sshdภูตบนเซิร์ฟเวอร์ที่มีการ จำกัด จำนวนครั้งของการต่อเชื่อมต่อเครือข่าย นี้จะถูกควบคุมโดยตัวเลือกในMaxSessions /etc/ssh/sshd_configนอกจากนี้ยังมีMaxStartupsตัวเลือกที่อาจจะต้องมีการเพิ่มขึ้นถ้าคุณใช้เป็นจำนวนมากของการประชุม (ดูman sshd_configรายละเอียดเพิ่มเติม) ตัวเลือกในการปรับเปลี่ยนMaxSessionsขีด จำกัดนั้นได้รับการแนะนำใน OpenSSH 5.1และดูเหมือนว่าหมายเลขนั้นได้รับการแก้ไขก่อนหน้านี้ที่ 10 ถ้าคุณเกินMaxSessionsเซิร์ฟเวอร์คุณจะเห็นsshd[####]: error: no more sessionsในบันทึกของเซิร์ฟเวอร์


4

ฉันพบปัญหานี้บนเซิร์ฟเวอร์ที่มี OpenSSH เวอร์ชันก่อนหน้า ฉันควบคุมเซิร์ฟเวอร์และฉันแก้ไขปัญหาด้วยการสร้าง CNAME สองรายการในการกำหนดค่าที่มีชื่อของฉัน:

realhost.myexample.com.      IN  A       XXX.XXX.XXX.XXX
realhost2.myexample.com.     IN  CNAME   realhost.myexample.com.
realhost3.myexample.com.     IN  CNAME   realhost.myexample.com.

จากนั้นในการกำหนดค่าลูกค้า SSH ท้องถิ่นของฉัน:

ControlMaster auto
ControlPath ~/.ssh/%r_%p_%h

host realhost
hostname realhost.myexample.com

host realhost2
hostname realhost2.myexample.com

host realhost3
hostname realhost3.myexample.com

คำสั่ง ControlPath คือชื่อซ็อกเก็ตควบคุมไม่ได้ก้าวต่อกัน

แค่นั้นแหละ แต่เพื่อให้ง่ายต่อการจัดการฉันได้เขียนสคริปต์ wrapper สำหรับ 'ssh' ที่ฝั่งไคลเอ็นต์ มันเข้าใจว่ามี 'กลุ่ม' ของโฮสต์ (ในกรณีนี้ realhost, realhost1, realhost2 ประกอบด้วยหนึ่งกลุ่ม) เมื่อออก 'sshwrapper realhost' หากไม่มีช่องเปิดทั้งสามจะเปิดขึ้นและจะเริ่มหนึ่งเซสชัน ครั้งต่อไปที่เปิดใช้งานจะนับการเชื่อมต่อที่เปิดต่อช่องและเปิดเซสชันใหม่ในช่องที่มีการเชื่อมต่อน้อยที่สุด

ด้วยโฮสต์ตัวจริงหนึ่งตัวและโฮสต์ปลอมสองตัวฉันสามารถเชื่อมต่อ 30 ครั้งก่อนได้รับข้อผิดพลาด การลงชื่อเข้าใช้นั้นเร็วมากยกเว้นเวลาเริ่มต้นใช้เวลาหนึ่งหรือสองวินาทีเนื่องจากช่องสัญญาณควบคุมทั้งสามจะเปิดขึ้นในเวลานั้น


สคริปต์ฟังดูเหมือนตัวบันทึกเวลาจริงและจะมีประโยชน์จริงๆ หากคุณยังมีอยู่คุณจะแบ่งปันให้กับสาธารณะหรือไม่?
thefourtheye

ฉันไม่แน่ใจว่ามันเหมาะสมที่นี่เนื่องจากไม่ใช่คำตอบของคำถาม นอกจากนี้ฉันเพิ่งเขียนเพื่อตัวเองและมันทำงานบนไคลเอนต์ Mac (เพื่อเข้าสู่เซิร์ฟเวอร์ Linux ของฉัน) โค้ดแยกวิเคราะห์เอาต์พุต 'ps' และจะต้องเปลี่ยนเพื่อให้ทำงานบน Linux เนื่องจากไวยากรณ์ 'ps' แตกต่างกัน
joe

ยุติธรรมพอสมควร ขอบคุณที่แบ่งปันแนวคิดทั่วไป
thefourtheye

ฉันวางสคริปต์ไว้ที่ moosiefinance.com:8081/sshm.zip
joe

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