Cloudflare - Akses Web & SSH Aman ke Infrastruktur Pribadi Menggunakan Cloudflare Tunnel (Berbasis Docker)

Cloudflare - Akses Web & SSH Aman ke Infrastruktur Pribadi Menggunakan Cloudflare Tunnel (Berbasis Docker)

Cara mengatur akses aman Cloudflare Tunnel melalui infrastruktur pribadi Anda menggunakan Docker

Arman Dwi Pangestu
Arman Dwi PangestuJanuary 7, 2026
0 views
13 min read

Pendahuluan

Baru-baru ini, saya menghadapi tantangan di mana saya perlu menyebarkan aplikasi web dan memiliki akses SSH untuk CI/CD Pipeline saya, tetapi saya tidak ingin membayar Server di Cloud / Hosting seperti VPS atau server khusus. Saya juga tidak ingin menggunakan layanan VPN, jadi saya memutuskan untuk menggunakan Cloudflare Tunnel untuk mengamankan akses ke infrastruktur pribadi saya. Saya merancang topologi jaringan untuk mengimplementasikan ini di laboratorium rumah saya menggunakan Docker.

Tip

Anda dapat mengabaikan perangkat lain dalam gambar topologi ini, ini hanya ilustrasi bagaimana topologi jaringan rumah saya diimplementasikan. Anda cukup fokus pada cloudflare tunnel, dan container docker.

Jadi dengan pengaturan ini, kita dapat mengakses infrastruktur pribadi kita dari internet, kita dapat mengakses aplikasi web, dan juga memiliki akses SSH ke server KVM.

Prasyarat

Sebelum kita mulai, pastikan Anda memiliki hal-hal berikut:

Domain

Anda harus memiliki nama domain, Anda bisa mendapatkannya dari Pendaftar Domain seperti Google Domains, Namecheap, atau pendaftar domain lainnya. Pastikan NS (Name Server) mengarah ke DNS Cloudflare.

Dalam contoh saya, saya akan menggunakan domain saya sendiri devvnull.me, dan saat ini Name Server-nya sudah mengarah ke DNS Cloudflare. Untuk memverifikasinya, Anda dapat menggunakan perintah berikut:

bash
dig devvnull.me -t NS

Keluarannya kurang lebih akan seperti ini:

bash
; <<>> DiG 9.18.39-0ubuntu0.24.04.2-Ubuntu <<>> devvnull.me -t NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24249
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;devvnull.me.                   IN      NS
 
;; ANSWER SECTION:
devvnull.me.            7198    IN      NS      heidi.ns.cloudflare.com.
devvnull.me.            7198    IN      NS      gordon.ns.cloudflare.com.
 
;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Wed Jan 07 15:23:59 WIB 2026
;; MSG SIZE  rcvd: 98

Akun Cloudflare

Pastikan akun Cloudflare Anda sudah menambahkan Metode Penagihan / Pembayaran, karena fitur Zero Trust pada paket gratis memerlukan metode pembayaran untuk mengaktifkannya (tetapi tidak akan membebani biaya kepada Anda).

Server / Mesin

Tip

Anda dapat menginstal cloudflare tunnel di server/mesin apa pun yang Anda inginkan, seperti Windows, Linux, macOS, Systemd, Docker, dll.

Anda perlu memiliki server untuk menjalankan cloudflare tunnel, dan juga untuk menjalankan container docker. Dalam kasus ini saya akan menggunakan KVM Ubuntu Server, tetapi Anda dapat menggunakan server apa pun yang Anda inginkan.

Docker

Important

Jalankan perintah ini di dalam shell server/mesin tempat Anda ingin menjalankan cloudflare tunnel. Jadi Anda perlu melakukan remote ke server/mesin terlebih dahulu. Contoh dalam kasus saya menggunakan ssh:

bash
ssh devnull@ubuntu.home.internal

Karena dalam kasus ini saya akan menggunakan Docker untuk menjalankan cloudflare tunnel, jadi pastikan Anda telah menginstal Docker di server Anda. Jika Anda belum menginstal Docker, Anda dapat mengikuti postingan blog saya untuk menginstalnya: Ubuntu 24.04 - Instal Docker.

