Remote development menggunakan Visual Studio Code melalui ekstensi Remote - SSH telah menjadi standar de facto bagi developer yang bekerja dengan server jarak jauh. Namun, pengalaman itu kerap terganggu oleh satu pesan error yang cukup misterius dan sulit dilacak akar masalahnya: "tcp port forwarding appears to be disabled on remote host". Error ini tidak hanya menghentikan fitur port forwarding yang krusial untuk web development, tetapi juga sering kali muncul tanpa penjelasan yang jelas tentang apa yang salah dan di mana letak kesalahannya. Artikel ini akan mengupas tuntas mulai dari apa yang sebenarnya dimaksud error ini, akar masalah paling sering, solusi langkah demi langkah, hingga konfigurasi permanen agar masalah ini tidak kembali menghantui alur kerja Anda.


Apa yang Sebenarnya Dikeluhkan Error Ini

Ketika Anda menghubungkan VSCode ke remote host melalui SSH dan membuka panel Ports di terminal, Anda mungkin disambut oleh pesan error yang berbunyi persis seperti ini:

[error] tcp port forwarding appears to be disabled on the remote host.

Atau dalam beberapa varian log yang lebih lengkap:

[14:32:01.456] [remoteagent] [error] Port forwarding: tcp port forwarding appears to be disabled on the remote host. Ensure that the SSH server configuration allows port forwarding.

Dalam bahasa Indonesia sederhana, pesan ini mengatakan bahwa fitur penerusan port TCP pada server jarak jauh yang Anda tuju tampaknya dinonaktifkan, sehingga VSCode tidak bisa membuat terowongan (tunnel) antara port di mesin lokal Anda dengan port yang berjalan di remote host. Tanpa kemampuan ini, setiap kali Anda menjalankan aplikasi web di server — misalnya React dev server di port 3000 atau API Laravel di port 8000 — Anda tidak bisa mengaksesnya dari browser di komputer lokal.

VSCode secara internal mengandalkan SSH port forwarding ( juga dikenal sebagai SSH tunneling) untuk memetakan port remote ke port lokal. Mekanisme ini bekerja dengan cara menambahkan flag -L atau -R pada koneksi SSH yang dibuat di balik layar. Ketika VSCode membuka koneksi SSH ke remote host, ia mengirimkan permintaan untuk membuat forward channel. Jika server SSH menolak atau mengabaikan permintaan itu, VSCode akan mencatat error ini.

Asal masalahnya Pada dasarnya ada tiga lapis penyebab. Pertama, konfigurasi daemon SSH (sshd) di remote host secara eksplisit melarang port forwarding melalui direktif AllowTcpForwarding no. Kedua, pengguna yang Anda gunakan untuk login tidak memiliki izin untuk membuat tunnel karena dibatasi oleh direktif PermitTunnel atau kebijakan Match yang spesifik. Ketiga, ada middleman — misalnya server bastion, proxy, atau firewall — yang memblokir kemampuan SSH untuk membuat channel forwarding meskipun konfigurasi sshd mengizinkannya.

Contoh konkret: bayangkan Anda memiliki setup di mana Anda SSH melalui bastion host. Perintah koneksi yang VSCode buat di balik layar kira-kira seperti:

ssh -o ConnectTimeout=15 -L 3000:localhost:3000 user@remote-host

Jika sshd di remote-host mengatur AllowTcpForwarding no, maka flag -L 3000:localhost:3000 akan diabaikan tanpa pesan error eksplisit di terminal SSH. VSCode baru menyadari bahwa forwarding tidak bekerja ketika ia mencoba mengirim data melalui channel yang seharusnya sudah terbuka, dan itulah momen error ini muncul di log.


Akar Masalah yang Paling Sering

Berdasarkan pengalaman komunitas dan laporan di repositori resmi VSCode, berikut adalah root cause terurut dari yang paling sering ditemui hingga yang lebih jarang, beserta cara memastikan penyebab mana yang sedang Anda alami.

1. AllowTcpForwarding no di sshd_config

