Ubah TTL di macOS biar hotspot HP tidak di-throttle

Pernah kejadian, internet di HP kenceng banget, tapi begitu di-tethering ke laptop lewat hotspot tiba-tiba melambat drastis? Itu bukan perasaan doang. Banyak operator seluler memang sengaja membatasi (throttle) trafik hotspot, meskipun kuota utama masih banyak. Yang menarik, salah satu cara mereka mendeteksi trafik hotspot itu sederhana: lewat nilai TTL di setiap paket.

Di tulisan ini saya catat cara mengakali deteksi itu di macOS dengan mengubah TTL default — trik yang saya temukan dari artikel ini.

Kenapa TTL bisa jadi penanda hotspot?

TTL (Time To Live) itu angka di header paket IP yang gunanya membatasi berapa banyak “hop” (lompatan antar router) sebuah paket boleh lewati sebelum dibuang. Setiap kali paket melewati satu hop, nilainya dikurangi satu.

Di kebanyakan sistem, paket lahir dengan TTL = 64. Nah, logika deteksi operator kira-kira begini:

Jadi triknya jelas: kalau kita bikin paket dari laptop lahir dengan TTL 65, setelah lewat satu hop ke HP nilainya jadi 64 — persis seperti trafik langsung dari HP. Operator pun tidak curiga.

Ubah TTL sekarang juga

Di macOS, TTL diatur lewat sysctl. Ada dua parameter — satu untuk IPv4, satu untuk IPv6:

$ sudo sysctl net.inet.ip.ttl=65
net.inet.ip.ttl: 64 -> 65

$ sudo sysctl net.inet6.ip6.hlim=65
net.inet6.ip6.hlim: 64 -> 65

Selesai. Coba langsung tethering lagi, harusnya speed-nya kembali normal.

Perlu diingat, perubahan ini hanya bertahan sampai laptop di-restart. Setelah reboot, nilainya balik lagi ke 64.

Bikin permanen dengan LaunchDaemon

Biar tidak perlu ketik ulang tiap kali booting, kita bikin LaunchDaemon yang menjalankan perintah tadi otomatis saat startup. Buat dua file plist di /Library/LaunchDaemons/.

Yang pertama untuk IPv4, com.custom.ttl.ipv4.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.custom.ttl.ipv4</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/sbin/sysctl</string>
        <string>net.inet.ip.ttl=65</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Yang kedua untuk IPv6, com.custom.ttl.ipv6.plist — isinya sama, cuma ganti label dan parameternya:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.custom.ttl.ipv6</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/sbin/sysctl</string>
        <string>net.inet6.ip6.hlim=65</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Setelah kedua file dibuat, load supaya aktif (dan otomatis jalan tiap boot berikutnya):

$ sudo launchctl load /Library/LaunchDaemons/com.custom.ttl.ipv4.plist
$ sudo launchctl load /Library/LaunchDaemons/com.custom.ttl.ipv6.plist

Untuk memastikan nilainya sudah benar, cek lagi:

$ sysctl net.inet.ip.ttl net.inet6.ip6.hlim
net.inet.ip.ttl: 65
net.inet6.ip6.hlim: 65

Catatan

Simpel, tapi lumayan menyelamatkan waktu WFC (work from cafe) ketika satu-satunya internet yang ada cuma hotspot HP.