Setelah menginstal Docker, kita perlu membuat jaringan container khusus untuk semua container, sehingga kita dapat menggunakan jaringan yang sama untuk semua container. Ini dapat dilakukan dengan menjalankan perintah berikut:

Note

Pastikan subnet tidak tumpang tindih dengan subnet jaringan lokal Anda. Dalam kasus ini saya akan menggunakan IPv4 Class B (172.25.0.0/16) untuk jaringan container.


Ini dapat memiliki 65536 alamat IP (dari 172.25.0.0 hingga 172.25.255.255), jadi cukup untuk semua container.


Anda juga dapat mengubah nama untuk jaringan container, agar lebih deskriptif bagi Anda.

bash
docker network create \
    --driver=bridge \
    --subnet=172.25.0.0/16 \
    cloudflared-tunnel

Pengaturan

Setelah semua prasyarat terpenuhi, kita dapat mulai mengatur cloudflare tunnel. Pertama, kita perlu mengautentikasi ke cloudflare dan membuat tunnel.

Important

Jalankan perintah ini di dalam shell server/mesin tempat Anda ingin menjalankan cloudflare tunnel. Jadi Anda perlu melakukan remote ke server/mesin terlebih dahulu. Contoh dalam kasus saya menggunakan ssh:

bash
ssh devnull@ubuntu.home.internal

Login Cloudflare

Karena kita akan menggunakan Docker, jadi kita bisa cukup menggunakan perintah sederhana seperti ini untuk login ke cloudflare:

Tip

Ubah nama folder dengan nama domain Anda sendiri, dalam kasus ini saya akan menggunakan devvnull.me.


Pastikan direktori cloudflared memiliki izin untuk pengguna nonroot atau 65532, sehingga kita dapat menggunakannya di dalam container.

bash
mkdir -p /opt/docker-app/devvnull.me && \
    cd /opt/docker-app/devvnull.me
 
mkdir cloudflared && \
    sudo chown -R 65532:65532 cloudflared
bash
docker run --rm -it \
    -v $PWD/cloudflared:/home/nonroot/.cloudflared \
    cloudflare/cloudflared:latest \
    tunnel login

Setelah menjalankan perintah tersebut, akan muncul URL untuk dibuka di browser Anda guna login ke cloudflare. Setelah dibuka di browser pilih zona atau domain yang ingin Anda Otorisasi Cloudflare Tunnel. Dalam kasus ini saya akan memilih devvnull.me > Klik tombol Authorize.

Jika proses Otorisasi berhasil, akan muncul pesan seperti ini:

bash
Leave cloudflared running to download the cert automatically.
2026-01-07T09:01:06Z INF You have successfully logged in.
If you wish to copy your credentials to a server, they have been saved to:
/home/nonroot/.cloudflared/cert.pem

Dan struktur foldernya harus seperti ini:

bash
 devvnull.me
└── cloudflared
     └── cert.pem

Membuat Tunnel

Setelah login ke cloudflare, kita dapat membuat tunnel menggunakan perintah ini:

Tip

Ubah nama tunnel dengan nama tunnel Anda sendiri, dalam kasus ini saya akan menggunakan devvnull-tunnel.

bash
docker run --rm -it \
    -v $PWD/cloudflared:/home/nonroot/.cloudflared \
    cloudflare/cloudflared:latest \
    tunnel create devvnull-tunnel

Jika tunnel berhasil dibuat, akan muncul pesan seperti ini:

bash
Tunnel credentials written to /home/nonroot/.cloudflared/6d40d748-1ef2-4899-97f5-a33489ad43fc.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel.
 
Created tunnel devvnull-tunnel with id 6d40d748-1ef2-4899-97f5-a33489ad43fc

Dan struktur foldernya harus seperti ini:

bash
 devvnull.me
└── cloudflared
     ├── 6d40d748-1ef2-4899-97f5-a33489ad43fc.json
   └── cert.pem