Ini adalah penyebab paling dominan. Banyak administrator sistem yang secara sadar menonaktifkan TCP forwarding karena alasan keamanan — konfigurasi ini mencegah pengguna SSH membuat tunnel yang bisa digunakan untuk melewati firewall. File konfigurasi biasanya berada di /etc/ssh/sshd_config. Untuk memastikan, jalankan perintah berikut di remote host:

grep -i "AllowTcpForwarding" /etc/ssh/sshd_config

Jika outputnya AllowTcpForwarding no, maka inilah penyebabnya. Jika tidak ada output sama sekali, berarti direktif ini menggunakan nilai default, yaitu yes, dan Anda harus mencari penyebab lain.

2. Direktif Match yang meng-override konfigurasi global

Bahkan jika AllowTcpForwarding yes sudah diatur secara global, ada kemungkinan blok Match di akhir file sshd_config meng-override pengaturan tersebut untuk grup atau user tertentu. Misalnya:

Match Group restricted
    AllowTcpForwarding no

Untuk memeriksa apakah user Anda terkena efek blok Match ini:

# Cek grup user Anda
groups $(whoami)

# Lihat seluruh blok Match yang relevan
grep -A5 "^Match" /etc/ssh/sshd_config

3. PermitTunnel no menghalangi tunneling

Meskipun AllowTcpForwarding mengizinkan port forwarding, direktif PermitTunnel mengatur jenis tunneling yang lebih lanjut (tunnel device). Jika yang Anda butuhkan adalah TCP forwarding biasa, direktif ini biasanya tidak relevan. Namun, beberapa setup VSCode yang memanfaatkan fitur tunneling lanjutan bisa terpengaruh. Periksa dengan:

grep -i "PermitTunnel" /etc/ssh/sshd_config

4. SSH server yang di-deploy melalui container dengan konfigurasi hardened

Jika remote host Anda berupa container Docker atau Podman, seringkali image yang digunakan sudah dikonfigurasi dengan AllowTcpForwarding no sebagai bagian dari hardening. Ini sangat umum pada image berbasis Alpine yang dirancang untuk production. Anda perlu memeriksa konfigurasi di dalam container itu sendiri, bukan di host machine.

5. Firewall atau bastion host sebagai perantara

Jika koneksi SSH Anda melewati bastion host (jump server), kemungkinan bastion tersebut yang memblokir forwarding. Konfigurasi AllowTcpForwarding no di bastion akan mencegah forwarding meskipun remote host tujuan mengizinkannya. Anda bisa menguji ini dengan mencoba port forwarding manual:

ssh -L 9999:localhost:80 user@remote-host
# Di terminal lain, coba akses
curl http://localhost:9999

Jika perintah manual ini juga gagal (tidak ada respons di port 9999), maka masalahnya memang di level SSH, bukan di VSCode.


Solusi Step-by-Step

Mari kita selesaikan masalah ini langkah demi langkah. Setiap langkah disertai perintah yang bisa Anda salin langsung dan Keluaran yang tampak.

Langkah 1: Identifikasi konfigurasi sshd saat ini

Pertama, login ke remote host dan periksa konfigurasi aktif SSH server. Jangan hanya melihat file konfigurasi, karena bisa ada file include atau drop-in yang meng-override pengaturan.

# Periksa konfigurasi efektif (hasilnya termasuk semua file include)
sudo sshd -T | grep -i "allowtcpforwarding"

Keluaran yang tampak jika forwarding dinonaktifkan:

allowtcpforwarding no

Output jika forwarding diizinkan:

allowtcpforwarding yes

Perintah sshd -T sangat penting karena ia menampilkan konfigurasi efektif setelah semua file konfigurasi dan direktif Match diproses, bukan hanya isi satu file.

Langkah 2: Aktifkan kembali AllowTcpForwarding

Jika langkah pertama mengkonfirmasi bahwa AllowTcpForwarding bernilai no, edit file konfigurasi utama:

sudo nano /etc/ssh/sshd_config

Cari baris AllowTcpForwarding no dan ubah menjadi:

AllowTcpForwarding yes

Jika baris tersebut tidak ada, tambahkan di bagian yang sesuai (biasanya setelah blok konfigurasi autentikasi). Jika ada blok Match yang meng-override untuk user Anda, Anda perlu menyesuaikan blok tersebut atau memindahkan user Anda ke grup yang diizinkan.

