|
|
|

|
|
|
|
|
|
|
|
[English](home) | **Bahasa Indonesia**
|
|
|
|
|
|
|
|
# Slash
|
|
|
|
|
|
|
|
**Web server dan reverse proxy dari Rust. HTTP/3 dan HTTPS otomatis.**
|
|
|
|
|
|
|
|
Slash menggabungkan web server, reverse proxy, load balancer, proxy TCP/UDP, dan web
|
|
|
|
application firewall dalam satu binary kecil yang ditulis dengan Rust. Konfigurasinya
|
|
|
|
cukup satu file yang bisa dibaca seperti kalimat. Bila lebih suka klik daripada mengetik,
|
|
|
|
**SPMPlus** menyediakan panel web yang mengaturnya.
|
|
|
|
|
|
|
|
| <img src="https://kubeman.unej.ac.id/geohot/slash/-/raw/main/brand/slash-logo-fix.png" alt="Slash" width="220"> | <img src="https://kubeman.unej.ac.id/geohot/slash/-/raw/main/brand/logo-spmplus-fix-with-text.png" alt="SPMPlus" width="220"> |
|
|
|
|
|:---:|:---:|
|
|
|
|
| **Slash**: web server + reverse proxy | **SPMPlus**: reverse proxy manager |
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## Empat situs, satu file
|
|
|
|
|
|
|
|
```
|
|
|
|
email admin@example.com
|
|
|
|
|
|
|
|
example.com, www.example.com proxy localhost:3000
|
|
|
|
blog.example.com wordpress /var/www/blog
|
|
|
|
api.example.com laravel /var/www/api
|
|
|
|
docs.example.com files /srv/docs
|
|
|
|
```
|
|
|
|
|
|
|
|
Itu konfigurasi lengkap. Sertifikat Let's Encrypt terbit sendiri, HTTP dialihkan ke HTTPS,
|
|
|
|
HTTP/3 aktif, header keamanan terpasang, dan PHP berjalan lewat php-fpm dengan aturan aman
|
|
|
|
untuk WordPress dan Laravel. `slash check` memeriksa file sebelum dipakai, lengkap dengan
|
|
|
|
nomor baris dan saran saat ada salah ketik.
|
|
|
|
|
|
|
|
```
|
|
|
|
# Caddyfile # Slashfile
|
|
|
|
blog.example.com { blog.example.com wordpress /var/www/blog
|
|
|
|
root * /var/www/blog
|
|
|
|
php_fastcgi localhost:9000
|
|
|
|
file_server
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## Kenapa Slash
|
|
|
|
|
|
|
|
### Aman sejak baris pertama
|
|
|
|
|
|
|
|
- **Memory safe.** Ditulis dengan Rust tanpa `unsafe` di kode Slash sendiri. Kelas bug
|
|
|
|
buffer overflow dan use-after-free yang selama ini menghantui web server berbasis C
|
|
|
|
tertutup sejak desain.
|
|
|
|
- **TLS modern** dengan rustls dan aws-lc: TLS 1.3 sebagai default, kriptografi
|
|
|
|
post-quantum hybrid, sertifikat yang dirotasi tanpa restart.
|
|
|
|
- **Security headers aktif otomatis** untuk setiap situs: CSP, X-Frame-Options,
|
|
|
|
Referrer-Policy, Permissions-Policy, HSTS. Header yang membocorkan versi server dibuang.
|
|
|
|
- **Secret terenkripsi** saat disimpan; panel memakai argon2id, TOTP, dan passkey.
|
|
|
|
|
|
|
|
### AssaultCuirass: WAF bawaan
|
|
|
|
|
|
|
|
*Heavy-Duty, Memory-Safe Web Application Firewall Powered by Rust.*
|
|
|
|
|
|
|
|
AssaultCuirass menjalankan OWASP Core Rule Set v4, standar industri yang sama yang dipakai
|
|
|
|
ModSecurity dan Coraza, dengan engine yang ditulis khusus untuk Slash.
|
|
|
|
|
|
|
|
- **Kebal ReDoS.** Regex berjalan dalam waktu linear, sehingga payload sepanjang apa pun
|
|
|
|
diperiksa dengan biaya yang terukur.
|
|
|
|
- **Body ikut diperiksa:** form, JSON, multipart, dan XML. Serangan XXE ditangkis sebelum
|
|
|
|
menyentuh aplikasi.
|
|
|
|
- **Satu baris untuk mengaktifkan:**
|
|
|
|
|
|
|
|
```
|
|
|
|
shop.example.com proxy localhost:3000
|
|
|
|
waf block
|
|
|
|
```
|
|
|
|
|
|
|
|
- **Mode detect** untuk mengamati trafik lebih dulu, lalu **block** saat sudah yakin.
|
|
|
|
Pengecualian ditulis sesempit satu parameter: `waf skip 942430 ARGS:search`.
|
|
|
|
|
|
|
|
Diukur dengan ±37.000 payload dari
|
|
|
|
[WAF-Payload-Collection](https://github.com/mgm-sp/WAF-Payload-Collection):
|
|
|
|
|
|
|
|
| Kategori serangan | Terhenti (paranoia 2) |
|
|
|
|
|---|---|
|
|
|
|
| XSS (20.944 payload) | 100% |
|
|
|
|
| Log4Shell, Shellshock, XXE | 100% |
|
|
|
|
| Command injection | 98,5% |
|
|
|
|
| SQL injection | 97,2% |
|
|
|
|
| **Total** | **94,8%** |
|
|
|
|
|
|
|
|
Biaya per request ±0,13 ms di paranoia 1 dan hanya dibayar oleh route yang memakai WAF.
|
|
|
|
|
|
|
|
### Cepat dan hemat
|
|
|
|
|
|
|
|
Diukur di satu PC i5-10600 yang sekaligus menjalankan load generator dan upstream dummy:
|
|
|
|
|
|
|
|
| | Hasil |
|
|
|
|
|---|---|
|
|
|
|
| HTTP/1.1, 1.000 koneksi | **92.169 req/s**, 0 error |
|
|
|
|
| HTTPS, 1.000 koneksi | **81.501 req/s**, 0 error |
|
|
|
|
| HTTP/3 (QUIC), 1.000 koneksi | **52.517 req/s**, 0 error |
|
|
|
|
| 10.000 user bersamaan | 9.704 req/s, p50 1,18 ms, 0 error |
|
|
|
|
| Memori idle | ±28 MB |
|
|
|
|
| Memori per koneksi HTTP/2 | ±60 KB |
|
|
|
|
|
|
|
|
Binary statis ±15 MB, tanpa dependensi sistem. Berjalan di x86_64 dan ARM64, termasuk VM
|
|
|
|
1 vCPU dengan RAM 512 MB.
|
|
|
|
|
|
|
|
### Reload tanpa drama
|
|
|
|
|
|
|
|
Konfigurasi baru divalidasi penuh, lalu ditukar secara atomik. Koneksi yang sedang berjalan
|
|
|
|
tetap jalan, dan konfigurasi yang keliru ditolak sebelum menyentuh trafik. Slash juga
|
|
|
|
menyimpan konfigurasi terakhir yang sehat, sehingga tetap melayani walau panel sedang
|
|
|
|
dimatikan.
|
|
|
|
|
|
|
|
### Lebih dari web server
|
|
|
|
|
|
|
|
- **PHP** lewat FastCGI dengan preset `wordpress` dan `laravel`: hanya file `.php` asli yang
|
|
|
|
dieksekusi, `wp-content/uploads` steril, `.env` Laravel tak terjangkau.
|
|
|
|
- **Reverse proxy** HTTP/1.1, HTTP/2, HTTP/3, WebSocket, dan gRPC, dengan load balancing dan
|
|
|
|
health check aktif maupun pasif.
|
|
|
|
- **Proxy TCP dan UDP** untuk database, SSH, MQTT, DNS, game server, dan WireGuard.
|
|
|
|
- **TLS passthrough berdasarkan SNI** di port 443, berdampingan dengan situs HTTPS biasa.
|
|
|
|
- **Static files** dengan dukungan SPA dan file pre-compressed, plus kompresi zstd,
|
|
|
|
Brotli, dan gzip.
|
|
|
|
- **Rate limiting, access list, micro-cache** per route.
|
|
|
|
|
|
|
|
```
|
|
|
|
tcp :5432 proxy 10.0.0.5:5432 10.0.0.6:5432
|
|
|
|
allow 10.0.0.0/8
|
|
|
|
udp :51820 proxy 10.0.0.3:51820
|
|
|
|
mail.example.com passthrough 10.0.0.7:443
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## Slash di antara web server populer
|
|
|
|
|
|
|
|
| | **Slash** | Caddy | Nginx | Apache httpd |
|
|
|
|
|---|---|---|---|---|
|
|
|
|
| Bahasa | **Rust** (memory safe) | Go | C | C |
|
|
|
|
| HTTPS otomatis | **Bawaan**: HTTP-01, TLS-ALPN-01, DNS-01, ARI | Bawaan | certbot / modul | `mod_md` |
|
|
|
|
| HTTP/3 | **Aktif secara default** | Aktif secara default | Diaktifkan manual | — |
|
|
|
|
| WAF | **AssaultCuirass bawaan** (OWASP CRS v4) | Plugin Coraza | Modul ModSecurity | Modul ModSecurity |
|
|
|
|
| Security headers | **Aktif otomatis per situs** | Ditulis di Caddyfile | Ditulis di config | Ditulis di config |
|
|
|
|
| PHP | **Preset WordPress & Laravel yang aman** | `php_fastcgi` | `fastcgi_pass` manual | `mod_php`, php-fpm |
|
|
|
|
| TCP/UDP + SNI passthrough | **Bawaan** | Plugin `layer4` | `stream` | — |
|
|
|
|
| Rate limiting | **Bawaan, per route** | Plugin | `limit_req` | Modul tambahan |
|
|
|
|
| Reload | **Divalidasi, ditukar atomik** | Graceful | `nginx -s reload` | `graceful` |
|
|
|
|
| Panel web resmi | **SPMPlus** | Pihak ketiga | Pihak ketiga | Pihak ketiga |
|
|
|
|
| Konfigurasi | **Slashfile**, satu baris per situs | Caddyfile / JSON | `nginx.conf` | `httpd.conf`, `.htaccess` |
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## SPMPlus: reverse proxy manager
|
|
|
|
|
|
|
|
<img src="https://kubeman.unej.ac.id/geohot/slash/-/raw/main/brand/logo-spmplus-fix-with-text.png" alt="SPMPlus" width="240">
|
|
|
|
|
|
|
|
**SPMPlus (Slash Proxy Manager Plus)** adalah panel web untuk Slash, alternatif modern
|
|
|
|
Nginx Proxy Manager.
|
|
|
|
|
|
|
|
- **Preview sebelum terapkan:** setiap perubahan divalidasi penuh, ditampilkan diff-nya,
|
|
|
|
lalu diterapkan atomik. Setiap versi konfigurasi tercatat beserta audit log-nya.
|
|
|
|
- **Proxy dan panel terpisah:** Slash terus melayani trafik walau panel sedang di-update.
|
|
|
|
- **Hosts, Streams, Certificates, Access** dalam satu tempat; tes koneksi upstream langsung
|
|
|
|
dari jaringan proxy.
|
|
|
|
- **Dashboard dan Prometheus metrics**, log akses, dan audit log.
|
|
|
|
- **Akun aman:** multi-admin, passkey, TOTP.
|
|
|
|
- **Ringan:** dua image Docker distroless, read-only, non-root, atau binary native dengan
|
|
|
|
systemd.
|
|
|
|
|
|
|
|
| | **SPMPlus** | Nginx Proxy Manager |
|
|
|
|
|---|---|---|
|
|
|
|
| Engine | **Slash (Rust)** | Nginx (OpenResty) |
|
|
|
|
| HTTP/3 | **Ya** | — |
|
|
|
|
| Kompresi | **zstd, Brotli, gzip** | gzip |
|
|
|
|
| WAF | **AssaultCuirass** | — |
|
|
|
|
| Stream TCP/UDP | **Ya, plus TLS passthrough (SNI)** | Ya |
|
|
|
|
| Rate limiting | **Per route, dari panel** | Lewat config manual |
|
|
|
|
| Apply perubahan | **Validasi, preview diff, swap atomik, riwayat versi** | Tulis config, lalu reload |
|
|
|
|
| Metrics | **Dashboard + Prometheus** | — |
|
|
|
|
| Arsitektur | **Proxy dan panel terpisah** | Satu container |
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## Mulai dalam lima menit
|
|
|
|
|
|
|
|
**Slash saja, dengan Slashfile:**
|
|
|
|
|
|
|
|
```sh
|
|
|
|
git clone https://kubeman.unej.ac.id/geohot/slash.git && cd slash
|
|
|
|
docker build -f docker/Dockerfile.proxy --target final -t slash .
|
|
|
|
docker run -d --name slash --network host --restart unless-stopped \
|
|
|
|
-v "$PWD/Slashfile:/etc/slash/Slashfile:ro" -v slash-data:/data/proxy slash
|
|
|
|
```
|
|
|
|
|
|
|
|
**Dengan panel SPMPlus:**
|
|
|
|
|
|
|
|
```sh
|
|
|
|
git clone https://kubeman.unej.ac.id/geohot/slash.git && cd slash/docker
|
|
|
|
sudo ./gen-secrets.sh
|
|
|
|
docker compose up -d --build
|
|
|
|
docker compose logs panel | grep -i "setup token" | tail -1
|
|
|
|
```
|
|
|
|
|
|
|
|
Lalu buka panel lewat SSH tunnel (`ssh -L 8443:127.0.0.1:8443 user@server`) di
|
|
|
|
`http://localhost:8443`.
|
|
|
|
|
|
|
|
**Kebutuhan:** Linux 64-bit (x86_64 atau ARM64), 1 vCPU dan 512 MB RAM sudah cukup untuk
|
|
|
|
memulai; 2 vCPU dan 2 GB RAM untuk ±10.000 user bersamaan. Port 80, 443/tcp, dan 443/udp.
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
## Dokumentasi
|
|
|
|
|
|
|
|
| | |
|
|
|
|
|---|---|
|
|
|
|
| [README](https://kubeman.unej.ac.id/geohot/slash/-/blob/main/README.md) | Panduan lengkap dan troubleshooting |
|
|
|
|
| [Slashfile](https://kubeman.unej.ac.id/geohot/slash/-/blob/main/docs/slashfile.md) | Referensi konfigurasi: situs, PHP, WAF, TCP/UDP |
|
|
|
|
| [AssaultCuirass](https://kubeman.unej.ac.id/geohot/slash/-/blob/main/docs/waf.md) | Cara kerja WAF, akurasi, penyetelan |
|
|
|
|
| [Instalasi native](https://kubeman.unej.ac.id/geohot/slash/-/blob/main/docs/install-native.md) | systemd tanpa Docker |
|
|
|
|
| [Benchmark](https://kubeman.unej.ac.id/geohot/slash/-/blob/main/docs/benchmarks.md) | Metode dan cara mengulang pengukuran |
|
|
|
|
|
|
|
|
Open source, dual-licensed [MIT](https://kubeman.unej.ac.id/geohot/slash/-/blob/main/LICENSE-MIT)
|
|
|
|
atau [Apache-2.0](https://kubeman.unej.ac.id/geohot/slash/-/blob/main/LICENSE-APACHE).
|
|
|
|
© 2026 Agung Hendro. |