Membuat DNS Record untuk Tunnel

Sekarang kita perlu membuat DNS record untuk tunnel, dalam kasus saya, saya akan memetakan record ini ke domain devvnull.me.

Note

  • Nilai atau nama @ dalam record ini berarti root domain, ini akan memetakan ke devvnull.me, jadi record ini akan berfungsi sebagai layanan web.
  • Nilai atau nama ssh dalam record ini berarti subdomain, jadi ini akan memetakan ke ssh.devvnull.me, jadi record ini akan berfungsi sebagai layanan SSH.

Nilai uniknya adalah UUID yang akan dibuat oleh cloudflare, ini akan memetakan ke cfargotunnel.com, jadi record ini akan berfungsi sebagai layanan tunnel.

NoTipeNamaKonten
1CNAME@<UUID>.cfargotunnel.com
2CNAMEssh<UUID>.cfargotunnel.com

Untuk membuat DNS record, Anda dapat membuatnya menggunakan perintah di bawah ini:

Tip

Anda dapat menambahkan lebih banyak record jika Anda mau, misalnya Anda dapat menambahkan subdomain portainer untuk layanan portainer.


Jika Anda mendapatkan pesan error saat membuat DNS record ini, seperti ini

bash
Failed to add route: code: 1003, reason: Failed to create record devvnull.me with err An A, AAAA, or CNAME record with that host already exists. For more details, refer to <https://developers.cloudflare.com/dns/manage-dns-records/troubleshooting/records-with-same-name/>.

Itu berarti record tersebut sudah ada, jadi untuk memperbaikinya dengan cara menghapus record yang ada atau menggunakan subdomain yang berbeda untuk record tersebut. Untuk menghapus record yang ada Anda dapat pergi ke Cloudflare > DNS > Record > Pilih Record > Hapus Record.

docker run --rm -it \
    -v $PWD/cloudflared:/home/nonroot/.cloudflared \
    cloudflare/cloudflared:latest \
    tunnel route dns devvnull-tunnel devvnull.me

Jika tunnel berhasil dibuat, akan muncul pesan seperti ini:

bash
2026-01-07T15:05:08Z INF Added CNAME devvnull.me which will route to this tunnel tunnelID=6d40d748-1ef2-4899-97f5-a33489ad43fc
 
2026-01-07T15:05:45Z INF Added CNAME ssh.devvnull.me which will route to this tunnel tunnelID=6d40d748-1ef2-4899-97f5-a33489ad43fc

Dan jika Anda melihat di Dashboard Cloudflare, sekarang akan muncul DNS record seperti ini:

Membuat Aturan Ingress

Setelah membuat DNS record, kita perlu membuat aturan ingress untuk tunnel. Jadi berdasarkan DNS record apa yang kita buat, kita perlu mendefinisikan aturan ingress untuk memetakan layanan apa yang harus diakses ketika DNS record diakses.

Dalam kasus ini saya akan membuat aturan ingress untuk layanan web dan ssh. Untuk membuat aturan ingress, Anda dapat membuatnya menggunakan perintah di bawah ini:

Tip

Anda dapat menggunakan editor teks apa pun yang Anda inginkan seperti nano, vim, nvim, dll untuk membuat file konfigurasi. Dalam kasus ini saya akan menggunakan nvim.

bash
sudo nvim cloudflared/config.yml

Isi file konfigurasi dengan konten ini:

Important

Ganti <TUNNEL-UUID> dengan uuid tunnel Anda, Anda dapat melihat uuid tunnel di langkah sebelumnya atau di folder cloudflared.


  • Untuk Layanan Web, ini menggunakan nama container docker-welcome-page untuk meneruskan koneksi http ke Server Nginx di dalam Docker Container.
  • Untuk Layanan SSH, ini menggunakan alamat gateway 172.25.0.1 untuk meneruskan koneksi ssh ke Server KVM atau Guest OS via jaringan host.
cloudflared/config.yml
tunnel: devvnull-tunnel
credentials-file: /etc/cloudflared/<TUNNEL-UUID>.json
 