Langkah 3: Restart sshd dan verifikasi

Setelah menyimpan perubahan, restart service SSH:

# Untuk sistem dengan systemd (Ubuntu, Debian, CentOS 7+, dll.)
sudo systemctl restart sshd

# Untuk sistem dengan init.d
sudo service sshd restart

# Untuk Alpine Linux atau sistem tanpa systemd
sudo rc-service sshd restart

Verifikasi bahwa perubahan已经 berlaku:

sudo sshd -T | grep -i "allowtcpforwarding"
# Output: allowtcpforwarding yes

Langkah 4: Verifikasi port forwarding bekerja secara manual

Sebelum kembali ke VSCode, pastikan bahwa port forwarding benar-benar berfungsi melalui SSH langsung:

# Dari mesin lokal Anda
ssh -L 8080:localhost:80 user@remote-host

Di terminal lain di mesin lokal:

curl -I http://localhost:8080

Jika Anda mendapatkan respons HTTP (misalnya HTTP/1.1 200 OK atau HTTP/1.1 301 Moved Permanently), maka port forwarding sudah berfungsi dan masalah ada di sisi VSCode. Jika tidak ada respons, masalah masih ada di konfigurasi SSH server.

Langkah 5: Reconnect VSCode

Terakhir, putuskan koneksi remote di VSCode dan hubungkan kembali. Buka Command Palette (Ctrl+Shift+P atau Cmd+Shift+P di Mac), pilih Remote-SSH: Disconnect from Remote, lalu hubungkan kembali seperti biasa. Setelah terhubung, buka panel PORTS di area terminal dan coba lakukan forward port secara manual dengan mengklik "Forward a Port" dan memasukkan nomor port.

Memastikan perbaikan berhasil sepenuhnya: jalankan server sederhana di remote host dan pastikan bisa diakses dari lokal:

# Di remote host, buat server sederhana
python3 -m http.server 9876

Kemudian di panel PORTS VSCode, forward port 9876. Buka browser di komputer lokal dan akses http://localhost:9876. Jika Anda melihat listing direktori dari remote host, maka masalah sudah sepenuhnya terselesaikan.


Fix Permanen (Bukan Workaround)

Solusi di atas akan bekerja, tetapi jika Anda hanya mengubah sshd_config tanpa strategi lebih lanjut, konfigurasi bisa kembali berubah saat sistem di-update atau saat administrator lain mengubah konfigurasi. Berikut adalah langkah-langkah untuk memastikan fix ini bersifat permanen.

Menggunakan drop-in configuration alih-alih mengedit file utama

Pada sistem modern, praktik terbaik adalah tidak mengedit /etc/ssh/sshd_config secara langsung, melainkan membuat file drop-in di /etc/ssh/sshd_config.d/. Ini mencegah konflik saat update paket:

# Pastikan direktori drop-in ada
sudo mkdir -p /etc/ssh/sshd_config.d/

# Buat file konfigurasi khusus untuk port forwarding
sudo tee /etc/ssh/sshd_config.d/50-vscode-portforward.conf > /dev/null << 'EOF'
# Konfigurasi untuk mengizinkan VSCode Remote port forwarding
AllowTcpForwarding yes
GatewayPorts no
EOF

# Restart sshd agar perubahan berlaku
sudo systemctl restart sshd

Keuntungan pendekatan ini: file drop-in tidak akan ditimpa oleh update paket openssh-server, dan prioritasnya bisa diatur melalui penomoran (50 = diproses setelah file 00-49). Perhatikan bahwa direktif pada file drop-in hanya akan meng-override file utama jika kata kunci yang sama belum didefinisikan dengan nilai berbeda di file utama — pada beberapa distribusi, file utama mungkin sudah punya AllowTcpForwarding no. Jika itu masalahnya, Anda perlu memberi komentar baris tersebut di file utama.

Menangani perbedaan antar sistem operasi

Ubuntu/Debian:

# Periksa apakah sshd_config menyertakan drop-in directory
grep -i "Include" /etc/ssh/sshd_config | head -3
# Output: Include /etc/ssh/sshd_config.d/*.conf

Ubuntu 22.04+ secara default sudah menyertakan direktif Include di awal file, sehingga drop-in approach langsung bekerja.

CentOS/RHEL/Rocky Linux:

# CentOS 8+ biasanya sudah mendukung drop-in
ls -la /etc/ssh/sshd_config.d/
# Jika direktori tidak ada, Anda perlu membuatnya dan menambahkan Include
sudo mkdir -p /etc/ssh/sshd_config.d/
echo "Include /etc/ssh/sshd_config.d/*.conf" | sudo tee -a /etc/ssh/sshd_config

Alpine Linux (umum di Docker):

# Alpine menggunakan OpenRC, bukan systemd
# Pastikan konfigurasi drop-in di-include
grep -i "Include" /etc/ssh/sshd_config
# Jika tidak ada, tambahkan manual
echo "Include /etc/ssh/sshd_config.d/*.conf" | sudo tee -a /etc/ssh/sshd_config
sudo mkdir -p /etc/ssh/sshd_config.d/
sudo tee /etc/ssh/sshd_config.d/50-portforward.conf > /dev/null << 'EOF'
AllowTcpForwarding yes
EOF
sudo rc-service sshd restart

Kebiasaan yang baik keamanan

Mengaktifkan AllowTcpForwarding yes secara global bisa menjadi risiko keamanan pada environment multi-user. Pendekatan yang lebih aman adalah membatasi hanya untuk user atau grup tertentu:

sudo tee /etc/ssh/sshd_config.d/50-vscode-portforward.conf > /dev/null << 'EOF'
# Nonaktifkan secara default
AllowTcpForwarding no

# Izinkan hanya untuk grup developers
Match Group developers
    AllowTcpForwarding yes
EOF

sudo systemctl restart sshd

Kemudian pastikan user Anda masuk ke grup developers:

sudo usermod -aG developers $(whoami)
# Logout dan login kembali agar keanggotaan grup berlaku

Pendekatan ini memberikan keseimbangan antara fungsionalitas development dan keamanan server. Pada environment produksi yang benar-benar terisolasi, Anda bahkan bisa membatasi lebih lanjut dengan PermitOpen untuk hanya mengizinkan forwarding ke port tertentu:

Match Group developers
    AllowTcpForwarding yes
    PermitOpen localhost:3000 localhost:8080 localhost:5432

Direktif PermitOpen membatasi forwarding hanya ke host:port yang disebutkan, menutup celah potensial abuse tanpa mengorbankan fungsionalitas yang dibutuhkan developer.


Kalau Masih Belum Teratasi

Kalau semuanya sudah dicoba tapi masih error tetapi error masih muncul, ada beberapa skenario yang perlu diinvestigasi lebih dalam. Situasi ini tidak jarang terjadi, terutama pada environment yang kompleks dengan multiple layer security.

Kemungkinan yang sering terlewat

Pertama, periksa apakah ada lebih dari satu instance sshd yang berjalan. Kadang setelah restart, proses lama masih menahan konfigurasi sebelumnya:

# Periksa semua proses sshd
ps aux | grep sshd

# Jika ada lebih dari satu proses master, kill semua dan restart
sudo pkill -9 sshd
sudo systemctl start sshd

Kedua, pastikan tidak ada konfigurasi di sisi klien SSH (komputer lokal Anda) yang memblokir port forwarding. Periksa file ~/.ssh/config:

cat ~/.ssh/config | grep -i "forward”

Jika ada baris ForwardAgent no atau LocalForward yang konflik, itu bisa menyebabkan masalah. Pastikan konfigurasi host remote Anda di ~/.ssh/config tidak secara eksplisit menonaktifkan forwarding:

Host my-remote
    HostName 192.168.1.100
    User developer
    ForwardAgent yes

Ketiga, pada beberapa kasus, versi VSCode Server yang outdated di remote host bisa menjadi penyebab. VSCode secara otomatis mendownload VS Code Server di remote host pada path ~/.vscode-server/. Terkadang update gagal dan versi lama yang bermasalah masih digunakan:

