मैंने SSH रिवर्स टनल के बारे में एक सवाल किया है।
मेरे पास एक Ubuntu सर्वर है जिसमें sshd स्थापित है।
मैं एक दूरस्थ मशीन से एक SSH रिवर्स सुरंग खोलता हूं। उस मशीन पर हर बार सुरंग के बाधित होने पर कनेक्शन को फिर से चालू किया जाता है।
जब भी कोई सुरंग खोली जाती है, SSH सर्वर पर मैं दो कनेक्शन देख सकता हूं जब मैं उपयोग कर रहा हूं netstat
। एक कनेक्शन आंतरिक सर्वर पोर्ट को सुन रहा है। दूसरा बाहरी पोर्ट पर सुन रहा है। बाद वाला एसएसएच सुरंग है।
उदाहरण के रूप में:
दिया गया 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 पोर्ट की मृत्यु हो जाती है, तो क्या इसकी जांच करने का कोई तरीका है?
मेरा समाधान किसी बाहरी बंदरगाह (10.34.23.12:6274) के बिना सुरंग में बंधी sshd प्रक्रिया को मार देगा। समस्या यह है कि मैं इस मशीन पर एक अन्य एसएसएच सुरंग है, जिसे मैं मारना नहीं चाहूंगा 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
netstat -pant
, क्या दोनों एक ही प्रक्रिया के स्वामित्व वाली नेटस्टैट लाइनें हैं, और दूसरी ssh प्रक्रिया के लिए अलग जिसे आप रखना चाहते हैं?