วิธีการตั้งค่า ssh เพื่อลองพอร์ตไม่เพียง 22 แต่พอร์ตรองทุกครั้ง?


9

เป็นส่วนหนึ่งของความพยายามของฉันเพื่อลดเสียงรบกวนในบันทึกและลดการค้นพบเล็กน้อย (และด้านบนของ fail2ban, อนุญาตเฉพาะการรับรองความถูกต้องของรหัสสาธารณะเป็นต้น) ฉันเปลี่ยน sshd-ports เป็นประจำบนเซิร์ฟเวอร์ที่ฉันตั้งค่าเป็นพอร์ตอื่น ฉันอาจผนวก -p 5492 คำสั่ง SSH ssh_configของฉันหรือเพิ่มพอร์ตสำหรับแต่ละเซิร์ฟเวอร์ที่เฉพาะเจาะจงลงไปของฉัน

มีวิธีการกำหนดค่า ssh เพื่อลองเชื่อมต่อกับทั้งพอร์ต 22 และพอร์ต 5492 หรือไม่หากพอร์ต 22 ใช้งานไม่ได้


1
ฉันชอบแทนที่จะมีความปลอดภัยผ่านความสับสนตั้งค่า VPN และไม่ได้เปิดพอร์ต ssh กับอินเทอร์เน็ตโดยรวมเลย
Rui F Ribeiro

2
@RuiFRibeiro ฉันเห็นด้วยว่ามันไม่ปลอดภัยกว่า อย่างไรก็ตามมันเก็บเสียงไว้ในล็อกไฟล์ หนึ่งสามารถใช้พอร์ตเคาะเพื่อลดความพยายามในการเข้าสู่ระบบซึ่งจะเพิ่มความปลอดภัย
Ned64

2
@RuiFRibeiro เซิร์ฟเวอร์ VPN ปลอดภัยกว่าเซิร์ฟเวอร์ SSH หรือไม่
Riley

ทุกอย่างขึ้นอยู่กับการใช้งาน ในงานเดิมของฉันฉันได้กำหนด 2 รายการ VPN สำหรับความซ้ำซ้อนและไม่มีการsshปรากฏตัวใด ๆสำหรับภายนอก
Rui F Ribeiro

2
การรักษาความปลอดภัยโดยความสับสนเป็นเลเยอร์เพิ่มเติมที่ดีด้านบนของการตั้งค่าที่ดีโดยเฉพาะอย่างยิ่งเมื่อมันเกี่ยวกับการโจมตีที่มีโอกาส
rackandboneman

คำตอบ:


11

คุณสามารถตัดเชลล์สคริปต์ไปรอบ ๆsshแต่sshตัวมันเองจะไม่ทำ

วิธีหนึ่งที่ใช้ฟังก์ชัน bash คือ (ใส่ไว้~/.bashrc):

function ssh() { command ssh -p 22 "$@" || command ssh -p 5492 "$@"; }

อย่างไรก็ตามขอแนะนำให้ใช้rootพอร์ตที่สงวนไว้สำหรับบริการของระบบเช่นsshเพื่อหลีกเลี่ยงผู้ใช้ที่มีกระบวนการที่รับฟังพูดพอร์ต 5492 มิฉะนั้นพวกเขาอาจเล่นคนที่อยู่ตรงกลางและอาจเก็บข้อมูลล็อกอิน ดังนั้นใช้พอร์ต <1024


1
นั่นเป็นทางออกที่ดี ยังเป็นข้อสังเกตที่ดีเกี่ยวกับพอร์ต!
Riley

5
โปรดทราบว่าการเชื่อมต่อครั้งที่สองจะเกิดขึ้นแม้ว่าการเชื่อมต่อครั้งแรกจะสำเร็จหากคำสั่งที่ดำเนินการโดยsshส่งคืนค่าที่ไม่เป็นศูนย์ ตัวอย่างเล็ก ๆ น้อย ๆ ssh user@server falseจะเป็น
Kusalananda

1
@ Kusalananda ขอบคุณฉันได้เขียนcommandตอนนี้ แค่ต้องการหลีกเลี่ยงการเรียกซ้ำขณะที่คุณเดาถูก
Ned64

ปัญหา @Kusalananda ที่กล่าวถึงสามารถหลีกเลี่ยงได้ (ส่วนใหญ่) โดยการทดสอบสถานะการออกเฉพาะssh- ถ้ามีข้อผิดพลาด ssh (ตรงข้ามกับคำสั่งระยะไกลล้มเหลว) มันจะออกด้วยสถานะ 255 ดังนั้นcommand ssh -p 22 "$@"; if [ "$?" -eq 255 ]; then command ssh -p 5492 "$@"; fiควรทำงาน
Gordon Davisson

10

sshตัวเองสามารถทำสิ่งนี้ผ่านMatchเอกสารssh_config(5)แม้ว่าเอกสารจะค่อนข้างเบาบางในตัวอย่าง แบบฟอร์มนี้อาจเหมาะสมหากต้องการผลักดันความซับซ้อนไปยังการกำหนดค่า SSH แม้ว่าจะถูก จำกัด โดยข้อ จำกัด ของssh_config(5)ไวยากรณ์และอาจต้องเล่นซอกับผลลัพธ์ที่ต้องการ สะดุดตาพอร์ตที่กำหนดเองไม่สามารถตั้งค่าหรือสามารถตั้งค่าผิดจากMatchความพยายามก่อนหน้า นี่คือสาเหตุที่ด้านล่างมันถูกตั้งค่าสองครั้งเมื่อทดสอบหรือครั้งเดียวสำหรับค่าเริ่มต้นและไม่ได้ตั้งค่าเมื่อสร้างค่าเริ่มต้นที่เป็นที่ยอมรับ

# here we set the defaults for the host (no port!)
Match !canonical host testhost
  CanonicalizeHostname yes
  Hostname 192.0.2.42
  IdentityFile ~/.ssh/id_blahblah
  ...
# port available?
Match canonical host 192.0.2.42 exec "is-ssh-up %h 2222"
  Port 2222
# or the default port
Match canonical host 192.0.2.42
  Port 22

is-ssh-up เพียงตรวจสอบว่ามีบางสิ่งตอบสนองบนพอร์ตที่กำหนดและอาจมีลักษณะเช่นนั้น

#!/usr/bin/env expect
package require Tcl 8.5
if {[llength $argv] < 2} {
   puts stderr "Usage: is-ssh-up host port"
   exit 1
}
puts stderr "is-ssh-up: DEBUG trying $argv"
set socket [socket -async [lindex $argv 0] [lindex $argv 1]]
chan event $socket readable [list exit 0]
after 3000 [list exit 1]
vwait godot

1
if-then-else เป็น. ssh / config ฉันไม่เชื่อหรอก !!
Archemar

1

คุณสามารถใช้ฟังก์ชันตัวแทนของ~.ssh/configใส่รายการนี้ในรายการของคุณ:

Host *
Port 5492

แต่สิ่งนี้จะไม่ถอยกลับไป 22 ด้วยตัวเอง

หากคุณวางไว้ที่ส่วนท้ายคุณยังสามารถแทนที่มันสำหรับโฮสต์เหล่านั้นได้หากคุณต้องการ 22 โดยใส่ค่าที่แตกต่างด้านบน (และคุณสามารถแทนที่ได้ในบรรทัดคำสั่ง)

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