ทำไมการหมดเวลา ssh ของฉันจึงแปรผันตามตำแหน่งเครือข่าย


15

เมื่อฉันเข้าสู่เซิร์ฟเวอร์สำนักงานของเรา (ซึ่งใช้ Fedora 10) จากที่บ้านเซสชันของฉันหมดเวลาหลังจากกิจกรรมที่ค่อนข้างสั้น (5 นาทีหรือมากกว่านั้น) ฉันได้ลองใช้TcpKeepAliveในฝั่งไคลเอ็นต์โดยไม่มีผลกระทบใด ๆ

สิ่งที่ฉันไม่เข้าใจคือถ้าฉันอยู่ในสำนักงานใน บริษัท LAN ฉันสามารถออกจากเซสชันที่ไม่ได้ใช้งานได้ทั้งวันโดยไม่ต้องหมดเวลาดังนั้นพฤติกรรมที่ดูเหมือนจะขึ้นอยู่กับตำแหน่งของฉัน

ความคิดใด ๆ ที่ทำให้เกิดเหตุการณ์นี้ขึ้นและวิธีป้องกันการหมดเวลาเมื่อไม่ได้ใช้ LAN ฉันกำลังใช้ไคลเอ็นต์ Terminal บน Mac OSX หากเป็นเช่นนั้น

UPDATE - ข้อเสนอแนะของ Dave Drager เกี่ยวกับการใช้ServerAliveIntervalชุดให้ไม่เป็นศูนย์TcpKeepAlive=noสำหรับฉัน เกี่ยวกับคำตอบอื่น ๆ การClientAliveตั้งค่า ... ไม่ได้รับการยอมรับจากไคลเอนต์ Mac OSX SSH

คำตอบ:


6

มีเขียนขึ้นที่ดีในการแก้ไขปัญหานี้คือที่นี่

พวกเขาแนะนำ:

ssh -o TCPKeepAlive=yes

หรือ:

ssh -o TCPKeepAlive=no -o ServerAliveInterval=15

อย่างไรก็ตามฉันมีปัญหาที่ไซต์งานของฉันซึ่งฉันถูกตัดการเชื่อมต่อจากเซสชันที่บ้านพวกเขาสบายดี ฉันเชื่อว่าไฟร์วอลของฉัน (SonicWall) อาจส่งเสียงรบกวนด้วย TCPKeepAlive อาจเป็นเพราะ NAT

SecureCRT ลูกค้า SSH ของฉันโชคดีที่มีตัวเลือกสำหรับโปรโตคอล "NO-OP" ซึ่งฉันเชื่อว่าโดยทั่วไปแล้วจะส่งคำสั่งที่ไม่ได้ทำอะไรกับเซิร์ฟเวอร์ ด้วยการเปิดใช้งานด้วยตนเองฉันสามารถเชื่อมต่อได้ ไม่แน่ใจว่าไคลเอ็นต์เทอร์มินัล MacOSX มีอะไรที่คล้ายกัน มีการเขียนเกี่ยวกับวิธีการใช้ "NO-OP" บนบรรทัดคำสั่ง

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


ขอบคุณเดฟ - ตัวเลือก ServerAliveInterval ใช้งานได้ดีมาก
gareth_bowles

@Dave ฉันได้ยินมาว่าผู้ดูแลระบบเซิร์ฟเวอร์บางคนหน้าบึ้งในการปฏิบัตินี้อาจเป็นได้ทั้ง (a) ความเสี่ยงด้านความปลอดภัยหรือ (b) โหลดเซิร์ฟเวอร์ที่ไม่ได้รับการรับรอง ข้อกังวลทั้งสองข้อนี้ถูกต้องหรือไม่ IYHO?
วันโจนาธาน

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

@Dave: ฉันป้อนคำสั่งนี้ แต่ได้รับการใช้งานต่อไปนี้: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spress] [-D [bind_address:] พอร์ต ฉัน pkcs11] [-i identity_file] [-L [bind_address:] พอร์ต: โฮสต์: hostport] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o ตัวเลือก] [-p พอร์ต] [-R [ bind_address:] พอร์ต: host: hostport] [-S ctl_path] [-W host: พอร์ต] [-w local_tun [: remote_tun]] [user @] ชื่อโฮสต์ [คำสั่ง]
1050619

