Episode ini membedah NAT Traversal: mengapa ESP tidak bisa melewati NAT, bagaimana IKE dan ESP dibungkus ulang dalam UDP 4500, serta opsi konfigurasi NAT-T di Libreswan, strongSwan, dan xl2tpd.

Sebagian besar pengguna VPN berada di belakang router yang melakukan NAT. Tanpa penanganan khusus, L2TP/IPsec mereka tidak akan pernah terhubung. Episode 14 membahas NAT Traversal (NAT-T) — mekanisme yang memungkinkan IPsec menembus NAT dengan membungkus ESP dalam UDP.
Topik ini sangat penting dalam praktik nyata, karena hampir semua deployment remote access berurusan dengan client di balik NAT. Memahami cara kerja NAT-T juga membantu kalian membaca gejala aneh di log, seperti perpindahan port dari 500 ke 4500.
ESP berjalan langsung di atas IP dengan protocol number 50, tanpa port TCP atau UDP. NAT memerlukan port untuk membedakan banyak koneksi di balik satu alamat IP — dan ESP tidak memilikinya. Akibatnya, dua client di balik NAT yang sama tidak bisa dibedakan, dan perubahan alamat sumber membuat checksum dan SPI tidak konsisten.
Ketika IPsec mendeteksi bahwa salah satu sisi berada di balik NAT, IKE memindahkan seluruh negosiasinya dari UDP 500 ke UDP 4500. Kunci penting: ESP asli berjalan di atas UDP 4500, bukan sebagai protocol 50.
Alurnya:
Tanpa NAT : IKE (UDP 500) -> ESP (protocol 50)
Dengan NAT: IKE (UDP 4500) -> ESP dalam UDP (UDP 4500)Saat Phase 1 IKEv1 selesai, kedua pihak mengirim NAT-D (NAT Discovery) payload yang berisi hash dari alamat sumber dan tujuan. Jika hash tidak cocok dengan yang dikirim peer, berarti ada NAT di antara keduanya. Maka seluruh pertukaran pindah ke UDP 4500, dan setiap paket ESP dibungkus dengan header UDP yang memberi NAT port untuk diterjemahkan.
Libreswan dan strongSwan mendeteksi dan melakukan switch ini secara otomatis. Yang perlu kalian lakukan adalah memastikan opsi yang relevan aktif.
Libreswan mengaktifkan NAT-T secara default, tapi untuk remote access di belakang NAT, aktifkan nat_traversal dan force_keepalive:
conn L2TP-PSK
nat_traversal=yes
force_keepalive=yesforce_keepalive=yes membuat NAT router tetap memegang mapping UDP 4500 dengan mengirim keepalive berkala — tanpa ini, mapping bisa kedaluwarsa dan koneksi mati saat idle.
Di strongSwan, aktifkan di swanctl.conf dan kuatkan keepalive:
connections {
L2TP-NAT {
version = 1
proposals = aes256-sha256-modp2048
local-1 {
auth = psk
}
remote-1 {
auth = psk
}
children {
L2TP {
type = transport
local_ts = udp/1701
remote_ts = dynamic[udp]
esp_proposals = aes128-sha1
}
}
}
}
charon {
keep_alive = 20s
nat_keepalive = 20s
}Nilai nat_keepalive = 20s mengirim keepalive NAT tiap 20 detik.
xl2tpd tidak perlu konfigurasi khusus untuk NAT-T karena L2TP selalu berjalan di atas UDP 1701 yang sudah dibungkus ESP. Yang perlu dipastikan adalah ipsec saref = yes pada [global] untuk kompatibilitas penuh dengan NAT-T modern.
Verifikasi bahwa NAT-T aktif setelah client terhubung:
sudo ipsec statusall | grep -i nat
sudo journalctl -u strongswan | grep -i natBaris yang menampilkan NAT-Traversal: yes atau nat_traversal mengonfirmasi bahwa koneksi memakai UDP 4500.
Info
Firewall harus membuka UDP 4500 di kedua arah, bukan hanya UDP 500. Banyak kegagalan remote access dari client di balik NAT disebabkan UDP 4500 yang tidak dibuka.
Episode 14 menjelaskan NAT-T dari akar masalah hingga konfigurasi: ESP protocol 50 yang tidak NAT-friendly, mekanisme NAT-D dan pembungkusan ESP ke UDP 4500, opsi Libreswan dan strongSwan, serta peran pasif xl2tpd.
Inti yang harus dibawa pulang:
force_keepalive di Libreswan menjaga mapping NAT tetap hidup.nat_keepalive di bagian charon.Di episode 15 selanjutnya kita akan membahas performance tuning dan MTU — menghitung overhead L2TP/IPsec, melakukan MSS clamping, mengatur mtu interface PPP, dan mengoptimalkan kinerja dengan AES-NI serta multiprosesor.