HTTPS के जरिए SSH कनेक्शन
(trofi.github.io)- सीमित नेटवर्क में
SSHपोर्ट ब्लॉक होने पर भी HTTPS 443 पोर्ट औरCONNECTmethod से remote access का रास्ता बनाया जा सकता है - सर्वर
apache2केmod_proxy_connectसेCONNECTखोलता है, लेकिन proxy का दायरा सीमित करने के लिए केवल ssh-server:22 target की अनुमति देता है - क्लाइंट OpenSSH के ProxyCommand को
socatसे जोड़ता है, और HTTPS में script सीधेCONNECTheader भेजती है - कुछ firewall या
httpdidle connection बंद कर सकते हैं, इसलिएServerAliveInterval 30से session बनाए रखने में मदद मिलती है - यह तरीका
SSHकोTLSके अंदर encapsulate करके blocking से बचना आसान बनाता है, लेकिन double encryption और client configuration का बोझ रहता है
सीमित नेटवर्क में SSH access path बनाना
- अस्पताल के Wi-Fi environment में अधिकांश connection types block थे, और मुख्य रूप से
HTTPका TCP 80 औरHTTPSका TCP 443 ही allow था DNSका UDP 53 औरDoTका TCP 853 जाने-माने DNS providers के लिए काम करते दिखेSSHTCP 22 और अधिकांश custom ports पर पूरी तरह block था- remote server को फिर से configure करने के लिए
GSMalternative connection था, इसलिए कई bypass methods test किए जा सके
एक port share करना और protocol encapsulation
- एक ही port पर
SSHऔरHTTPSदोनों receive करके transparently route करने का तरीका मौजूद है- sslh project heuristics से protocol का अनुमान लगाकर वास्तविक backend यानी
SSH,HTTPSया supported protocol पर redirect करता है - फायदा यह है कि
sshclient में कोई खास setting की जरूरत नहीं होती, केवल non-default port specify करना होता है - नुकसान यह है कि अतिरिक्त service setup करनी पड़ती है,
HTTPSको भीsslhसे गुजरना पड़ता है, और backend पर connection का original address छिप सकता है, जिससे logging असुविधाजनक हो सकती है
- sslh project heuristics से protocol का अनुमान लगाकर वास्तविक backend यानी
- दूसरा विकल्प एक protocol को दूसरे protocol के अंदर पूरी तरह encapsulate करना है
- OpenSSH का
ProxyCommanduser कोsshprotocol के लिए इस्तेमाल होने वाला transport तय करने देता है - heuristics के बिना
SSHको किसी दूसरे stream के अंदर wrap किया जाता है, इसलिए DPI software के लिए इसे block करना ज्यादा मुश्किल हो सकता है HTTPSखुद redirect नहीं होता और प्रभावित नहीं होता- बदले में double encryption से performance घट सकती है, और client configuration जरूरी है
- OpenSSH का
SSH over HTTP configuration
- पहले
SSHकोHTTPके जरिए pass कराने का तरीका आजमाया गया - server-side
apache2configuration मेंmod_proxy_connectload किया गया, औरAllowCONNECT 22से port 22 CONNECT allow किया गया <Proxy *>को default रूप से सब deny करने के लिए रखा गया, और target कोssh-server:22तक सीमित करने के लिए केवल<Proxy ssh-server>allow किया गया- client-side
.ssh/configमेंProxyCommandके भीतरsocatकाPROXY:http-server:%h:%p,proxyport=80इस्तेमाल किया गया - इस setup से
$ ssh ssh-via-httpचलाने पर port 80 के जरिएSSHसे connect किया जा सकता है ServerAliveInterval 30बीच के रास्ते में idleHTTPconnection के चुपचाप बंद होने से बचने के लिए समय-समय पर probe भेजता है- default
httpdTimeOut 60इस्तेमाल करता है, जो input/output न होने की स्थिति 60 सेकंड तक रहने पर tunnel बंद कर देता है
SSH over HTTPS configuration
- पता चला कि
socatCONNECTmethod के जरिएHTTPSproxy support नहीं करता, केवलHTTPsupport करता है - इसके बजाय
socatकी TLS encapsulation capability इस्तेमाल की गई, औरCONNECT-based request script में सीधे implement की गई ~/.ssh/https-tunnel.bashइस flow में काम करता है- पहले
CONNECT ssh-server:22 HTTP/1.1header औरHost: ssh-serveroutput करता है - इसके बाद standard input को जस का तस आगे जोड़ता है
- पूरा stream
socat - "SSL:$3:$4"को pass किया जाता है, जिससे TLS connection बनता है
- पहले
.ssh/configमेंHost ssh-via-httpsके लिएProxyCommand ~/.ssh/https-tunnel.bashspecify किया गया$ ssh ssh-via-httpsचलाने पर उम्मीद के मुताबिकHTTPStunnel के जरिएssh-serverसे connection बनता है
संचालन के दौरान ध्यान देने वाली बातें
- जिन environments में
HTTPSव्यापक रूप से allow होता है, वहां बहुत restrictive intermediate equipment से होकर data भेजा जा सकता है CONNECTmethod पुराने अवशेष जैसा दिख सकता है, लेकिन arbitrary TCP payload stream कोTLShost stream के अंदर wrap करने में उपयोगी हैServerAliveIntervalतब OpenSSH connection बनाए रखने में मदद करता है जब lower transport layer idle connections के लिए अनुकूल नहीं होतीnginxconfiguration variant CONNECT passthrough on nginx में है
1 टिप्पणियां
Hacker News की राय
लेख में “HTTPS हर जगह मौजूद है, इसलिए बहुत सीमित middleboxes भी डेटा को गुजरने दे सकते हैं” वाला हिस्सा ही वह वजह है कि लगभग हर proprietary VPN protocol, यानी तथाकथित “SSL VPN”, HTTPS पर tunnel खोलने वाला mode implement करता है
भले ही यह default behavior न हो, कम-से-कम इसे fallback path के रूप में रखते हैं, ताकि दुनिया भर के इंटरनेट पर लगभग किसी भी connection में काम करने वाला mode मिल सके
मैं https://gitlab.com/openconnect/openconnect के मुख्य developers में से एक हूं, जो कई TLS-based VPN protocols implement करता है, और मैंने https://github.com/dlenski/what-vpn भी बनाया है, जो और अधिक TLS-based VPN server types को detect और identify करता है
पहले Netherlands की इंटरनेट provider XS4ALL बिल्कुल यही feature देती थी
वह port 80 पर SSH access खोलकर देती थी, और यात्रा के दौरान जब hotel WiFi ने port 80 के अलावा सब कुछ block कर दिया था, तब इसने कई बार मदद की
हालांकि KPN के नजरिए से, XS4ALL की hacker culture शायद शुरू से ही comfortable नहीं रही होगी
यह 1960s की pirate radio culture के दोबारा बनने जैसा लगता था
https://en.wikipedia.org/wiki/Pirate_radio_in_Europe
https://www.shodan.io/search/facet?query=ssh&facet=port
https://www.shodan.io/search/facet.png?query=ssh&facet=port
इसके उलट port 80 काफी कम common है
मुझे याद है कि पहले मैं उसे सिर्फ newsgroup provider के रूप में इस्तेमाल करता था
एक तीसरा विकल्प भी अक्सर होता है: किसी दूसरे host के port 80 या 443 पर SSH चलाकर, वहां से destination तक ProxyJump इस्तेमाल करना
या उस host पर SOCKS खोलकर कुल मिलाकर कम-filtered इंटरनेट connection भी पाया जा सकता है
मैं SOCKS इस्तेमाल करता हूं, और SSH connection के port forwarding से TLS-based DNS भी भेजता हूं
कुछ साल पहले जब मैंने पहली बार SOCKS proxy setup किया और WiFi काफी इस्तेमाल किया, तो मुझे port check करने से आगे जाने वाली कोई जगह नहीं दिखी, लेकिन ऐसे devices मौजूद हैं और अब शायद ज्यादा common भी हों
इसलिए मैंने बस अपने server पर SSH से connect किया और हमेशा की तरह इस्तेमाल किया
बाद में जब मैंने Windows
.isofiles का archive बनाया, उन्हें laptop पर download किया औरscpसे server पर upload किया, तो शायद non-80/443 port पर upload और download मिलाकर दर्जनों GB traffic traffic inspection trigger करने के लिए काफी था, इसलिए दोपहर तक IT ने port 22 block कर दियालेकिन उन्होंने बाकी ports block नहीं किए थे, इसलिए मैंने port forwarding में SSH को 443 पर move किया और इस्तेमाल जारी रखा
उसके बाद school IT ने 443 पर SSH इस्तेमाल होते पकड़ लिया और 80/443 पर SSH block करने के लिए basic traffic analysis लगाया, लेकिन फिर भी बाकी सारे ports खुले थे
आखिर में उन्होंने मेरे server को IP level पर block कर दिया, लेकिन बाकी सभी IP खुले थे
VPS के जरिए ProxyJump इस्तेमाल करके bypass किया जा सकता था, लेकिन यह early college high school program था, इसलिए दूसरे साल के बाद मैं school में मुश्किल से जाता था, तो मेहनत करने लायक ज्यादा फायदा नहीं था
अगली बार जाने पर मैं यह साबित करने के लिए try करने वाला हूं कि यह संभव है, और अगर वे सभी ports पर SSH block कर दें, तो VPS पर HTTPS over SSH चढ़ा दूंगा
graduation के बाद guest WiFi पर क्या-क्या संभव है, यह फिर से देखने का सोच रहा हूं
थोड़ा खुले तौर पर promotion है, लेकिन Adaptive [1] में हम data security infrastructure बना रहे हैं
हमारे एक product में SSH और कई दूसरे protocols को HTTP/3 के ऊपर forward किया जाता है, ताकि users एक single outbound port से databases, servers और अन्य resources से connect कर सकें
Ngrok जैसी चीजों से मिलता-जुलता है, लेकिन self-host किया जा सकता है, और passwordless access या temporary credentials और maker-checker protection जोड़े जा सकते हैं
[1] https://adaptive.live/
असल में
opensshको सिर्फ port 443 पर listen करवाने से ही ज्यादातर firewalls bypass किए जा सकते थेअच्छा है। अजीब बात है कि मैंने
CONNECTmethod को forward proxy नहीं बल्कि reverse proxy की तरह कभी सोचा ही नहीं थाहालांकि मेरे मामले में सिर्फ
CONNECTकाफी नहीं था, इसलिए company proxy को पार करने के लिए मैंने WebSocket के ऊपर SSH इस्तेमाल कियावह proxy custom CA से HTTPS connections inspect करती थी
मैंने
socatमें बदलाव करके Apache के जरिए अपना SSH server WebSocket के रूप में expose किया, और client side पर इसे OpenSSH केProxyCommandके साथ इस्तेमाल कियामैं सोचता रहता हूं कि वह patch upload करूं, लेकिन
websocatजैसे दूसरे विकल्प भी हैंलगभग 20 साल पहले कंपनी के firewall में रास्ता निकालने के लिए मैंने ठीक यही काम करने वाला tool corkscrew[0] इस्तेमाल किया था
standalone implementation और लेख साफ-सुथरे हैं
0: https://github.com/bryanpkc/corkscrew
corkscrewसिर्फ खास conditions में काम करता है: आप HTTP proxy के पीछे हों, और वह HTTP proxyCONNECTmethod को support करता होकरीब 20 साल पहले एक छोटे contract काम के दौरान पहली condition थी, लेकिन दूसरी नहीं थी
सौभाग्य से ऐसे मामलों में भी इस्तेमाल किए जा सकने वाले tools हैं, हालांकि server-side setup चाहिए
https://github.com/larsbrinkhoff/httptunnel
कुल मिलाकर HTTP/2 के जरिए tunneling अच्छा विकल्प साबित होता है
HTTP/2 के ऊपर बना remote procedure call protocol gRPC[1] है
क्योंकि HTTP/2 एक ही TCP connection का उपयोग करके कई data structures को साथ-साथ भेजने और पाने वाली multiplexing में मजबूत है
हालांकि QUIC खुद multiplexing देता है, इसलिए HTTP/3 इस्तेमाल करने की वजह शायद न हो
आगे चलकर, क्योंकि middlebox बनाने वाले भेदभाव करना बंद नहीं कर पाएंगे, ज्यादातर communication encrypted HTTP/2 और QUIC के ऊपर चला जाएगा ऐसा लगता है
active probing[2] को कम करने के लिए random, शायद AI-generated HTTP/2·HTTP/3 content serve करना पड़ सकता है
[1] <https://grpc.io>
[2] <https://blog.torproject.org/learning-more-about-gfws-active-...>
HTTP खुद पहले से request/response protocol है, और मूल रूप से remote procedure calls के लिए इस्तेमाल किया जा सकता है
HTTP 1, 2, 3 में से कोई भी हो, बड़ा फर्क नहीं दिखता
उस protocol का evolution भी कुछ हद तक संदिग्ध है, और remote procedure call environment में जिन चीजों की जरूरत नहीं होती, उनका इस्तेमाल कराने के लिए design किया गया पहलू इसमें है
मूल रूप से यह local service नहीं, बल्कि public internet के लिए design की गई चीज के ज्यादा करीब है
HTTP/3 QUIC के ऊपर चलता है
मैं इसके उलट SSH के ऊपर HTTP को ज्यादा पसंद करता हूं
आधा मजाक है, लेकिन अच्छा होगा अगर browser में SSH जैसी identity management built-in हो
public key HTTP authentication proposal hobo पहली बार पढ़कर मैं उत्साहित हुआ था, लेकिन पता चला कि न server implementation है और न browser client implementation
JavaScript implementation है, लेकिन वह वह रूप नहीं था जो मैं चाहता था
ssh -D “*:8080” hostयह command port 8080 पर SOCKS proxy चलाती है
Firefox में मैं इसे हमेशा इस्तेमाल करता हूं, और यह original-style VPN की तरह काम करता है
संदिग्ध use cases के लिए भी सुविधाजनक है, लेकिन AWS के private network में मौजूद rmq dashboard तक पहुंचने के लिए भी इस्तेमाल करता हूं
https://techcommunity.microsoft.com/t5/iis-support-blog/clie...
जरूरतों पर फिट बैठता है या नहीं, इतना detail में नहीं जानता, लेकिन university के समय server authentication के लिए इसे इस्तेमाल किया था
ssh://google.comसंभव होताhttps://news.ycombinator.com/item?id=38664729
sslhको प्यार क्यों नहीं मिलता?यह HTTP, TLS/SSL(SNI और ALPN सहित), SSH, OpenVPN, tinc, XMPP, SOCKS5 को detect करता है, और regex से जांचे जा सकने वाले दूसरे protocols को भी पहचान सकता है
classic use case port 443 पर कई services को साथ में serve करना है
उदाहरण के लिए, company firewall के अंदर से SSH से connect करते हुए भी उसी port पर HTTPS लगातार serve कर सकते हैं
https://www.rutschle.net/tech/sslh/README.html
sslhऔर पूरी encapsulation में से क्या चुनना है, इस पर थापूरी encapsulation चुनने की वजह शायद यह थी कि configure करने वाली एक service कम हो जाती है, HTTP server connection handle करता है इसलिए logs में remote address सही रहता है, और शायद hacker spirit के हिसाब से existing solution से ज्यादा नया solution पसंद आता है