ingress:
  # --- Web HTTPS
  - hostname: devvnull.me
    service: http://docker-welcome-page:80
 
  # --- SSH (host KVM)
  - hostname: ssh.devvnull.me
    service: ssh://172.25.0.1:22
 
  # --- Fallback
  - service: http_status:404

Jadi sekarang struktur foldernya harus seperti ini:

bash
 devvnull.me
└── cloudflared
   ├── 6d40d748-1ef2-4899-97f5-a33489ad43fc.json
   ├── cert.pem
     └── config.yml

Membuat File Docker Compose Untuk Cloudflare Tunnel

Sekarang kita perlu menjalankan cloudflare tunnel sebagai layanan container agar tetap berjalan sepanjang waktu. Untuk membuat file docker compose, Anda dapat membuatnya menggunakan perintah di bawah ini:

bash
sudo nvim docker-compose.yml

Important

Dalam layanan web, saya akan menggunakan gambar dari GitHub Container Registry saya ghcr.io/armandwipangestu/docker-welcome-page:1.0.2. Ini adalah gambar sederhana yang akan berfungsi sebagai halaman sambutan untuk layanan web.


Jangan ragu untuk melihat repositori di sini armandwipangestu/docker-welcome-page atau melihat Halaman Sambutan secara langsung di sini docker-welcome-page.vercel.app.


Berikut adalah beberapa hal penting yang perlu Anda pertimbangkan agar ini berhasil:

  • Pastikan nama container sama dengan nama layanan dalam definisi aturan ingress sebelumnya.
  • Pastikan container cloudflared_tunnel dapat diakses oleh container lain di jaringan yang sama.

Karena kita sudah membuat jaringan docker sebelumnya, jadi dalam kasus ini container akan menggunakan dhcp untuk mendapatkan alamat ip menggunakan nama jaringan eksternal cloudflared-tunnel.

docker-compose.yml
services:
  cloudflared_tunnel:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared_tunnel
    restart: unless-stopped
    command: tunnel --no-autoupdate run
    volumes:
      - ./cloudflared:/etc/cloudflared:ro
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
    networks:
      - cloudflared-tunnel
 
  docker-welcome-page:
    image: ghcr.io/armandwipangestu/docker-welcome-page:1.0.2
    container_name: docker-welcome-page
    ports:
      - "80:80"
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
    networks:
      - cloudflared-tunnel
 
networks:
  cloudflared-tunnel:
    external: true

Setelah membuat file docker compose, sekarang kita dapat menjalankan layanan container menggunakan perintah di bawah ini:

bash
docker compose up -d
 
docker compose ps -a

Jika container berjalan dengan sukses, akan muncul pesan seperti ini:

bash
[+] up 1/3
[+] up 5/5hcr.io/armandwipangestu/docker-welcome-page:1.0.2 [⣿⣿] 132.4kB / 132.4kB Pulling                                                                                                                           3.5s 
 Image ghcr.io/armandwipangestu/docker-welcome-page:1.0.2 Pulled                                                                                                                                                   3.5s 
 9bc53414cea7                                           Pull complete                                                                                                                                            0.9s 
 e97543ee5c71                                           Pull complete                                                                                                                                            0.6s 
 Container docker-welcome-page                            Created                                                                                                                                                  0.1s 
 Container cloudflared_tunnel                             Created                                                                                                                                                  0.1s 
 
NAME                  IMAGE                                                COMMAND                  SERVICE               CREATED          STATUS          PORTS
cloudflared_tunnel    cloudflare/cloudflared:latest                        "cloudflared --no-au…"   cloudflared_tunnel    31 seconds ago   Up 31 seconds   
docker-welcome-page   ghcr.io/armandwipangestu/docker-welcome-page:1.0.2   "/docker-entrypoint.…"   docker-welcome-page   31 seconds ago   Up 31 seconds   0.0.0.0:80->80/tcp, [::]:80->80/tcp

Untuk memastikan cloudflare tunnel berjalan dengan sukses, Anda dapat memeriksa log menggunakan perintah di bawah ini:

bash
docker compose logs -f cloudflared_tunnel

Jika berhasil akan muncul pesan seperti ini:

bash
cloudflared_tunnel  | 2026-01-07T15:36:26Z INF Starting tunnel tunnelID=6d40d748-1ef2-4899-97f5-a33489ad43fc
cloudflared_tunnel  | 2026-01-07T15:36:26Z INF Version 2025.11.1 (Checksum cf95c90f5f6d6c87296bbab3b5a967ef580b017357353bfc1777ed5451ff9805)
cloudflared_tunnel  | 2026-01-07T15:36:26Z INF GOOS: linux, GOVersion: go1.24.9, GoArch: amd64
cloudflared_tunnel  | 2026-01-07T15:36:26Z INF Settings: map[cred-file:/etc/cloudflared/6d40d748-1ef2-4899-97f5-a33489ad43fc.json credentials-file:/etc/cloudflared/6d40d748-1ef2-4899-97f5-a33489ad43fc.json no-autoupdate:true]
cloudflared_tunnel  | 2026-01-07T15:36:26Z INF Generated Connector ID: 07ea2563-0952-40ac-821a-2d942e066170
cloudflared_tunnel  | 2026-01-07T15:36:26Z INF Initial protocol quic
cloudflared_tunnel  | 2026-01-07T15:36:26Z INF ICMP proxy will use 172.25.0.3 as source for IPv4
cloudflared_tunnel  | 2026-01-07T15:36:26Z INF ICMP proxy will use ::1 in zone lo as source for IPv6
cloudflared_tunnel  | 2026-01-07T15:36:27Z INF ICMP proxy will use 172.25.0.3 as source for IPv4
cloudflared_tunnel  | 2026-01-07T15:36:27Z INF ICMP proxy will use ::1 in zone lo as source for IPv6
cloudflared_tunnel  | 2026-01-07T15:36:27Z INF Starting metrics server on [::]:20241/metrics
cloudflared_tunnel  | 2026-01-07T15:36:27Z INF Tunnel connection curve preferences: [X25519MLKEM768 CurveP256] connIndex=0 event=0 ip=198.41.200.63
cloudflared_tunnel  | 2026/01/07 15:36:27 failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 7168 kiB, got: 416 kiB). See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details.
cloudflared_tunnel  | 2026-01-07T15:36:27Z INF Registered tunnel connection connIndex=0 connection=d0ea08a2-dc82-412c-b4e5-c7883cbf8c88 event=0 ip=198.41.200.63 location=sin13 protocol=quic
cloudflared_tunnel  | 2026-01-07T15:36:27Z INF Tunnel connection curve preferences: [X25519MLKEM768 CurveP256] connIndex=1 event=0 ip=198.41.192.67
cloudflared_tunnel  | 2026-01-07T15:36:28Z INF Registered tunnel connection connIndex=1 connection=ab21325c-65d0-4ac8-b6de-76c0c3fe76f4 event=0 ip=198.41.192.67 location=sin06 protocol=quic
cloudflared_tunnel  | 2026-01-07T15:36:28Z INF Tunnel connection curve preferences: [X25519MLKEM768 CurveP256] connIndex=2 event=0 ip=198.41.192.57
cloudflared_tunnel  | 2026-01-07T15:36:29Z INF Registered tunnel connection connIndex=2 connection=ca6da423-76c1-4424-9e58-45796454119a event=0 ip=198.41.192.57 location=sin09 protocol=quic
cloudflared_tunnel  | 2026-01-07T15:36:29Z INF Tunnel connection curve preferences: [X25519MLKEM768 CurveP256] connIndex=3 event=0 ip=198.41.200.43
cloudflared_tunnel  | 2026-01-07T15:36:30Z INF Registered tunnel connection connIndex=3 connection=dacbabe4-b00c-4ef1-8141-91e40b25620b event=0 ip=198.41.200.43 location=sin11 protocol=quic

Membuat Token Layanan (Service Token)

Note

