รายการอุโมงค์ SSH เปิด


67

ฉันใช้ SSH tunnels จำนวนมากไปยังเซิร์ฟเวอร์ต่าง ๆ บนเครื่อง linux ของฉัน (สำหรับ tunneling ไปยังฐานข้อมูล, เว็บเซิร์ฟเวอร์และอื่น ๆ ) และมันจะมีประโยชน์จริง ๆ ในการดูรายการของอุโมงค์ที่เปิดในปัจจุบันผ่านเชลล์สคริปต์

ฉันสามารถระบุการเชื่อมต่อท้องถิ่นผ่าน grep บน netstat ตามบรรทัดต่อไปนี้:

netstat -n --protocol inet | grep ':22'

แต่สิ่งนี้จะไม่แสดงให้ฉันเห็นว่ารีโมตพอร์ตเชื่อมต่อกับมัน (และเห็นได้ชัดว่ารวมถึงการเชื่อมต่อ SSH มาตรฐานที่ไม่ได้ติดตั้ง)

UPDATE : คำตอบนั้นใช้ได้ แต่ไม่แสดงพอร์ตระยะไกลที่ฉันเชื่อมต่อ เช่นฉันมักจะมีอุโมงค์ผ่านไปยัง mysql พูด localhost: 3308 แมปกับ: 3306 บนเซิร์ฟเวอร์ โดยปกติฉันสามารถเดาได้จากพอร์ตในเครื่องที่ฉันเลือก แต่จะดีถ้ามีการเข้าถึงทั้งสอง

ความคิดใด ๆ


4
ฉันเคยเห็นคำถามสองสามข้อเช่นนี้เมื่อเร็ว ๆ นี้ (ไม่ใช่เฉพาะสิ่งที่คุณขอ) แต่เกี่ยวข้องกับการให้ข้อมูลเกี่ยวกับการเชื่อมต่อ ssh เท่อย่างที่ ssh คือมันให้ข้อมูลพื้นฐานที่เป็นประโยชน์เช่นนั้น มีคำสั่งภายในไคลเอ็นต์บางอย่างที่คุณสามารถเรียกใช้เช่น <ret> <ret> ~ # และตัวแปรสภาพแวดล้อม $ SSH_CONNECTION รายการอุโมงค์ที่กำลังวิ่งจะดี อาจถึงเวลาสำหรับการร้องขอคุณสมบัติ
deltaray

คำตอบ:


72

หากคุณต้องการแสดงรายการอุโมงค์ที่สร้างโดยssh:

% sudo lsof -i -n | egrep '\<ssh\>'
ssh  19749  user  3u  IPv4 148088244   TCP x.x.x.x:39689->y.y.y.y:22 (ESTABLISHED)
ssh  19749  user  4u  IPv6 148088282   TCP [::1]:9090 (LISTEN)
ssh  19749  user  5u  IPv4 148088283   TCP 127.0.0.1:9090 (LISTEN)

(นั่นจะเป็น -L 9090: localhost: 80 tunnel)

หากคุณต้องการดูอุโมงค์ / การเชื่อมต่อที่ทำกับsshd:

 % sudo lsof -i -n | egrep '\<sshd\>'
sshd  15767  root  3u  IPv4 147401205   TCP x.x.x.x:22->y.y.y.y:27479 (ESTABLISHED)
sshd  15842  user  3u  IPv4 147401205   TCP x.x.x.x:22->y.y.y.y:27479 (ESTABLISHED)
sshd  15842  user  9u  IPv4 148002889   TCP 127.0.0.1:33999->127.0.0.1:www (ESTABLISHED)
sshd  1396   user  9u  IPv4 148056581   TCP 127.0.0.1:5000 (LISTEN)
sshd  25936  root  3u  IPv4 143971728   TCP *:22 (LISTEN)

ssh-daemon ฟังพอร์ต 22 (บรรทัดสุดท้าย), 2 subprocesses จะเกิด (2 บรรทัดแรก, ล็อกอินของ 'ผู้ใช้'), อุโมงค์ -R ที่สร้างขึ้นบนพอร์ต 5000, และอุโมงค์ -L ซึ่งส่งต่อพอร์ตจาก my ( เครื่อง) ไปยัง localhost: 80 (www)


