NoctisNode
← RehberlerAğ2026-10-239 dk

caddy-l4 ile Caddy TCP reverse proxy ve SSH proxy

Çekirdek Caddy yalnızca HTTP proxy'ler. Ham TCP ve SSH için Caddy'yi caddy-l4 layer4 uygulamasıyla derleyin, portları iletin veya 443 portunu protokole göre SSH ile HTTPS arasında paylaştırın.

Kısaca: standart Caddy ham TCP veya SSH proxy'leyemez, çünkü `reverse_proxy`'si yalnızca HTTP konuşur. TCP iletmek için Caddy'yi xcaddy kullanarak caddy-l4 modülüyle (github.com/mholt/caddy-l4) derlersiniz, ardından `layer4` uygulamasını bir portu dinleyip bağlantıları proxy'leyecek şekilde yapılandırırsınız; isteğe bağlı olarak upstream'i protokole göre seçebilirsiniz, böylece SSH ve HTTPS 443 portunu paylaşabilir.

caddy-l4 ayrı bir modüldür, varsayılan Caddy dağıtımının parçası değildir ve README'si onu hâlâ yapılandırması sürümler arasında değişebilen, geliştirilmekte olan bir iş olarak tanımlar. Bu rehber, modülün belgelenmiş yapısına doğrudan karşılık gelen JSON yapılandırması kullanıyor. Yalnızca HTTP veya HTTPS proxy'ye ihtiyacınız varsa Caddy reverse proxy rehberi yeterlidir.

Çekirdek Caddy neden yalnızca HTTP

Caddy'nin yerleşik uygulamaları `http`, `tls` ve `pki`'dir. `reverse_proxy` handler'ı HTTP uygulamasının içinde yaşar, bu yüzden herhangi bir şeyi yönlendirmeden önce ayrıştırılmış bir HTTP isteğine ihtiyaç duyar. Bir SSH istemcisi, PostgreSQL istemcisi veya oyun protokolü hiçbir zaman böyle bir istek göndermez, dolayısıyla Caddy bir TLS veya HTTP hatasıyla yanıt verir.

caddy-l4, ham bağlantılar üzerinde çalışan ayrı bir `layer4` uygulaması ekler. Bir bağlantının ilk baytlarını eşleştirebilir (SSH banner'ı, SNI'lı TLS ClientHello, HTTP istek satırı, PostgreSQL başlangıcı ve daha fazlası), ardından proxy'leyebilir, TLS'i sonlandırabilir veya akışı başka bir handler'a devredebilir. `http` gibi bir uygulama olduğu için ikisi aynı süreçte çalışabilir.

İhtiyaçÇekirdek CaddyCaddy + caddy-l4
Auto TLS'li HTTPS reverse proxyEvetEvet
Düz TCP port iletimiHayırEvet (`proxy` handler'ı)
UDP iletimiHayırEvet (`udp/:port` dinleyerek)
SNI'ya göre TLS passthroughHayırEvet (`sni` ile `tls` matcher'ı)
Aynı portta SSH ve HTTPSHayırEvet (`ssh` ve `tls` matcher'ları)
Caddyfile desteğiTamKısmi; referans format JSON'dur

Caddy'yi layer4 modülüyle derleyin

xcaddy, Caddy'yi ek modüllerle derler. Alternatif olarak resmî Caddy indirme sayfasında `mholt/caddy-l4`'ü seçip hazır bir binary indirebilirsiniz. Her iki durumda da yapılandırma yazmadan önce `list-modules` ile `layer4` modüllerinin listelendiğini doğrulayın.

# 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

Paketlenmiş binary'yi güvenle değiştirin

Caddy resmî apt deposundan kurulduysa, özel bir build'i yerine koymanın belgelenmiş yolu `dpkg-divert` artı `update-alternatives`'tir; böylece paket yükseltmeleri binary'nizin üzerine yazmaz. Artık Caddy güncellemelerini almak için yeniden derlemeniz gerektiğini unutmayın.

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

Örnek 1: düz TCP reverse proxy

Bu yapılandırma 5432 portunu dinler ve her bağlantıyı özel bir adresteki PostgreSQL sunucusuna iletir — örneğin bir WireGuard tünelinin karşı ucu. Matcher olmaması, her bağlantının bu rotayı izlemesi demektir. Upstream'ler failover için birden fazla `dial` adresi kabul eder ve `proxy` handler'ı HTTP `reverse_proxy`'ye benzer yük dengeleme ve health check'leri destekler.

Backend istemcinin değil, Caddy'nin IP'sini görür. Backend PROXY protokolünü anlıyorsa, orijinal adresi iletmek için proxy handler'ında `"proxy_protocol": "v2"` ayarlayın.

{
  "apps": {
    "layer4": {
      "servers": {
        "postgres": {
          "listen": [":5432"],
          "routes": [
            {
              "handle": [
                {
                  "handler": "proxy",
                  "upstreams": [{"dial": ["10.8.0.2:5432"]}]
                }
              ]
            }
          ]
        }
      }
    }
  }
}

Örnek 2: 443 portunda multiplex edilmiş SSH ve HTTPS

SSH istemcileri bağlanır bağlanmaz sürüm banner'larını (`SSH-2.0-...`) gönderir, bu yüzden caddy-l4 herhangi bir sunucu yanıtından önce SSH'ı tanıyabilir. Aşağıdaki yapılandırma SSH'ı yerel sshd'ye, `git.example.com` için TLS'i kendi TLS'ini sonlandıran bir servise, diğer tüm TLS'i ise 8443'ü dinleyen Caddy HTTP uygulamasına gönderir. Artık 443 portu layer4'e ait olduğu için HTTP uygulaması onu da bağlamamalıdır: Caddyfile global seçeneklerinde `https_port 8443` ayarlayın (veya JSON'da eşdeğer `listen` adresini) ve HTTP-01 challenge'ları için 80 portunu açık tutun. `https_port 8443` ile Caddy'nin otomatik HTTP'den HTTPS'e yönlendirmesi 8443 portunu gösterir; bu yüzden `auto_https disable_redirects` ayarlayın ve kendi `http:// { redir https://{host}{uri} permanent }` sitenizi ekleyin.

