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-hostJika 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_configJika 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 noUntuk 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_config3. 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_config4. 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:9999Jika 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 noOutput jika forwarding diizinkan:
allowtcpforwarding yesPerintah 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_configCari baris AllowTcpForwarding no dan ubah menjadi:
AllowTcpForwarding yesJika 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 restartVerifikasi bahwa perubahan已经 berlaku:
sudo sshd -T | grep -i "allowtcpforwarding"
# Output: allowtcpforwarding yesLangkah 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-hostDi terminal lain di mesin lokal:
curl -I http://localhost:8080Jika 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 9876Kemudian 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 sshdKeuntungan 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/*.confUbuntu 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_configAlpine 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 restartKebiasaan 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 sshdKemudian pastikan user Anda masuk ke grup developers:
sudo usermod -aG developers $(whoami)
# Logout dan login kembali agar keanggotaan grup berlakuPendekatan 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:5432Direktif 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 sshdKedua, 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 yesKetiga, 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 ulangCara 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:
- Buka Command Palette (
Ctrl+Shift+P) - Jalankan Developer: Set Log Level...
- Pilih Trace
- Buka Output panel (
View > Output) - 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 hostLog 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 15000msPerbedaan 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:
Dokumentasi resmi VSCode Remote: https://code.visualstudio.com/docs/remote/troubleshooting — berisi troubleshooting guide lengkap termasuk tips untuk SSH connection dan port forwarding issues.
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.
Manual page OpenSSH:
man sshd_configdi remote host memberikan dokumentasi lengkap untuk setiap direktif konfigurasi, termasuk interaksi antaraAllowTcpForwarding,PermitOpen, danPermitTunnel.Forum komunitas: Stack Overflow tag
vscode-remotedan subredditr/vscodesering 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.