caddy-l4 के साथ Caddy TCP Reverse Proxy और SSH प्रॉक्सी
मूल Caddy सिर्फ़ HTTP प्रॉक्सी करता है। raw TCP और SSH के लिए Caddy को caddy-l4 layer4 ऐप के साथ बिल्ड करें, पोर्ट फ़ॉरवर्ड करें, या प्रोटोकॉल के आधार पर SSH और HTTPS के बीच पोर्ट 443 साझा करें।
संक्षेप में: सामान्य Caddy raw TCP या SSH प्रॉक्सी नहीं कर सकता, क्योंकि उसका `reverse_proxy` सिर्फ़ HTTP बोलता है। TCP फ़ॉरवर्ड करने के लिए xcaddy से Caddy को caddy-l4 मॉड्यूल (github.com/mholt/caddy-l4) के साथ बिल्ड करें, फिर उसके `layer4` ऐप को किसी पोर्ट पर listen करने और कनेक्शन प्रॉक्सी करने के लिए कॉन्फ़िगर करें — चाहें तो प्रोटोकॉल के आधार पर upstream चुनें, ताकि SSH और HTTPS पोर्ट 443 साझा कर सकें।
caddy-l4 एक अलग मॉड्यूल है, डिफ़ॉल्ट Caddy डिस्ट्रीब्यूशन का हिस्सा नहीं, और उसका README अब भी उसे work in progress बताता है जिसका कॉन्फ़िग वर्ज़न के बीच बदल सकता है। यह गाइड JSON कॉन्फ़िग इस्तेमाल करता है, जो सीधे मॉड्यूल की दस्तावेज़ित संरचना से मेल खाता है। अगर आपको सिर्फ़ HTTP या HTTPS प्रॉक्सी चाहिए, तो Caddy reverse proxy गाइड ही काफ़ी है।
मूल Caddy सिर्फ़ HTTP क्यों है
Caddy के बिल्ट-इन ऐप `http`, `tls` और `pki` हैं। `reverse_proxy` हैंडलर HTTP ऐप के अंदर रहता है, इसलिए कुछ भी रूट करने से पहले उसे पार्स की हुई HTTP रिक्वेस्ट चाहिए। SSH क्लाइंट, PostgreSQL क्लाइंट या कोई गेम प्रोटोकॉल ऐसी रिक्वेस्ट कभी नहीं भेजता, इसलिए Caddy TLS या HTTP एरर के साथ जवाब देगा।
caddy-l4 एक अलग `layer4` ऐप जोड़ता है जो raw कनेक्शन पर काम करता है। यह कनेक्शन के पहले बाइट्स मैच कर सकता है (SSH बैनर, SNI वाला TLS ClientHello, HTTP रिक्वेस्ट लाइन, PostgreSQL startup और भी बहुत कुछ), फिर प्रॉक्सी कर सकता है, TLS टर्मिनेट कर सकता है या स्ट्रीम किसी दूसरे हैंडलर को सौंप सकता है। चूँकि यह `http` जैसा ही एक ऐप है, दोनों एक ही प्रोसेस में चल सकते हैं।
| ज़रूरत | मूल Caddy | Caddy + caddy-l4 |
|---|---|---|
| ऑटो TLS के साथ HTTPS reverse proxy | हाँ | हाँ |
| सादा TCP पोर्ट फ़ॉरवर्डिंग | नहीं | हाँ (`proxy` हैंडलर) |
| UDP फ़ॉरवर्डिंग | नहीं | हाँ (`udp/:port` पर listen) |
| SNI के आधार पर TLS passthrough | नहीं | हाँ (`sni` के साथ `tls` मैचर) |
| एक ही पोर्ट पर SSH और HTTPS | नहीं | हाँ (`ssh` और `tls` मैचर) |
| Caddyfile सपोर्ट | पूरा | आंशिक; JSON संदर्भ फ़ॉर्मेट है |
layer4 मॉड्यूल के साथ Caddy बिल्ड करें
xcaddy अतिरिक्त मॉड्यूल के साथ Caddy कंपाइल करता है। विकल्प के तौर पर, आधिकारिक Caddy डाउनलोड पेज पर `mholt/caddy-l4` चुनें और तैयार बाइनरी डाउनलोड करें। दोनों ही मामलों में कॉन्फ़िग लिखने से पहले `list-modules` से पुष्टि करें कि `layer4` मॉड्यूल सूची में हैं।
# Current Caddy needs a recent Go toolchain; distro golang-go packages are
# often too old, so install the latest release from https://go.dev/dl/
# and make sure /usr/local/go/bin is in PATH, then:
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
# Build Caddy with the layer4 app
~/go/bin/xcaddy build --with github.com/mholt/caddy-l4
# Confirm the modules are present
./caddy list-modules | grep layer4पैकेज वाली बाइनरी को सुरक्षित रूप से बदलें
अगर Caddy आधिकारिक apt रिपॉज़िटरी से इंस्टॉल हुआ था, तो कस्टम बिल्ड लगाने का दस्तावेज़ित तरीका `dpkg-divert` और `update-alternatives` है, ताकि पैकेज अपग्रेड आपकी बाइनरी को ओवरराइट न करें। याद रखें कि अब Caddy अपडेट पाने के लिए आपको दोबारा बिल्ड करना होगा।
sudo dpkg-divert --divert /usr/bin/caddy.default --rename /usr/bin/caddy
sudo mv ./caddy /usr/bin/caddy.custom
sudo update-alternatives --install /usr/bin/caddy caddy /usr/bin/caddy.default 10
sudo update-alternatives --install /usr/bin/caddy caddy /usr/bin/caddy.custom 50
sudo systemctl restart caddyउदाहरण 1: सादा TCP reverse proxy
यह कॉन्फ़िग पोर्ट 5432 पर listen करता है और हर कनेक्शन को किसी निजी एड्रेस पर PostgreSQL सर्वर तक भेजता है, जैसे WireGuard टनल का दूसरा छोर। कोई मैचर न होने का मतलब है कि हर कनेक्शन यही रूट लेता है। Upstream फ़ेलओवर के लिए कई `dial` एड्रेस स्वीकार करते हैं, और `proxy` हैंडलर HTTP `reverse_proxy` की तरह लोड बैलेंसिंग और हेल्थ चेक सपोर्ट करता है।
बैकएंड को क्लाइंट का नहीं, Caddy का IP दिखता है। अगर बैकएंड PROXY प्रोटोकॉल समझता है, तो मूल एड्रेस आगे भेजने के लिए proxy हैंडलर पर `"proxy_protocol": "v2"` सेट करें।
{
"apps": {
"layer4": {
"servers": {
"postgres": {
"listen": [":5432"],
"routes": [
{
"handle": [
{
"handler": "proxy",
"upstreams": [{"dial": ["10.8.0.2:5432"]}]
}
]
}
]
}
}
}
}
}उदाहरण 2: पोर्ट 443 पर SSH और HTTPS मल्टीप्लेक्स
SSH क्लाइंट कनेक्ट होते ही अपना वर्ज़न बैनर (`SSH-2.0-...`) भेजते हैं, इसलिए caddy-l4 सर्वर के किसी जवाब से पहले ही SSH पहचान लेता है। नीचे दिया कॉन्फ़िग SSH को लोकल sshd पर, `git.example.com` के TLS को ऐसी सर्विस पर जो अपना TLS ख़ुद टर्मिनेट करती है, और बाक़ी सारे TLS को 8443 पर listen कर रहे Caddy के HTTP ऐप पर भेजता है। चूँकि अब पोर्ट 443 layer4 के पास है, HTTP ऐप को उसे bind नहीं करना चाहिए: Caddyfile के ग्लोबल विकल्पों में `https_port 8443` सेट करें, या JSON में उसके बराबर `listen` एड्रेस, और HTTP-01 चैलेंज के लिए पोर्ट 80 खुला रखें। `https_port 8443` के साथ Caddy का ऑटोमैटिक HTTP-से-HTTPS रीडायरेक्ट पोर्ट 8443 की ओर जाएगा, इसलिए `auto_https disable_redirects` सेट करें और अपनी `http:// { redir https://{host}{uri} permanent }` साइट जोड़ें।
जिन प्रोटोकॉल में पहले सर्वर बोलता है, जैसे SMTP, FTP या MySQL, उन्हें इस तरह पहचाना नहीं जा सकता, क्योंकि क्लाइंट चुपचाप इंतज़ार करता है। उन्हें उनका अपना पोर्ट दें।
{
"apps": {
"layer4": {
"servers": {
"mux443": {
"listen": [":443"],
"routes": [
{
"match": [{"ssh": {}}],
"handle": [
{"handler": "proxy", "upstreams": [{"dial": ["127.0.0.1:22"]}]}
]
},
{
"match": [{"tls": {"sni": ["git.example.com"]}}],
"handle": [
{"handler": "proxy", "upstreams": [{"dial": ["127.0.0.1:3443"]}]}
]
},
{
"match": [{"tls": {}}],
"handle": [
{"handler": "proxy", "upstreams": [{"dial": ["127.0.0.1:8443"]}]}
]
}
]
}
}
}
}
}चलाएँ और टेस्ट करें
- 01.JSON को `/etc/caddy/caddy.json` के रूप में सेव करें और वैलिडेट करें।
- 02.सर्विस रोकें और Caddy को foreground में चलाएँ ताकि कनेक्ट करते समय लॉग देख सकें।
- 03.drop-in override से systemd यूनिट को JSON फ़ाइल की ओर पॉइंट करें, फिर `sudo systemctl daemon-reload` और `sudo systemctl start caddy` चलाएँ।
- 04.`ssh -p 443` से कनेक्ट करें और ब्राउज़र में HTTPS साइट खोलकर पुष्टि करें कि दोनों रूट काम करते हैं।
# Validate and test in the foreground first
sudo caddy validate --config /etc/caddy/caddy.json
sudo systemctl stop caddy
sudo caddy run --config /etc/caddy/caddy.json
# Make the service use the JSON file: sudo systemctl edit caddy
[Service]
ExecStart=
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/caddy.json
ExecReload=
ExecReload=/usr/bin/caddy reload --config /etc/caddy/caddy.json --force
# Client side
ssh -p 443 [email protected]इसके बजाय HAProxy या sslh कब इस्तेमाल करें
caddy-l4 तब बढ़िया है जब आप पहले से Caddy चलाते हैं और HTTPS व कुछ TCP रूट के लिए एक ही प्रोसेस चाहते हैं। TCP-प्रधान सेटअप के लिए Debian और Ubuntu रिपॉज़िटरी के परिपक्व विकल्प चलाने में आसान हो सकते हैं: `mode tcp` में HAProxy `req.ssl_sni` से SNI के आधार पर रूट करता है और विस्तृत stats व हेल्थ चेक देता है, जबकि sslh एक छोटा daemon है जो सिर्फ़ SSH, TLS, OpenVPN और अन्य के बीच एक पोर्ट साझा करने के लिए बना है। दोनों apt से इंस्टॉल होते हैं और बाक़ी सिस्टम के साथ अपडेट होते हैं, किसी कस्टम बिल्ड को संभालने की ज़रूरत नहीं।
443 पर SSH एक्सपोज़ करना उन नेटवर्क पर मदद करता है जो सिर्फ़ वेब पोर्ट की अनुमति देते हैं, लेकिन यह कोई सुरक्षा फ़ीचर नहीं है। SSH हार्डनिंग गाइड के अनुसार सिर्फ़-की वाला ऑथेंटिकेशन बनाए रखें। NoctisNode VPS पर आपके पास पूरा root है, इसलिए इनमें से कोई भी टूल ज़रूरी पोर्ट bind कर सकता है; HTTPS की ओर सर्टिफ़िकेट के व्यवहार के लिए Caddy ऑटोमैटिक HTTPS और कंटेनरों के लिए Docker reverse proxy के रूप में Caddy देखें।
| टूल | ख़ूबियाँ | कमियाँ |
|---|---|---|
| Caddy + caddy-l4 | ऑटो HTTPS और TCP के लिए एक प्रोसेस, प्रोटोकॉल मैचर, JSON API | कस्टम बिल्ड, मॉड्यूल अभी विकसित हो रहा है |
| HAProxy | परिपक्व TCP/HTTP प्रॉक्सी, SNI रूटिंग, समृद्ध हेल्थ चेक और stats | ज़्यादा कॉन्फ़िग, बिल्ट-इन ACME क्लाइंट नहीं |
| sslh | छोटा, SSH/TLS/VPN के लिए ख़ास बना पोर्ट-शेयरिंग टूल | सिर्फ़ मल्टीप्लेक्स करता है; TLS टर्मिनेशन या लोड बैलेंसिंग नहीं |
अक्सर पूछे जाने वाले सवाल
Qक्या Caddy TCP ट्रैफ़िक प्रॉक्सी कर सकता है?
Aसीधे-सीधे नहीं। मूल Caddy सिर्फ़ HTTP प्रॉक्सी करता है; raw TCP या UDP के लिए आपको ऐसा Caddy बिल्ड चाहिए जिसमें थर्ड-पार्टी caddy-l4 (layer4) मॉड्यूल शामिल हो।
QCaddy से SSH कैसे प्रॉक्सी करें?
ACaddy को caddy-l4 के साथ बिल्ड करें, एक layer4 सर्वर जोड़ें जो `ssh` मैच करे और `127.0.0.1:22` पर प्रॉक्सी करे, फिर `ssh -p <port>` से कनेक्ट करें। पोर्ट 443 पर आप इसे `tls` रूट के साथ जोड़ सकते हैं ताकि HTTPS भी चलता रहे।
Qक्या SSH और HTTPS पोर्ट 443 साझा कर सकते हैं?
Aहाँ। caddy-l4, sslh और HAProxy तीनों कनेक्शन के पहले बाइट्स जाँचकर एक ही पोर्ट पर SSH और TLS को अलग-अलग बैकएंड पर रूट कर सकते हैं।
Qक्या caddy-l4 Caddyfile सपोर्ट करता है?
Aइसमें `layer4` ग्लोबल विकल्प के ज़रिए Caddyfile सपोर्ट है, लेकिन JSON ही सबसे पूर्ण और सबसे अच्छी तरह दस्तावेज़ित फ़ॉर्मेट है। आप जो वर्ज़न बिल्ड करते हैं, उसके लिए मॉड्यूल का README देखें।