SMTP, FTP veya MySQL gibi önce sunucunun konuştuğu protokoller bu şekilde algılanamaz, çünkü istemci sessizce bekler. Onlara ayrı bir port verin.

{
  "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"]}]}
              ]
            }
          ]
        }
      }
    }
  }
}

Çalıştırın ve test edin

  1. 01.JSON'ı `/etc/caddy/caddy.json` olarak kaydedin ve doğrulayın.
  2. 02.Servisi durdurun ve bağlanırken logu izlemek için Caddy'yi ön planda çalıştırın.
  3. 03.Systemd unit'ini bir drop-in override ile JSON dosyasına yönlendirin, ardından `sudo systemctl daemon-reload` ve `sudo systemctl start caddy` çalıştırın.
  4. 04.Her iki rotanın da çalıştığını doğrulamak için `ssh -p 443` ile bağlanın ve HTTPS sitesini tarayıcıda açın.
# 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]

Bunun yerine ne zaman HAProxy veya sslh kullanılmalı

caddy-l4, zaten Caddy çalıştırıyorsanız ve HTTPS ile birkaç TCP rotası için tek bir süreç istiyorsanız iyi bir seçimdir. TCP ağırlıklı bir kurulum için Debian ve Ubuntu depolarındaki olgun alternatifleri işletmek daha basit olabilir: `mode tcp`'deki HAProxy `req.ssl_sni` ile SNI'ya göre yönlendirir ve ayrıntılı istatistiklere ve health check'lere sahiptir; sslh ise yalnızca tek bir portu SSH, TLS, OpenVPN ve diğerleri arasında paylaştırmak için yapılmış küçük bir daemon'dur. Her ikisi de apt ile kurulur ve sistemin geri kalanıyla güncellenir; bakımı gereken özel bir build yoktur.

SSH'ı 443'te açmak yalnızca web portlarına izin veren ağlarda işe yarar, ama bu bir güvenlik özelliği değildir. SSH sıkılaştırma rehberindeki yalnızca anahtarla kimlik doğrulamayı koruyun. Bir NoctisNode VPS'inde tam root'unuz var, dolayısıyla bu araçlardan herhangi biri ihtiyacınız olan portları bağlayabilir; HTTPS tarafındaki sertifika davranışı için bkz. Caddy otomatik HTTPS, container'lar için ise Docker reverse proxy olarak Caddy.

AraçGüçlü yanlarıÖdünler
Caddy + caddy-l4Auto HTTPS ve TCP için tek süreç, protokol matcher'ları, JSON APIÖzel build, modül hâlâ gelişiyor
HAProxyOlgun TCP/HTTP proxy, SNI yönlendirme, zengin health check'ler ve istatistiklerDaha fazla yapılandırma, yerleşik ACME istemcisi yok
sslhSSH/TLS/VPN için küçük, amaca özel port paylaşımıYalnızca multiplex eder; TLS sonlandırma veya yük dengeleme yok

SSS

QCaddy TCP trafiğini proxy'leyebilir mi?

AKutudan çıktığı haliyle hayır. Çekirdek Caddy yalnızca HTTP proxy'ler; ham TCP veya UDP için üçüncü taraf caddy-l4 (layer4) modülünü içeren bir Caddy build'ine ihtiyacınız var.

QSSH'ı Caddy üzerinden nasıl proxy'lerim?

ACaddy'yi caddy-l4 ile derleyin, `ssh` eşleştirip `127.0.0.1:22`'ye proxy'leyen bir layer4 sunucusu ekleyin, ardından `ssh -p <port>` ile bağlanın. 443 portunda bunu bir `tls` rotasıyla birleştirebilirsiniz, böylece HTTPS çalışmaya devam eder.

QSSH ve HTTPS 443 portunu paylaşabilir mi?

AEvet. caddy-l4, sslh ve HAProxy bir bağlantının ilk baytlarını inceleyip SSH ve TLS'i aynı porttaki farklı backend'lere yönlendirebilir.

Qcaddy-l4 Caddyfile'ı destekliyor mu?

A`layer4` global seçeneği üzerinden Caddyfile desteği vardır, ancak JSON en eksiksiz ve en iyi belgelenmiş format olmaya devam ediyor. Derlediğiniz sürüm için modülün README'sine bakın.

caddy-l4 ile Caddy TCP reverse proxy ve SSH proxy · NoctisNode