จะกำหนดพอร์ตที่จัดสรรบนเซิร์ฟเวอร์สำหรับอุโมงค์ย้อนกลับ openssh ที่ผูกไว้แบบไดนามิกได้อย่างไร?


16

เมื่อสร้างอุโมงค์ย้อนกลับใน OpenSSH เวอร์ชันล่าสุดสามารถกำหนดพอร์ตระยะไกลเป็น 0 เพื่อผูกพอร์ตที่มี:

-R [bind_address:] พอร์ต: host: hostport

...

หากอาร์กิวเมนต์พอร์ตเป็น `0 'พอร์ต Listen จะถูกจัดสรรแบบไดนามิกบนเซิร์ฟเวอร์และรายงานไปยังไคลเอนต์ ณ รันไทม์

openssh ssh manpage ของลูกค้า

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

ตัวเลือกที่คล้ายกันสองตัวที่ฉันคิดว่าใช้งานได้

# netstat -ntlp

บนเซิร์ฟเวอร์และค้นหาพอร์ตที่ต้องสงสัยที่ผูกไว้กับ 127.0.0.1 โดย sshd หรือโดยดูที่ผลลัพธ์ของ

# lsof -p $PPID | grep TCP | grep LISTEN

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

มีอะไรที่ฉันขาดหายไปในการรับรายการช่องสัญญาณที่ใช้งานอยู่ (ทั้งหมายเลขพอร์ตภายในและระยะไกล) อย่างมีประสิทธิภาพบนฝั่งเซิร์ฟเวอร์ sshd เช่นเทียบเท่ากับตัวแปรสภาพแวดล้อม SSH_CONNECTION แต่สำหรับช่องสัญญาณที่ใช้งานอยู่?

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


เมื่อใช้ไวยากรณ์ "-R 0: xxxx: y" ssh จะส่งออก "พอร์ตที่จัดสรร 49488 สำหรับการส่งต่อระยะไกลไปยัง xxxx: y บน stderr
BlakBat

ใช่ปัญหาคือวิธีการรับข้อมูลนั้นไปยังฝั่งเซิร์ฟเวอร์ - ซึ่งจะมีประโยชน์มากขึ้น ...
codedstructure

คำตอบ:


1

หากคุณตั้งค่า 'LogLevel' ในไฟล์การกำหนดค่า sshd_config เป็น DEBUG1 (หรือระดับ DEBUG ใด ๆ ) จากนั้น sshd จะบันทึกหมายเลขพอร์ตใน /var/log/auth.log

อย่าลืมว่าการใช้ LogLevel ของ DEBUG หรือสูงกว่านั้นอาจเป็นความเสี่ยงด้านความเป็นส่วนตัวเนื่องจากมีการบันทึกจำนวนมาก

(จาก /var/log/auth.log ลบสองสามบรรทัดเพื่อแสดงข้อมูลที่เกี่ยวข้อง)

Jun 24 06:18:24 radon sshd[9334]: Connection from 192.168.13.10 port 39193
Jun 24 06:18:24 radon sshd[9334]: Accepted publickey for lornix from 192.168.13.10 port 39193 ssh2
Jun 24 06:18:24 radon sshd[9334]: pam_unix(sshd:session): session opened for user lornix by (uid=0)
Jun 24 06:18:24 radon sshd[9334]: User child is on pid 9339
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on 0.0.0.0 port 0.
Jun 24 06:18:24 radon sshd[9339]: debug1: Allocated listen port 39813
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 0: new [port listener]
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on :: port 39813.
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 1: new [port listener]
Jun 24 06:18:27 radon sshd[9339]: Received disconnect from 192.168.13.10: 11: disconnected by user

หากคุณติดตามผ่านคุณสามารถดูว่าคุณสามารถแยกวิเคราะห์ข้อมูลการเชื่อมต่อจากนั้นพอร์ตที่ส่งต่อ (39813 ในกรณีนี้)

ฉันใช้บรรทัดคำสั่งนี้ระหว่างเครื่องสองเครื่องฉันมีการตั้งค่าการเข้าสู่ระบบ ssh-key ดังนั้นจึงไม่มีการแจ้งรหัสผ่านหรือความล่าช้า

-xenon- lornix:~> ssh -R "*:0:radon:22" -N -T radon
Allocated port 39813 for remote forward to radon:22

-N ระบุคำสั่งที่ไม่ได้รับและ -T หยุดการจัดสรร tty สำหรับการเชื่อมต่อนี้

อีกวิธีหนึ่งในการเผยแพร่ข้อมูลการเชื่อมต่อพอร์ตก็คือการแยกวิเคราะห์จากฝั่งไคลเอ็นต์และส่งอีเมล, พูดพล่าม, ข้อความ msg, สัญญาณควันหรือนกพิราบเพื่อดำเนินการพอร์ต # เพื่อใครก็ตามที่ต้องการมัน


0

คุณสามารถไปป์ stderr ของsshลงในโปรแกรมที่เปิดการเชื่อมต่อกับเซิร์ฟเวอร์บนเครื่องเป้าหมายและรายงานชื่อเครื่อง / ที่อยู่ IP / หมายเลขซีเรียล / อะไรก็ตามพร้อมกับหมายเลขพอร์ต แบบนี้:

% ssh -R "*:0:radon:22" -N -T radon 2>&1 | sed "s/^/`uname -n` /" | netcat radon 3743
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.