Liệt kê các đường hầm SSH mở


68

Tôi sử dụng rất nhiều đường hầm SSH đến các máy chủ khác nhau trên máy linux của mình (để tạo đường hầm cho cơ sở dữ liệu, máy chủ web, v.v.) và sẽ rất hữu ích khi xem danh sách các đường hầm mở hiện tại thông qua tập lệnh shell.

Tôi có thể xác định các kết nối cục bộ thông qua một grep trên netstat dọc theo dòng:

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

nhưng điều này sẽ không hiển thị cho tôi cổng từ xa được kết nối với (và rõ ràng bao gồm các kết nối SSH tiêu chuẩn không được điều chỉnh)

CẬP NHẬT : Các câu trả lời đều ổn nhưng không hiển thị cho tôi cổng từ xa mà tôi đã kết nối. Ví dụ: tôi thường có một đường hầm thông qua mysql, giả sử localhost: ánh xạ 3308 tới: 3306 trên máy chủ. Thông thường tôi có thể đoán bằng các cổng cục bộ mà tôi đã chọn nhưng sẽ rất tuyệt nếu có quyền truy cập vào cả hai.

Có ý kiến ​​gì không?


4
Gần đây tôi đã thấy một vài câu hỏi như thế này (không cụ thể là những gì bạn đang hỏi), nhưng liên quan đến ssh cung cấp thông tin về kết nối. Tuyệt vời như ssh, nó cung cấp một số thông tin hữu ích cơ bản như thế. Có một số lệnh nội bộ của máy khách mà bạn có thể chạy như <ret> <ret> ~ # và biến môi trường $ SSH_CONNMENT, nhưng chúng thực sự thưa thớt về chi tiết. Một danh sách các đường hầm đang chạy sẽ tốt đẹp. Có lẽ đó là thời gian cho một yêu cầu tính năng.
deltaray

Câu trả lời:


73

nếu bạn chỉ muốn liệt kê các đường hầm được tạo bởi 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)

(đó sẽ là -L 9090: localhost: 80 đường hầm)

nếu bạn muốn xem các đường hầm / kết nối được thực hiện cho 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 lắng nghe trên cổng 22 (dòng cuối cùng), 2 quy trình con được sinh ra (2 dòng đầu tiên, đăng nhập của 'người dùng'), một đường hầm -R được tạo trên cổng 5000 và một đường hầm -L chuyển tiếp một cổng từ ( cục bộ) máy sang localhost: 80 (www).


Dòng thứ 3 chỉ ở đó vì ổ cắm TCP đang được sử dụng. Nó chỉ nói một cái gì đó thông qua một đường hầm ssh đã tấn công máy chủ web cục bộ của bạn, không phải là cổng 33999 được chuyển tiếp đến 80.
shellholic

đó là bản chất của một đường hầm -L ...
akira

Điều đó tốt, nó hiển thị địa chỉ IP từ xa và danh sách các cổng được điều chỉnh. Điều tôi lý tưởng muốn biết là cổng từ xa được điều chỉnh theo cái gì. Ví dụ: nếu tôi có một đường hầm mở từ 3308 cục bộ đến 3306 trên máy chủ, tôi muốn xem cả hai.
James Frost

cho rằng bạn sẽ phải đăng nhập vào máy chủ và thực thi lsof liên quan đến sshd ở đó (đáng tin cậy) hoặc phân tích đầu ra của / Proc / PID / cmdline cho tất cả các lệnh ssh của bạn .. điều này có thể cho bạn kết quả sai lệch vì bạn cũng có thể chỉ định đường hầm thông qua .ssh / config.
akira

Đúng, có ý nghĩa. Cần phải khéo léo hơn một chút với tập lệnh sau đó để phân tích kết quả, lấy danh sách các máy chủ từ xa và thực hiện cùng một lệnh trên mỗi tập lệnh để lấy các cổng từ xa. Chắc chắn có thể làm được. Sẽ nhận được trên nó!
James Frost

16

Hãy thử lệnh này, nó có thể hữu ích:

ps aux | grep ssh

đề nghị của tôi sẽ là: ps aux | grep [s] shd
CousinCocaine

16

không chính xác giải pháp cho vấn đề của bạn, nhưng đôi khi cũng tiện dụng:

Từ trong một phiên ssh:

  1. nhấn Enter
  2. gõ ~ và sau đó #

hiển thị cho bạn một danh sách tất cả các kết nối mở qua các đường hầm của bạn cho phiên đó.


2
Điều đó chỉ hoạt động cho các đường hầm tương tác (không có -N và -f, Hiện), nhưng thú vị để biết.
erik

6
netstat -tpln | grep ssh
  • t: TCP
  • p: hiển thị quá trình
  • l: nghe
  • n: giá trị số

EDIT: ví dụ cho bình luậ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        

Có thể được đọc là: SSH (không phải SSHd) đang lắng nghe cổng TCP cục bộ 1443.


Cũng lưu ý rằng -pchỉ hiển thị các quy trình của riêng bạn (tất cả các quy trình bằng root). Ngoài ra, lệnh đó cho thấy sshdquá.
Olli

cho -R đường hầm bạn phải tránh-l
akira

Bạn không thể thấy cục bộ các -Rđường hầm nếu không sử dụng. Nhưng đúng, nếu đang sử dụng, bạn có thể bắt chúng mà không cần-l
shellholic

5

Đây là kết quả hàng đầu của google cho câu hỏi này, vì vậy tôi sẽ đặt câu trả lời của mình ở đây. Tôi thức cả đêm để lọc kết quả và đưa ra một lệnh dài phức tạp chỉ cho bạn thấy các đường hầm ssh ngược của bạn ở định dạng này:

publicipaddress: remoteforwardedport

Đây là mã, tôi đang chạy Ubuntu Server 12. Tôi đang chạy các đường hầm ssh ngược chuyển tiếp cổng cục bộ 5900 đến máy chủ ssh công cộng của tôi và lệnh tiện lợi này hiển thị tất cả các địa chỉ IP công cộng của tôi với cổng từ xa.

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

Đầu ra mẫu:

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
tiếng vang SSH đường hầm được kết nối
tiếng vang
foreach f (`netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep LISTEN | cut -d" "-f45- | cut -d" / "-f1` )
đặt ip = `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep ESTABOUND | grep $ f | cắt -d "" -f20- | cắt -d ":" -f1`
#set h = `grep -a" $ ip "/htdocs/impsip.html | grep br | cắt -d "" -f2`
tiếng vang -n "$ ip"
tiếng vang `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep LISTEN | grep $ f | cắt -d ":" -f2 | cắt -d "" -f1`
#echo "$ h"
kết thúc

0

Vì tôi không thích lsof, tôi đề xuất một phương pháp thay thế (một người khác đã dạy tôi :)):

$ netstat -l | grep ssh

Theo cách này, bạn hiển thị các đường hầm ssh được tạo bởi sshđược mở trong chế độ LISTEN (và được bỏ qua theo mặc định netstat).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.