Açık SSH tünellerini listele


67

Linux makinemdeki çeşitli sunuculara (veritabanlarına, web sunucularına vb. Tünel açmak için) çok fazla SSH tüneli kullanıyorum ve mevcut açık tünellerin listesini bir kabuk betiği aracılığıyla görüntülemek gerçekten kullanışlı olurdu.

Netstat'taki bir grep yoluyla yerel bağlantıları tanımlayabilirim:

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

ancak bu bana bağlı olduğu uzak bağlantı noktasını göstermeyecek (ve açıkça tünelli olmayan standart SSH bağlantılarını içeriyor)

GÜNCELLEME : Cevaplar iyi ancak bağlı olduğum uzak bağlantı noktasını göstermiyor. Örneğin, sık sık mysql için bir tünel var, yerel ana bilgisayar: 3308 eşleme: sunucuda 3306 diyoruz. Normalde, seçtiğim yerel bağlantı noktalarına göre tahmin edebilirim, ancak ikisine de erişebilmek iyi olurdu.

Herhangi bir fikir?


4
Son zamanlarda bunun gibi birkaç soru gördüm (özellikle ne soruyorsanız değil), ancak bağlantı hakkında bilgi sağlayan ssh ile ilgili. Ssh ne kadar soğuk olursa olsun, bu konuda bazı temel yararlı bilgiler sağlamayı emer. <ret> <ret> ~ # ve $ SSH_CONNECTION ortam değişkeni gibi çalıştırabileceğiniz bazı istemci dahili komutları var, ancak bunlar ayrıntılarda çok seyrek. Çalışan tünellerin listesi iyi olurdu. Belki bir özellik isteği için zamanı.
deltaray

Yanıtlar:


72

sadece aşağıdakiler tarafından oluşturulan tünelleri listelemek istiyorsanız 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)

(Bu bir -L 9090 olur: localhost: 80 tünel)

a’ya yapılan tünelleri / bağlantıları görmek isterseniz 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 numaralı bağlantı noktasını (son satır) dinler, 2 alt işlem üretilir (ilk 2 satır, "kullanıcı girişi"), 5000 numaralı bağlantı noktasında oluşturulan bir R tüneli ve yerel) makine yerel makineye: 80 (www).


3. satır sadece orada çünkü TCP soketi kullanımda. Sadece bir ssh tünelinden geçen bir şeyin yerel web sunucunuza ulaştığını, 33999 portunun 80'e yönlendirildiğini yazmıyor.
kabuklu

Bu bir -L tünelinin özü ...
akira

Sorun değil, uzak IP adresini ve tünelli bağlantı noktalarının listesini göstermesi. İdeal olarak bilmek istediğim, uzaktaki portun tünellendiği şey. Örneğin, sunucuda yerel olarak 3308’den 3306’ya bir tünel açtım, ikisini de görmek istiyorum.
James Frost

bunun için ya sunucuya giriş yapmanız ve orada sshd ile ilgili lsof komutunu çalıştırmanız (güvenilir) ya da tüm ssh komutlarınız için / proc / PID / cmdline çıktısını ayrıştırmanız gerekir. Tünelleri .ssh / config ile de belirtebilirsiniz.
akira

Evet, mantıklı. Daha sonra sonuçları çözümlemek, uzak sunucuların listesini almak ve uzaktaki portları almak için her birine aynı komutu uygulamak için komut dosyasıyla biraz daha akıllı olmanız gerekir. Kesinlikle yapılabilir. Başlayacak!
James Frost


16

Sorununuz için tam olarak değil, bazen de kullanışlı

Bir ssh oturumu içinden:

  1. Enter tuşuna basın
  2. ~ yazın ve ardından #

bu oturum için tünelleriniz üzerindeki tüm açık bağlantıların bir listesini gösterir.


2
Bu sadece etkileşimli tüneller için işe yarar (-N ve -f,… olmadan), ama bilmek ilginç.
erik

6
netstat -tpln | grep ssh
  • t: TCP
  • p: süreci göster
  • l: dinleme
  • n: sayısal değerler

EDIT: @akira yorumu için örnek:

(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        

Hangi şekilde okunabilir: SSH (SSHd değil) yerel TCP port 1443'ü dinliyor.


Ayrıca -p, yalnızca kendi işlemlerinizi (tüm kök işlemleriyle) gösterir. Ayrıca, bu komut da gösterir sshd.
Olli

kaçınmanız gereken -R tünelleri için-l
akira

Kullanılmadığı -Rtakdirde tünelleri yerel olarak göremezsiniz . Ama doğru, eğer kullanıyorsanız, onları 13-l
26'da

5

Bu, bu sorunun en iyi google sonucudur, bu yüzden cevabımı buraya yazacağım. Bütün gece sonuçları filtreleyerek kaldım ve sadece bu şekilde sadece ters ssh tünellerini gösteren uzun ve karmaşık bir komutla geldim:

publicipaddress: remoteforwardedport

İşte kod, Ubuntu Server 12 kullanıyorum. Yerel port 5900'ü genel ssh sunucuma yönlendiren ters ssh tünelleri çalıştırıyorum ve bu şık komut tüm genel ip adreslerimi uzak port ile gösteriyor.

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

Örnek çıktı:

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
/sbin/ip tunnel list # replacement for the deprecated iptunnel command

0
#! / bin / csh -f
echo SSH Tünelleri Bağlandı
Eko
foreach f (`netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep LISTEN | cut -d" "-f45- | cut -d" / "-f1` )
set ip = `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep KURULUŞ | grep $ f | kesilmiş -d "" -f20- | kesilmiş -d ":" -f1`
#set h = `grep -a" $ ip "/htdocs/impsip.html | grep br | kes "-d" "-f2`
echo -n "$ ip"
echo `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep LISTEN | grep $ f | kesilmiş -d ":" -f2 | kes "-d" "-f1`
#echo "$ h"
son

0

Lsof'u sevmediğim için alternatif bir yöntem öneririm (başka biri bana öğretti :)):

$ netstat -l | grep ssh

Bu şekilde ssh, LISTEN modunda açılmış olan ssh tünellerini gösterirsiniz (ve varsayılan olarak atlanır netstat).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.