私のサーバーへのリバース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オプション、管理介入は必要ありません。