열린 SSH 터널 나열


67

Linux 시스템의 다양한 서버 (데이터베이스, 웹 서버 등에 터널링하기 위해)에 많은 SSH 터널을 사용하며 쉘 스크립트를 통해 현재 열려있는 터널 목록을 보는 것이 정말 편리합니다.

netstat에서 grep을 통해 로컬 연결을 식별 할 수 있습니다.

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

그러나 이것은 나에게 연결된 원격 포트를 보여주지 않습니다 (그리고 터널링되지 않은 표준 SSH 연결을 포함합니다)

업데이트 : 대답은 훌륭하지만 내가 연결된 원격 포트를 표시하지 않습니다. 예를 들어, 종종 mysql에 대한 터널을 가지고 있습니다. 일반적으로 내가 선택한 로컬 포트로 추측 할 수 있지만 둘 다에 액세스하는 것이 좋습니다.

어떤 아이디어?


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 터널이 됨)

에 대한 터널 / 연결을 보려면 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 라인, 'user'의 로그인), 포트 5000에서 작성된 -R 터널 및 포트를 내에서 전달하는 -L 터널 ( local) 시스템에서 localhost : 80 (www)으로


TCP 소켓이 사용 중이기 때문에 세 번째 줄만 있습니다. 그것은 단지 33999 포트가 80 포트로 전달되는 것이 아니라 ssh 터널을 통한 것이 로컬 웹 서버에 충돌했다고 말합니다.
shellholic

그것은 -L 터널의 본질입니다 ...
akira

원격 IP 주소와 터널링 된 포트 목록을 보여주는 것이 좋습니다. 내가 이상적으로 알고 싶은 것은 터널링 된 원격 포트입니다. 예를 들어 서버에서 로컬로 3308에서 3306으로 터널을 열면 두 가지 모두를보고 싶습니다.
James Frost

이를 위해 서버에 로그인하고 거기에서 sshd 관련 lsof를 실행하거나 (sliable) 모든 ssh-commands에 대한 / proc / PID / cmdline의 출력을 구문 분석해야합니다. .ssh / config를 통해 터널을 지정할 수도 있습니다.
akira

그렇습니다. 스크립트를 조금 더 똑똑하게 사용하여 결과를 구문 분석하고 원격 서버 목록을 가져 와서 각 서버에서 동일한 명령을 실행하여 원격 포트를 검색하십시오. 확실히 할 수 있습니다. 그것을 얻을 것입니다!
James Frost


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 (SSH가 아님)가 로컬 TCP 포트 1443을 수신하고 있습니다.


또한 -p자신의 프로세스 만 표시합니다 (루트 별 모든 프로세스). 또한 해당 명령도 표시 sshd됩니다.
Olli

-R 터널의 경우-l
akira

-R사용하지 않으면 터널을 로컬에서 볼 수 없습니다 . 그러나 맞다면, 사용 -l
중이라면

5

이것이이 질문에 대한 최고의 Google 결과이므로 여기에 답변을 드리겠습니다. 나는 밤새 결과를 필터링하고 다음과 같은 형식의 리버스 ssh 터널 만 보여주는 긴 복잡한 명령을 생각해 냈습니다.

publicipaddress : 원격으로 전달 된 포트

다음은 코드입니다. Ubuntu Server 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- | 컷 -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 | 컷 -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.