開いているSSHトンネルを一覧表示する


68

Linuxマシン上のさまざまなサーバーへのSSHトンネルを多数使用します(データベース、Webサーバーなどへのトンネリング用)。現在開いているトンネルのリストをシェルスクリプト経由で表示すると非常に便利です。

次の行に沿って、netstatのgrepを介してローカル接続を識別できます。

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

しかし、これは接続されているリモートポートを表示しません(そして明らかにトンネル化されていない標準のSSH接続が含まれています)

更新:回答は問題ありませんが、接続しているリモートポートが表示されません。たとえば、mysqlへのトンネルがよくあります。たとえば、localhost:3308はサーバー上の:3306にマッピングされます。通常、選択したローカルポートから推測できますが、両方にアクセスできると便利です。

何か案は?


4
最近、このような質問をいくつか見ました(具体的にはあなたが尋ねていることではありません)が、sshが接続に関する情報を提供することに関連しています。sshと同じくらいクールですが、そのような基本的な有用な情報を提供するのは面倒です。<ret> <ret>〜#や$ SSH_CONNECTION環境変数のように実行できるクライアント内部コマンドがいくつかありますが、実際には詳細がまばらです。実行中のトンネルのリストがいいでしょう。機能リクエストの時期かもしれません。
deltaray

回答:


73

によって作成されたトンネルのみを一覧表示する場合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トンネルになります)

に作成されたトンネル/接続を見たい場合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つのサブプロセスが生成されます(最初の2行、「ユーザー」のログイン)、ポート5000で作成された-Rトンネル、およびmyからポートを転送する-Lトンネルローカル)マシンからlocalhost:80(www)へ。


TCPソケットが使用中であるため、3行目のみがあります。33999ポートが80に転送されるのではなく、sshトンネルを通過したものがローカルWebサーバーにヒットしたというだけです。
シェルホリック

それは-Lトンネルの本質です
...-明

リモートIPアドレスとトンネルポートのリストが表示されます。私が理想的に知りたいのは、そのリモートポートがどのポートにトンネリングされるかです。たとえば、ローカルで3308からサーバー上の3306へのトンネルを開いている場合、両方を見たいと思います。
ジェームズ・フロスト

そのためには、サーバーにログインしてそこにsshd関連のlsofを実行するか(信頼できる)、すべてのsshコマンドの/ proc / PID / cmdlineの出力を解析する必要があります.. .ssh / configを介してトンネルを指定することもできます。
アキラ

うん、理にかなっています。スクリプトを少し賢くして、結果を解析し、リモートサーバーのリストを取得し、それぞれで同じコマンドを実行してリモートポートを取得する必要があります。間違いなく実行可能。それに乗ります!
ジェームズ・フロスト

16

このコマンドを試してください。役に立つかもしれません:

ps aux | grep ssh

私の提案は次のとおりです。psaux | grep [s] shd
いとこ

16

あなたの問題の正確な解決策ではありませんが、時には便利です:

sshセッション内から:

  1. Enterを押します
  2. 〜と入力してから#

そのセッションのトンネルで開かれているすべての接続のリストが表示されます。


2
これは、対話型トンネル(-Nおよび-fを使用しない場合など)でのみ機能しますが、興味深いことです。
エリック14年

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ます。
オッリ

-Rトンネルのためにあなたが避けるために持っている-l
アキラ

-R使用されていない場合、トンネルをローカルで見ることはできません。しかし、使用中であれば、それらをキャッチできます-l
シェルホリック

5

これは、この質問に対するGoogleの検索結果のトップであるため、ここに回答を掲載します。私は一晩中結果をフィルタリングし、この形式でリバースsshトンネルのみを表示する長い複雑なコマンドを思い付きました。

publicipaddress:remoteforwardedport

ここにコードがあります。UbuntuServer 12を実行しています。ローカルポート5900をパブリックsshサーバーに転送するリバースsshトンネルを実行しています。このniftyコマンドは、すべてのパブリック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
接続されたSSHトンネルをエコー
エコー
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 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 | grep LISTEN | grep $ f | cut -d ":" -f2 | カット-d "" -f1`
#echo "$ h"
終わり

0

私はlsofが好きではないので、別の方法をお勧めします(別の人が教えてくれました:)):

$ netstat -l | grep ssh

このようにして、sshそれによって作成されたsshトンネルがLISTENモードで開かれていることを示します(デフォルトでは省略されていますnetstat)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.