web-dev-qa-db-ja.com

特定のリバース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:~$

OK、すべての接続が失われました:

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。killonly応答しない逆接続、すべての「機能している」接続を残すより良い方法はありますか無傷?今のところ私はそれらすべてを殺します、しかしそれは粗雑で間違っているようです。 psではポートIDが表示されないため、サーバーでリバースsshポートとsshのPIDを接続する必要があります。

autosshを調べましたが、スクリプトが実行することをやり直しているようです(?)。

moshは、UDP接続(多くの場合、まったく通過しない)と60000を超えるランダムポート(どちらも通過しない)を使用するため、問題外です。

6
Christian

たぶん、クライアントスクリプトを変更して、コマンドhostnamelocalyとremote-over-tunnelhostname(同じcomp)を比較して、リバーストンネルステータスを手動でチェックする場合:

#!/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オプション、および管理者の介入の必要性を排除します。

1
Asain Kujovic

これにより、トンネルを使用するプロセスが表示されます。

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
1
Wayne Walker