У меня вопрос по обратному туннелю SSH.
У меня есть сервер Ubuntu с установленным sshd.
Я открываю обратный туннель SSH с удаленной машины. На этой машине соединение перезапускается каждый раз, когда туннель прерывается.
Всякий раз, когда открывается туннель, на сервере SSH я вижу два соединения, когда я использую netstat
. Одно соединение прослушивает порт внутреннего сервера. Другой слушает на внешнем порту. Последний - туннель SSH.
Как пример:
учитывая 203.0.113.10: мой SSH-сервер и 10.34.23.12 мой удаленный ПК, 5000 порт на моем удаленном ПК, к которому я хотел бы получить доступ
ssh -R 1122:localhost:5000 serveruser@203.0.113.10
Теперь на стороне сервера есть два прослушивающих соединения, которые выглядят так
tcp6 0 :::1122 :::* LISTEN
tcp6 0 0 203.0.113.10:22 10.34.23.12:62734 ESTABLISHED
Я использую / запускаю команду nc
с сервера, чтобы проверить работоспособность туннеля
nc -z -v -w5 127.0.0.1 1122
Иногда случается, что внешнее соединение умирает, поэтому мой вывод netstat
будет
`tcp6 0 0 203.0.113.10:22 10.34.23.12:62734 ESTABLISHED`
Есть ли способ проверить, какой туннель не имеет прослушивания внешнего порта?
Я имею в виду, есть ли способ проверить, когда умирает мой порт 1122?
Моим решением было бы уничтожить процесс sshd, связанный с туннелем без какого-либо внешнего порта (10.34.23.12:62734). Проблема в том, что у меня есть другой SSH-туннель на этой машине, который я не хотел бы убивать, поэтому killall sshd
не будет вариантом.
Спасибо!
Изменить 1:
Возможное решение: команда netstat -lptun (и предложенный Полом netstat -pant) выполняет связывание, которое мне нужно для решения этой проблемы. Сейчас я тестирую это решение в производстве.
#!/bin/sh
for pid in `lsof -i -n | egrep '\<ssh\>' | awk '{print $2}'`; do
foundpid="$(netstat -lptun | grep :::11 | grep $pid)"
if [ -z "$foundpid" ]
then
echo PID does not have any external port, killing the pid $pid
kill $pid
fi
done