Episode ini membahas GRE sebagai pembawa data PPTP: struktur header GRE versi 1, cara frame PPP dienkapsulasi, overhead yang ditambahkan, pertimbangan MTU dan MSS clamping, serta keterbatasan GRE yang stateless dan tidak ramah NAT.

Jika control channel adalah otak PPTP, maka GRE adalah tulang punggungnya. Semua data yang kalian kirim melalui tunnel diangkut oleh GRE, dan sifat-sifat GRE inilah yang menentukan kecepatan, kompatibilitas, dan masalah NAT yang terkenal dari PPTP.
Episode 5 membedah Generic Routing Encapsulation: struktur header-nya, bagaimana frame PPP dibungkus, overhead yang harus diperhitungkan untuk MTU, teknik MSS clamping, dan keterbatasan fundamental GRE.
GRE (Generic Routing Encapsulation) adalah protokol tunneling yang didefinisikan di RFC 2784. Tugasnya sederhana: membungkus sebuah paket atau frame di dalam paket IP lain, sehingga seolah-olah kedua jaringan saling terhubung langsung.
PPTP memakai GRE versi 1 yang didefinisikan khusus di RFC 2637. Header GRE versi 1 ini menambahkan field Call ID dan sequence number yang tidak ada di GRE standar — inilah yang membedakan GRE-nya PPTP dari GRE VPN lain.
sudo tcpdump -i any proto 47 -ntcpdump -i any proto 47 -n menampilkan semua paket GRE. Ketika tunnel PPTP aktif dan ada transfer data, kalian akan melihat aliran paket dengan protocol 47 yang membawa frame PPP.
GRE standar didefinisikan di RFC 2784 dan bersifat umum: ia bisa membungkus protokol apa pun di dalam IP. PPTP memakai varian khusus yang dicatat di RFC 2637, dengan dua field tambahan: Call ID untuk mengidentifikasi tunnel dan sequence number untuk menjaga urutan paket.
Konsekuensinya, filter paket di firewall tidak cukup hanya melihat protocol 47. Untuk membedakan GRE PPTP dari GRE lain, kalian perlu memeriksa versi header GRE — sesuatu yang umumnya sudah ditangani otomatis oleh modul conntrack PPTP yang dibahas di episode 16.
Saat aplikasi mengirim data, urutan enkapsulasinya adalah: payload dibungkus frame PPP, frame PPP dipotong sesuai MTU PPP, lalu dimasukkan sebagai payload GRE. Paket GRE kemudian diberi header IP tujuan.
Header GRE PPTP berisi versi, flag, Call ID untuk membedakan tunnel, dan sequence number untuk mendeteksi kehilangan paket pada mode stateful MPPE. Tanpa Call ID, server tidak bisa membedakan beberapa klien sekaligus dalam satu connection.
Setiap lapisan menambah byte:
Total overhead PPTP biasanya berada di kisaran 50-80 byte tergantung opsi. Artinya, jika MTU jaringan adalah 1500, payload maksimum yang bisa dikirim hanya sekitar 1400 byte.
Agar paket tidak terpecah (fragment), MTU interface PPP harus dikurangi. Di file opsi pppd:
mtu 1400
mru 1400Baris mtu 1400 dan mru 1400 membatasi ukuran frame agar sesuai dengan overhead PPTP. Nilai 1400 adalah titik awal yang umum; pada jaringan dengan MTU lebih kecil, kalian perlu menurunkannya lagi.
MSS (Maximum Segment Size) dinegosiasikan saat handshake TCP. Jika aplikasi menetapkan MSS 1460 untuk MTU 1500, paket di dalam tunnel PPTP akan melebihi batas dan pecah. Solusinya adalah MSS clamping di firewall.
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtuAturan iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu menyesuaikan MSS setiap koneksi TCP yang lewat berdasarkan path MTU. Ini sering menjadi penyelamat saat situs web terasa lambat atau tidak bisa dibuka melalui tunnel.
Nilai MSS yang benar mengikuti rumus sederhana: MTU tunnel dikurangi ukuran header TCP dan IP. Untuk MTU tunnel 1400, hasilnya sekitar 1360:
Jika clamping otomatis tidak tersedia di firewall kalian, pasang nilai eksplisit dengan --set-mss 1360 pada aturan TCPMSS. Pastikan nilai ini konsisten dengan MTU yang dikonfigurasi di file opsi pppd, dan sesuaikan lagi setiap kali MTU tunnel diubah.
GRE adalah protokol yang stateless: ia tidak melacak status koneksi, tidak menawarkan retransmission, dan tidak memiliki konsep congestion control. Semua itu diserahkan ke TCP yang ada di atasnya.
GRE juga tidak memiliki enkripsi bawaan. Keamanan data di tunnel PPTP sepenuhnya bergantung pada MPPE yang bersifat opsional. Jika MPPE tidak aktif, semua data melintas dalam bentuk plaintext di dalam GRE — risiko yang akan kita bahas di episode 13.
Karena GRE hanya memakai protocol number tanpa port, router NAT tidak bisa membedakan sesi GRE yang berbeda. Ini menyebabkan banyak koneksi PPTP gagal di belakang NAT. Detail dan solusinya akan dibahas utuh di episode 16.
GRE PPTP memiliki sequence number sendiri, dan fragmentasi di tingkat IP bisa menyulitkan tunnel. Ketika paket GRE terpecah di jaringan, urutannya bisa kacau dan performa menurun drastis. Itulah mengapa MTU tunnel harus selalu lebih kecil dari MTU jalur fisik.
Aturan praktisnya: mulai dari MTU jalur fisik (misalnya 1500), kurangi overhead PPTP (sekitar 80 byte), lalu tambahkan margin kecil. Hasilnya biasanya di kisaran 1400. Untuk jalur PPPoE yang sudah memakai MTU 1492, angka tunnel perlu turun lagi menjadi sekitar 1300.
Setelah mengubah MTU, selalu uji dengan transfer file berukuran besar dan ping dengan ukuran maksimum. Jika ada penurunan kinerja, periksa ulang perhitungan overhead dan pastikan aturan MSS clamping sudah dipasang di firewall.
Episode 5 memetakan lapisan data PPTP: header GRE versi 1 dengan Call ID dan sequence number, overhead 50-80 byte yang mengharuskan MTU turun, teknik MSS clamping, serta keterbatasan GRE yang stateless dan tidak ramah NAT.
Inti yang harus dibawa pulang:
mtu 1400 dan mru 1400 adalah titik awal yang umum di pppd.Di episode 6 selanjutnya kita akan membahas MPPE, enkripsi Microsoft untuk PPTP — bagaimana kunci diturunkan dari password MS-CHAPv2, konfigurasi MPPE 128-bit, dan kelemahan kriptografis yang membuatnya rentan.