# Hapus cache VSCode Server di remote host
rm -rf ~/.vscode-server/bin/
rm -rf ~/.vscode-server/data/
rm -rf ~/.vscode-server/extensions/

# Reconnect dari VSCode — server akan di-download ulang

Cara membaca log dengan benar

Log adalah teman terbaik Anda ketika solusi standar tidak bekerja. VSCode menyediakan beberapa level logging yang bisa diaktifkan. Untuk melihat log detail dari Remote-SSH, ikuti langkah berikut di mesin lokal:

  1. Buka Command Palette (Ctrl+Shift+P)
  2. Jalankan Developer: Set Log Level...
  3. Pilih Trace
  4. Buka Output panel (View > Output)
  5. Pilih Remote Server dari dropdown

Anda akan melihat log yang sangat detail, termasuk setiap percobaan koneksi SSH dan port forwarding. Cari baris yang mengandung kata forward, tunnel, atau error. Contoh log yang menunjukkan masalah konfigurasi SSH:

[trace] [remoteagent] Attempting to forward port 3000
[error] [remoteagent] Port forward request denied by server
[error] [remoteagent] tcp port forwarding appears to be disabled on the remote host

Log yang menunjukkan masalah network/firewall:

[trace] [remoteagent] Attempting to forward port 3000
[trace] [remoteagent] Forward channel opened, waiting for connection
[error] [remoteagent] Connection to forwarded port timed out after 15000ms

Perbedaan antara "denied by server" dan "timed out" sangat penting — yang pertama menunjukkan masalah konfigurasi sshd, sedangkan yang kedua menunjukkan masalah network/firewall.

Anda juga bisa memeriksa log sshd di remote host langsung:

# Ubuntu/Debian
sudo journalctl -u sshd --since "5 minutes ago" --no-pager

# CentOS/RHEL
sudo journalctl -u sshd --since "5 minutes ago" --no-pager

# Jika log level sshd belum diaktifkan, tambahkan DEBUG
sudo sed -i 's/^#*LogLevel.*/LogLevel DEBUG3/' /etc/ssh/sshd_config
sudo systemctl restart sshd
# Setelah reproduksi error, cek log:
sudo journalctl -u sshd --since "1 minute ago" --no-pager | grep -i "forward\|denied\|channel"

Bacaan resmi terkait

Jika Anda sudah sampai pada titik ini dan masalah masih belum teratasi, berikut adalah sumber resmi yang Direkomendasikan untuk investigasi lebih lanjut:

  1. Dokumentasi resmi VSCode Remote: https://code.visualstudio.com/docs/remote/troubleshooting — berisi troubleshooting guide lengkap termasuk tips untuk SSH connection dan port forwarding issues.

  2. GitHub Issues VSCode Repository: Cari issue yang relevan di https://github.com/microsoft/vscode-remote-release/issues dengan keyword "tcp port forwarding disabled". Banyak edge case spesifik yang sudah didokumentasikan di sini, termasuk masalah dengan distro tertentu atau konfigurasi SSH yang tidak standar.

  3. Manual page OpenSSH: man sshd_config di remote host memberikan dokumentasi lengkap untuk setiap direktif konfigurasi, termasuk interaksi antara AllowTcpForwarding, PermitOpen, dan PermitTunnel.

  4. Forum komunitas: Stack Overflow tag vscode-remote dan subreddit r/vscode sering memiliki diskusi tentang edge case yang belum tercakup di dokumentasi resmi.

Sebagai catatan penutup, error ini memang frustrasi karena pesannya terasa samar dan bisa disebabkan oleh banyak faktor. Namun dengan pendekatan sistematis — memulai dari pengecekan konfigurasi sshd, memastikan tidak ada override dari blok Match atau drop-in files, menguji port forwarding secara manual, dan membaca log dengan cermat — Anda hampir pasti bisa mengidentifikasi dan menyelesaikan akar masalahnya. Kunci utamanya adalah jangan langsung mengubah konfigurasi secara membabi buta; gunakan sshd -T untuk melihat konfigurasi efektif terlebih dahulu, lalu lakukan perubahan yang tepat sasaran.