บรรทัดที่ 3 นั้นอยู่ที่นั่นเพราะมีการใช้ซ็อกเก็ต TCP เพิ่งบอกว่าบางสิ่งผ่านอุโมงค์ ssh ได้เข้าเว็บเซิร์ฟเวอร์ของคุณไม่ใช่ว่า 33,999 พอร์ตถูกส่งต่อไปยัง 80
shellholic

นั่นคือสาระสำคัญของอุโมงค์ -L ...
กิระ

ไม่เป็นไรการแสดงที่อยู่ IP ระยะไกลและรายการพอร์ตที่รับสัญญาณ สิ่งที่ฉันอยากรู้คือสิ่งที่พอร์ตระยะไกลของมัน ตัวอย่างเช่นหากฉันมีอุโมงค์เปิดจาก 3308 ในเครื่องเป็น 3306 บนเซิร์ฟเวอร์ฉันต้องการเห็นทั้งคู่
James Frost

เพื่อที่คุณจะต้องลงชื่อเข้าใช้เซิร์ฟเวอร์และดำเนินการกับ sshd ที่เกี่ยวข้อง (เชื่อถือได้) หรือแยกเอาต์พุตของ / proc / PID / cmdline สำหรับคำสั่ง ssh ทั้งหมดของคุณ .. ซึ่งอาจทำให้คุณเข้าใจผิดตั้งแต่คุณ สามารถระบุช่องทางผ่าน. ssh / config ได้เช่นกัน
กิระ

ใช่เหมาะสม จำเป็นต้องใช้สคริปต์ที่ฉลาดกว่านี้เพื่อแยกผลลัพธ์รับรายการรีโมตเซิร์ฟเวอร์และเรียกใช้คำสั่งเดียวกันบนแต่ละตัวเพื่อเรียกค้นพอร์ตระยะไกล ทำได้อย่างแน่นอน จะได้รับมัน!
James Frost

16

ลองคำสั่งนี้มันอาจจะมีประโยชน์:

ps aux | grep ssh

ข้อเสนอแนะของฉันจะเป็น: ps aux | grep [s] shd
27

16

ไม่แก้ปัญหาของคุณอย่างแน่นอน แต่บางครั้งก็มีประโยชน์:

จากภายในเซสชัน ssh:

  1. กดปุ่มตกลง
  2. พิมพ์ ~ และจากนั้น #

แสดงรายการการเชื่อมต่อที่เปิดอยู่ทั้งหมดผ่านอุโมงค์ของคุณสำหรับเซสชันนั้น


2
ใช้งานได้กับอุโมงค์แบบโต้ตอบ (โดยไม่มี -N และ -f, …) แต่น่าสนใจที่จะรู้
erik

6
netstat -tpln | grep ssh
  • t: TCP
  • p: กระบวนการแสดง
  • l: ฟัง
  • n: ค่าตัวเลข

แก้ไข: ตัวอย่างสำหรับความคิดเห็นของ @akira:

(header added, tested on Debian wheezy)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:1443          0.0.0.0:*               LISTEN      4036/ssh        

ซึ่งสามารถอ่านได้เป็น: SSH (ไม่ใช่ SSHd) กำลังฟังพอร์ต TCP ภายในเครื่อง 1443


นอกจากนี้โปรดทราบว่า-pจะแสดงเฉพาะกระบวนการของคุณเอง (กระบวนการทั้งหมดโดยรูท) นอกจากนี้คำสั่งนั้นsshdก็แสดงเช่นกัน
Olli

สำหรับอุโมงค์ -R ที่คุณต้องหลีกเลี่ยง-l
กิระ

คุณไม่สามารถเห็น-Rอุโมงค์ในเครื่องหากไม่ได้ใช้งาน แต่ถ้าใช้คุณสามารถจับพวกมันได้โดยไม่ต้องใช้-l
shellholic

5

นี่คือผลลัพธ์ google อันดับต้น ๆ สำหรับคำถามนี้ดังนั้นฉันจะใส่คำตอบของฉันที่นี่ ฉันคอยกรองผลลัพธ์ตลอดทั้งคืนและมีคำสั่งที่ซับซ้อนยาวที่แสดงให้คุณเห็นเฉพาะอุโมงค์ย้อนกลับ ssh ของคุณในรูปแบบนี้:

publicipaddress: remoteforwardedport

นี่คือรหัสฉันกำลังใช้งาน Ubuntu Server 12 ฉันกำลังเรียกใช้ ssh tunnels แบบย้อนกลับที่ส่งต่อพอร์ตโลคัล 5900 ไปยังเซิร์ฟเวอร์ ssh สาธารณะของฉันและคำสั่งที่ดีนี้แสดงที่อยู่ ip สาธารณะทั้งหมดของฉันด้วยพอร์ตระยะไกล

sudo lsof -i -n | egrep '\<sshd\>' | grep -v ":ssh" | grep LISTEN | sed 1~2d | awk '{ print $2}' | while read line; do sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done

2
report_local_port_forwardings() {

  # -a ands the selection criteria (default is or)
  # -i4 limits to ipv4 internet files
  # -P inhibits the conversion of port numbers to port names
  # -c /regex/ limits to commands matching the regex
  # -u$USER limits to processes owned by $USER
  # http://man7.org/linux/man-pages/man8/lsof.8.html
  # https://stackoverflow.com/q/34032299

  echo 
  echo "LOCAL PORT FORWARDING"
  echo
  echo "You set up the following local port forwardings:"
  echo

  lsof -a -i4 -P -c '/^ssh$/' -u$USER -s TCP:LISTEN

  echo
  echo "The processes that set up these forwardings are:"
  echo

  ps -f -p $(lsof -t -a -i4 -P -c '/^ssh$/' -u$USER -s TCP:LISTEN)

}

report_remote_port_forwardings() {

  echo 
  echo "REMOTE PORT FORWARDING"
  echo
  echo "You set up the following remote port forwardings:"
  echo

  ps -f -p $(lsof -t -a -i -c '/^ssh$/' -u$USER -s TCP:ESTABLISHED) | awk '
  NR == 1 || /R (\S+:)?[[:digit:]]+:\S+:[[:digit:]]+.*/
  '
}

report_local_port_forwardings
report_remote_port_forwardings

ตัวอย่างผลลัพธ์:

LOCAL PORT FORWARDING

You set up the following local port forwardings:

COMMAND   PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
ssh     10086 user     7u  IPv4 1924960      0t0  TCP localhost:2301 (LISTEN)
ssh     10086 user     9u  IPv4 1924964      0t0  TCP localhost:2380 (LISTEN)
ssh     10086 user    11u  IPv4 1924968      0t0  TCP localhost:2381 (LISTEN)

The processes that set up these forwardings are:

UID        PID  PPID  C STIME TTY          TIME CMD
user     10086  7074  0 13:05 pts/21   00:00:00 ssh -N ssh.example.com

REMOTE PORT FORWARDING

You set up the following remote port forwardings:

UID        PID  PPID  C STIME TTY      STAT   TIME CMD
user      7570 30953  0 11:14 pts/18   S      0:00 ssh -N -R 9000:localhost:3000 ssh.example.com


0
#! / bin / csh -f
echo SSH Tunnels Connected
เสียงสะท้อน
foreach f (`netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep ฟังเพลง | ตัด -d" "-f45- | ตัด -d" / "-f1` )
set ip = `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep ESTABLISH | grep $ f | ตัด -d "" -f20- | cut -d ":" -f1`
#set h = `grep -a" $ ip "/htdocs/impsip.html | grep br | ตัด -d "" -f2`
echo -n "$ ip"
echo `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | รายการ LISTEN grep $ f | ตัด -d ":" -f2 | ตัด -d "" -f1`
#echo "$ h"
ปลาย

0

เนื่องจากฉันไม่ชอบ lsof ฉันแนะนำวิธีอื่น (ผู้ชายอีกคนสอนฉัน :)):

$ netstat -l | grep ssh

ด้วยวิธีนี้คุณจะแสดง ssh tunnels ที่สร้างโดยsshสิ่งนั้นถูกเปิดในโหมด LISTEN (และถูกละเว้นโดยค่าเริ่มต้นเป็นnetstat)

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