การแก้ไขนี้ทำงานสำหรับ PuTTY เช่นกัน ตัวเลือกเดียวที่ฉันต้องตั้งค่าคือในการเชื่อมต่อ -> วินาทีระหว่าง Keepalive: 15. เซสชัน SSH มีชีวิตและดีกว่า 8 ชั่วโมง (Comcast) ในขณะที่มันจะตัดการเชื่อมต่อใน <30 นาที
Dan Dascalescu

2

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


ฉันทำ TcpKeepAlive ทางฝั่งไคลเอ็นต์ (ใน ~ / .ssh / config) ของฉัน - ฉันคิดว่านี่จะแก้ปัญหาไฟร์วอลล์ในเครื่อง แต่ก็ยังหมดเวลา
gareth_bowles

โดยค่าเริ่มต้นจะเป็น "เปิด" ที่ฝั่งเซิร์ฟเวอร์ แต่ให้ตรวจสอบ sshd_config เพื่อดูว่ายังไม่ได้ปิดใช้งาน
รัศมี

ไฟร์วอลล์บางตัวตัดการเชื่อมต่อการเชื่อมต่อ TCP หลังจากผ่านไประยะหนึ่งแม้จะไม่ได้ใช้งานก็ตาม
TomOnTime

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

นี่คือการตั้งค่าที่ฉันใช้ในการแก้ไข: TCPKeepAlive no, ClientAliveInterval 300, ClientAliveCountMax 3
แมตต์ซิมมอนส์

2

ฉันได้รับตลอดเวลานี้ในการเชื่อมต่อ Comcast ของฉัน ปัญหาคือช่วงเวลาการรักษาของไคลเอ็นต์ SSH ของคุณยาวเกินไปสำหรับการหมดเวลาที่กำหนดไว้ในเส้นทางเครือข่ายของคุณ หากคุณใช้ Linux คุณสามารถแก้ไขServerAliveIntervalและServerAliveCounterค่าให้ต่ำกว่าค่าเริ่มต้น ค่านี้ถูกตั้งค่าในไม่กี่วินาที แฟ้มปรับแต่งทั้งระบบพบ (โดยทั่วไป) /etc/ssh/ssh_configใน การตั้งค่าทั้งสองและTcpKeepAliveจะช่วยให้การเชื่อมต่อของคุณดำเนินต่อไป


1

เช่นเดียวกับรัศมีที่บอกว่าไฟร์วอลล์บางสถานะจะทำการ 'ลืม' การเชื่อมต่อหลังจากเวลาที่แน่นอน (โดยปกติจะกำหนดค่าได้) และจะไม่อนุญาตการสื่อสารเพิ่มเติมสำหรับการเชื่อมต่อ พวกเขาคาดหวังว่าการเชื่อมต่อจะเริ่มต้นด้วย TCP SYN (ฉันอ้างถึงการสื่อสาร SSH ของคุณที่นี่)

มีความเป็นไปได้อีกอย่างคือ เส้นทางเครือข่ายระหว่างบ้านและสำนักงานของคุณอาจมีการสูญเสีย (ของชนิดแพ็คเก็ต) เมื่อคุณพยายามพิมพ์บนไคลเอนต์ SSH หากลิงก์ของคุณหยุดทำงานชั่วขณะหนึ่งไคลเอ็นต์อาจยอมแพ้และล้มเหลว

การกำหนดค่า Keepalive บนไคลเอนต์จะจัดการกับกรณีแรกที่นี่ แต่ไม่สามารถช่วยในกรณีที่สอง ไฟร์วอลล์มักจะอยู่ในขอบเขตสำนักงานของคุณดังนั้นอาจกำหนดค่าได้ นั่นจะช่วยในจุดแรก

ในการตรวจสอบว่าคุณมีการสูญเสียลิงค์เป็นระยะคุณสามารถให้ 'ping' ทำงานในพื้นหลังจากเครื่องไคลเอนต์ของคุณ


0

นอกจากนี้คุณยังสามารถเพิ่มการตั้งค่าที่ผู้อื่นแนะนำเป็นค่าเริ่มต้นใน~/.ssh/configไฟล์ของคุณได้ดังนั้นคุณไม่จำเป็นต้องผ่านการตั้งค่าเหล่านี้sshทุกครั้งที่คุณเริ่มการเชื่อมต่อ:

nano ~/.ssh/config และเพิ่ม:

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