Pengaturan ini akan berguna jika Anda ingin mengakses Server KVM Anda untuk CI/CD Pipeline, jadi Koneksi SSH akan diverifikasi oleh Access dan Secret dari Service Token dan tidak menggunakan metode verifikasi Email (jadi akan berguna untuk klien headless).


Jika Anda tidak menggunakan CI/CD Pipeline atau tidak membutuhkan klien headless, Anda dapat melewati langkah ini.

Sekarang kita perlu membuat token layanan untuk klien headless (misalnya CI/CD Pipeline). Untuk membuat token layanan, Anda dapat mengikuti langkah-langkah di bawah ini:

  1. Buka Dashboard Cloudflare
  2. Klik Zero Trust di bilah sisi kiri
  3. Klik Access controls > Service credentials di bilah sisi kiri
  4. Klik Create Service Token

Sekarang isi formulir dengan data berikut:

plaintext
Service token name (Required): headless-client
Service Token Duration (Required): 1 year

Klik Generate token dan simpan atau salin token ke clipboard.

Jika sukses akan muncul pesan seperti ini:

Membuat Aturan Kebijakan (Policies Rules)

Aturan kebijakan ini akan digunakan untuk memverifikasi apakah Koneksi SSH dilindungi oleh Service Token atau metode Verifikasi Email.

Untuk membuat aturan kebijakan, Anda dapat mengikuti langkah-langkah di bawah ini:

  1. Buka Dashboard Cloudflare
  2. Klik Zero Trust di bilah sisi kiri
  3. Klik Access controls > Policies di bilah sisi kiri
  4. Klik Add a policy

Kebijakan Token Layanan (Service Token Policy)

Isi formulir dengan data berikut:

plaintext
- Basic Information:
    - Policy name (Required): Allow SSH Connection with Service Token
    - Action (Required): Service Auth
    - Session duration: 24 hours
 
- Add rules:
    - Selector: Service Token
    - Value: headless-client

Konfigurasinya akan terlihat seperti ini:

Klik Save untuk menyimpan kebijakan.

Kebijakan Verifikasi Email (Email Verification Policy)

Tambahkan kebijakan baru dengan data berikut:

plaintext
- Basic Information:
    - Policy name (Required): Allow SSH Connection with Email Verification
    - Action (Required): Allow
    - Session duration: 24 hours
 
- Add rules:
    - Selector: Emails
    - Value: your-email@domain.com

Konfigurasinya akan terlihat seperti ini:

Klik Save untuk menyimpan kebijakan.

Jadi sekarang daftar Reusable policies akan terlihat seperti ini:

Membuat Aplikasi Akses Zero Trust

Sekarang kita perlu membuat Aplikasi Akses Zero Trust untuk mengizinkan Koneksi SSH ke infrastruktur pribadi kita.

Untuk membuat Aplikasi Akses Zero Trust, Anda dapat mengikuti langkah-langkah di bawah ini:

  1. Buka Dashboard Cloudflare
  2. Klik Zero Trust di bilah sisi kiri
  3. Klik Access controls > Applications di bilah sisi kiri
  4. Klik Add an application
  5. Pilih tipe Self-hosted

Dan isi formulir dengan data berikut:

plaintext
- Basic Information:
    - Application name (Required): devvnull.me SSH
    - Session Duration (Required): 24 hours
    - Public hostname:
        - Input method: Default
        - Subdomain: ssh
        - Domain: devvnull.me
        - Path: kosong
 
- Access policies:
    - Pilih existing policies:
        - Allow SSH Connection with Service Token
        - Allow SSH Connection with Email Verification

Buat konfigurasi lain menjadi default, sehingga akan terlihat seperti ini:

Klik Next > Next > Save untuk menyimpan aplikasi.

Sekarang daftar Applications akan terlihat seperti ini:

Mengatur Autentikasi Kunci SSH (SSH Key Authentication)

Important

Jalankan perintah ini di dalam shell mesin klien yang ingin Anda hubungkan ke infrastruktur pribadi.

Untuk membuat Autentikasi Kunci SSH, Anda dapat mengikuti langkah-langkah di bawah ini:

