특정 역방향 SSH 터널을 다시 시작하시겠습니까?

특정 역방향 SSH 터널을 다시 시작하시겠습니까?

내 서버에 대한 역방향 SSH 연결을 여는 여러 컴퓨터가 있습니다. 각 머신은 서로 다른 역방향 SSH 포트를 사용하는데, 저는 이를 머신 간 구별에 사용합니다. 저는 이 터널을 사용하여 서버에서 머신으로 로그인합니다(분명히):

me@server:~$ ssh -p 2219 root@localhost
Last login: Sun Jun  7 00:18:44 2015 from localhost
root@remote_machine:~#

원격 시스템은 완전히 다른 액세스 기술(DSL, VSAT, GPRS/EDGE/3G/4G)을 사용하므로 역방향 SSH 연결의 내구성이 다릅니다. 이는 분명히 문제입니다.

이는 nmap더 긴 유휴 기간 이후에 나열되는 내용입니다(즉, SSH 터널을 강제로 다시 시작하지 않음, 아래 참조).

me@server:~$ sudo nmap -sS -p 1000-3000 --open localhost

Starting Nmap 5.21 ( http://nmap.org ) at 2015-06-07 11:09 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000014s latency).
Hostname localhost resolves to 2 IPs. Only scanned 127.0.0.1
Not shown: 1988 closed ports
PORT     STATE SERVICE
1133/tcp open  unknown
1270/tcp open  ssserver
1356/tcp open  cuillamartin
1590/tcp open  unknown
1760/tcp open  unknown
1772/tcp open  unknown
1823/tcp open  unknown
1825/tcp open  unknown
1842/tcp open  unknown
1907/tcp open  unknown
2078/tcp open  unknown
2168/tcp open  unknown
2185/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds
me@server:~$

이제 연결 수가 너무 적으므로 모두 종료하고 외부 연결이 다시 돌아올 때까지 기다리겠습니다.

me@server:~$ for i in $(ps axww|grep ssh_key_used_for_reverse_connctions|grep sshd|sed -e 's/^[ \t]*//'|cut -d " " -f 1); do sudo kill -9 $i; done
me@server:~$

좋습니다. 모든 연결이 끊어졌습니다.

Starting Nmap 5.21 ( http://nmap.org ) at 2015-06-07 11:13 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000014s latency).
Hostname localhost resolves to 2 IPs. Only scanned 127.0.0.1
All 2002 scanned ports on localhost (127.0.0.1) are closed

Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds

기다렸다가(원격 컴퓨터는 30초마다 새로운 연결 설정을 시도합니다) 이제 무슨 일이 일어나는지 살펴보겠습니다.

me@server:~$ sudo nmap -sS -p 1000-3000 --open localhost

Starting Nmap 5.21 ( http://nmap.org ) at 2015-06-07 11:14 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000015s latency).
Hostname localhost resolves to 2 IPs. Only scanned 127.0.0.1
Not shown: 1950 closed ports
PORT     STATE SERVICE
1125/tcp open  unknown
1129/tcp open  unknown
1133/tcp open  unknown
1155/tcp open  unknown
1156/tcp open  unknown
1157/tcp open  unknown
1162/tcp open  unknown
1176/tcp open  unknown
1185/tcp open  unknown
1198/tcp open  unknown
1215/tcp open  unknown
1269/tcp open  unknown
1270/tcp open  ssserver
1343/tcp open  unknown
1345/tcp open  unknown
1351/tcp open  equationbuilder
1356/tcp open  cuillamartin
1420/tcp open  timbuktu-srv4
1432/tcp open  blueberry-lm
1541/tcp open  rds2
1590/tcp open  unknown
1698/tcp open  unknown
1743/tcp open  unknown
1760/tcp open  unknown
1772/tcp open  unknown
1773/tcp open  unknown
1812/tcp open  unknown
1823/tcp open  unknown
1825/tcp open  unknown
1842/tcp open  unknown
1859/tcp open  unknown
1900/tcp open  upnp
1907/tcp open  unknown
2002/tcp open  globe
2030/tcp open  device2
2031/tcp open  unknown
2032/tcp open  unknown
2033/tcp open  glogger
2035/tcp open  imsldoc
2058/tcp open  unknown
2078/tcp open  unknown
2093/tcp open  unknown
2159/tcp open  unknown
2168/tcp open  unknown
2169/tcp open  unknown
2180/tcp open  unknown
2185/tcp open  unknown
2186/tcp open  unknown
2219/tcp open  unknown
2221/tcp open  unknown
2228/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.16 seconds
me@server:~$

아, 훨씬 나아요.

이제 내 질문은 다음과 같습니다.첫 번째 시나리오에서는 열린 연결이 거의 없음에도 불구 ps axww|grep ssh_key_used_for_remote_connections|grep sshd|sed -e 's/^[ \t]*//'하고많은더 많은 SSH 연결이 실제로 열려 있으므로 연결이 백그라운드에서 자동으로 사라지는 것 같습니다.원격 기계가 알아차리지 못한 채.

A. 역방향 SSH 연결을 구현하는 더 좋은 방법이 있습니까?, 원격 시스템이 연결이 끊겼거나 중단된 것을 더 잘 인식할 수 있도록 내가 놓쳤을 수 있는 SSH 옵션과 같은 것이 있습니까? 다음은 역방향 SSH 터널을 열기 위해 원격 시스템에서 실행되는 스크립트입니다.

#!/bin/bash

while true
do
  ssh -i /some/dir/reverse-ssh.key -o TCPKeepAlive=yes -o ServerAliveInterval=5 -o ServerAliveCountMax=3 -nNTv -R $(grep -o "[0-9][0-9][0-9][0-9]" /some/dir/id):localhost:22 [email protected]
  sleep 30
done

그래서 나는 그것을 사용했습니다 -o TCPKeepAlive=yes -o ServerAliveInterval=5 -o ServerAliveCountMax=3. /some/dir/id각 시스템이 서버 관점에서 역방향 SSH 포트인 역방향 SSH 포트로 사용하는 4자리 숫자를 저장합니다.

B. 더 좋은 방법이 있나요?kill 오직역방향 연결이 응답하지 않음, 모든 "작동" 연결을 그대로 유지하시겠습니까? 이제 나는 그들을 모두 죽이는데 그것은 무례하고 잘못된 것 같습니다. ps포트 ID를 볼 수 없습니다. 어떻게든 내 서버의 역방향 SSH 포트와 SSH PID에 대한 연결을 설정해야 합니다.

조사해 봤지만 autossh이것은 내 스크립트가 수행하는 작업(?)을 다시 수행하는 것 같습니다.

mosh이는 UDP 연결(보통 전혀 통과하지 않음)과 60000 이상의 임의 포트(역시 통과하지 않음)를 사용하기 때문에 불가능합니다.

답변1

이것은 터널을 사용하는 과정을 보여줍니다:

netstat -tnp | grep :2219 | awk '{print $NF}'

끊어진 연결을 재현할 수는 없지만 이렇게 하면 작동할 것입니다.

for i in $(seq 2000 2030) do
  if !nmap -p $i localhost
    netstat -tnp | grep 2222 | grep '/ssh *$' | awk '{print $NF}' | sed -e 's#/ssh##' | xargs kill
  fi
end

답변2

hostname로컬 명령을 원격 터널 hostname(동일 구성 요소) 과 비교하여 역방향 터널 상태를 수동으로 확인하도록 클라이언트 스크립트를 변경하는 경우 :

#!/bin/bash

tunport=$(grep -o "[0-9][0-9][0-9][0-9]" /some/dir/id)
while true; do                    # -f (detached, foreground)
   ssh -i /some/dir/reverse-ssh.key -fnNT -R $tunport:localhost:22 [email protected]
   while true; do
      if [ "$(hostname)" = "$(ssh -p $tunport rsuname@$srvip hostname)" ]; then
         sleep 30
      else # kill local and remote process
          pkill -f "ssh .* -R $tunport:localhost"
          ssh [email protected] "lsof -ti tcp:$tunport | xargs -r kill"
          break # to tunnel re-init
      fi
   done
done

방탄 솔루션처럼 보이며 A와 B에 답변하고 tcpkeepalive, 클라이언트/서버 AliveInterval/countMax 옵션 및 관리 개입이 필요하지 않습니다.

관련 정보