Membuat Pasangan Kunci SSH

Anda perlu membuat Pasangan Kunci SSH baru jika Anda belum memilikinya. Anda dapat membuat Pasangan Kunci SSH baru menggunakan perintah berikut:

bash
ssh-keygen -t ed25519 -f ~/.ssh/devvnull.me

Jadi sekarang direktori ~/.ssh akan terlihat seperti ini:

bash
󰢬 ~/.ssh
├── 󰣀 authorized_keys
  ├── devvnull.me
  ├── 󰷖 devvnull.me.pub
└── 󰣀 known_hosts

Setelah itu, salin kunci publik dan simpan di file authorized_keys dari Server KVM yang ingin Anda hubungkan. Jadi sekarang file authorized_keys akan terlihat seperti ini:

bash
cat ~/.ssh/authorized_keys
 
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICK72PwHf0X9btH2ijYCmlx7jzulr0j5viVqBCm/Y9YA devnull@devnull

Nonaktifkan Autentikasi Kata Sandi

Sekarang nonaktifkan autentikasi kata sandi dengan mengedit file sshd_config.

bash
sudo nvim /etc/ssh/sshd_config

Dan atur konfigurasi berikut:

bash
PermitRootLogin no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
PasswordAuthentication no
PermitEmptyPasswords no
UsePAM no

Caution

Jangan logout sebelum menguji apakah Autentikasi Kunci SSH berfungsi.

Setelah itu, restart layanan SSH.

bash
sudo systemctl restart ssh

Menambahkan Konfigurasi SSH ke Mesin Klien

Sekarang kita dapat menambahkan Konfigurasi SSH ke mesin klien untuk mempermudah koneksi ke infrastruktur pribadi. Untuk menambahkan Konfigurasi SSH, Anda dapat mengikuti langkah-langkah di bawah ini:

bash
nvim ~/.ssh/config

Dan tambahkan konfigurasi berikut:

Tip

Jika Anda tidak ingin menggunakan Konfigurasi SSH, berikut adalah contoh cara menghubungkan ke infrastruktur pribadi menggunakan perintah ssh secara langsung:

bash
export CF_ACCESS_CLIENT_ID="your-client-id"
export CF_ACCESS_CLIENT_SECRET="your-client-secret"
 
ssh \                                                                                              
    -o ProxyCommand="cloudflared access ssh \
        --hostname ssh.devvnull.me \
        --id $CF_ACCESS_CLIENT_ID \
        --secret $CF_ACCESS_CLIENT_SECRET" \
    devnull@ssh.devvnull.me
bash
Host devvnull.me
  HostName ssh.devvnull.me
  User devnull
 
  IdentityFile ~/.ssh/devvnull.me
  IdentitiesOnly yes
 
  ProxyCommand cloudflared access ssh --hostname %h --id $CF_ACCESS_CLIENT_ID --secret $CF_ACCESS_CLIENT_SECRET

Menambahkan Binary Cloudflared ke Mesin Klien

Sekarang kita perlu menambahkan binary Cloudflared ke mesin klien untuk mempermudah koneksi ke infrastruktur pribadi. Untuk menambahkan binary Cloudflared, Anda dapat mengikuti langkah-langkah di bawah ini:

bash
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
 
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared noble main' | sudo tee /etc/apt/sources.list.d/cloudflared.list
 
sudo apt update && sudo apt install cloudflared

Menguji Koneksi Tunneling

Setelah semua pengaturan selesai, sekarang kita dapat menguji koneksi tunneling.

Mengakses Layanan Web

Untuk mengakses layanan web, Anda dapat membuka browser dan mengunjungi https://devvnull.me. Jika koneksi berhasil, Anda akan melihat halaman layanan web seperti ini:

Mengakses Layanan SSH menggunakan Token Layanan

Untuk mengakses Layanan SSH menggunakan Token Layanan, Anda dapat mengikuti langkah-langkah di bawah ini:

bash
export CF_ACCESS_CLIENT_ID="your-client-id"
export CF_ACCESS_CLIENT_SECRET="your-client-secret"
 
ssh devvnull.me

Jika koneksi berhasil, Anda akan melihat shell berubah menjadi seperti ini:

Mengakses Layanan SSH menggunakan Verifikasi Email

Untuk mengakses Layanan SSH menggunakan Verifikasi Email, Anda dapat mengikuti langkah-langkah di bawah ini:

bash
ssh -o ProxyCommand="cloudflared access ssh --hostname ssh.devvnull.me" devnull@ssh.devvnull.me

Jika koneksi berhasil, akan muncul URL untuk dibuka di browser seperti ini

bash
A browser window should have opened at the following URL:
 
https://ssh.devvnull.me/cdn-cgi/access/cli?aud=32cf2e2a14bccd667d8e508a9bfb6fd822399debe130f533ae176ee9f5aa3b7d&edge_token_transfer=true&redirect_url=https%3A%2F%2Fssh.devvnull.me%3Faud%3D32cf2e2a14bccd667d8e508a9bfb6fd822399debe130f533ae176ee9f5aa3b7d%26token%3Dq2l9u_F-OWkOt0hdtaj9zJ7yTG2qeqi2g6laXs1Oqn4%253D&send_org_token=true&token=q2l9u_F-OWkOt0hdtaj9zJ7yTG2qeqi2g6laXs1Oqn4%3D
 
If the browser failed to open, please visit the URL above directly in your browser.

Dan setelah membuka URL tersebut, akan muncul halaman login seperti ini:

Note

Isi alamat email dengan yang sama dengan yang terdaftar di Kebijakan sebelumnya.

Jika Anda memasukkan email yang benar, Anda akan menerima Kode Akses Cloudflare seperti ini:

Setelah itu akan muncul tombol Deny dan Approve seperti ini:

Jika Anda memilih Approve, maka shell akan berubah menjadi seperti ini:

Sekarang kembali ke shell, Anda akan melihat shell berubah menjadi seperti ini:

Manfaat Keamanan

Dengan menggunakan metode ini, Anda mendapatkan:

  1. Tidak ada port yang terekspos, server Anda tidak memiliki port SSH publik (tidak perlu port forwarding).
  2. Tidak perlu aturan NAT, tunnel membuat koneksi keluar, melewati konfigurasi router sepenuhnya.
  3. Akses berbasis identitas, setiap koneksi memerlukan autentikasi melalui cloudflare.
  4. Jejak audit, setiap koneksi dicatat dan dapat diaudit.
  5. Zero trust, tidak ada kepercayaan implisit berdasarkan lokasi jaringan.
  6. Perlindungan DDoS, semua lalu lintas melewati jaringan Cloudflare.
  7. Pencabutan mudah, nonaktifkan akses secara instan dengan menghapus container.
  8. Tidak ada celah firewall, jaringan rumah Anda tetap terkunci sepenuhnya.

Kesimpulan

Menyiapkan Cloudflare Tunnel dengan Docker menyediakan cara yang kuat dan aman untuk mengakses infrastruktur pribadi Anda tanpa mengekspos port apa pun ke internet publik. Dengan memanfaatkan Cloudflare Zero Trust, Anda dapat menerapkan kontrol akses berbasis identitas, memastikan bahwa hanya pengguna yang berwenang yang dapat menjangkau layanan web dan server SSH Anda.

Pengaturan ini tidak hanya menyederhanakan konfigurasi jaringan Anda dengan menghilangkan kebutuhan akan aturan NAT yang rumit atau port forwarding, tetapi juga secara signifikan meningkatkan postur keamanan Anda melalui tunnel terenkripsi dan autentikasi multi-faktor. Baik Anda mengelola lab rumah atau server pribadi profesional, pendekatan ini menawarkan solusi modern dan skalabel untuk akses jarak jauh yang aman.

Pengaturan awal membutuhkan sedikit usaha, tetapi hasilnya adalah solusi akses tingkat perusahaan yang kuat untuk infrastruktur mandiri Anda dengan semua fitur di tingkat gratis Cloudflare.


Related Posts