Saya menulis filter bersih yang sangat sederhana, dan menuju ke tempat saya ingin mengurai header IPv6 agar sesuai dengan hal-hal seperti jenis ICMPv6, nomor port TCP / UDP, dll.
Jadi saya membaca tentang format paket IPv6 secara mendalam, dan saya seperti ... yah ... Saya harus membacanya berulang kali untuk memastikan saya benar-benar membacanya dengan benar. Menurut saya, Anda harus memulai dengan header tetap 40-byte dan melihat bidang header berikutnya. Kemudian Anda harus melihat bidang header berikutnya dari header, dan seterusnya, seperti daftar tertaut, hingga Anda mencapai akhir. Jika ada muatan, itu akan mengikuti.
Masalahnya adalah tidak ada kolom panjang baik di header tetap atau header ekstensi. Anda harus memiliki tabel jenis tajuk ekstensi dan ukurannya sehingga Anda dapat mengejar daftar tertaut ini sampai akhir.
Ini menurut saya sebagai desain yang aneh, bahkan mungkin berotak kelinci. Bagaimana jika saya menemukan jenis tajuk ekstensi yang tidak dikenal? Apa yang saya lakukan? Saya tidak tahu panjangnya. Saya kira saya harus membuang paket dan memblokirnya, karena dalam filter bersih yang memungkinkan paket melalui akan memungkinkan penyerang untuk menghindari filter bersih dengan memasukkan jenis header palsu. Tetapi itu berarti bahwa jika protokol tersebut diperpanjang, setiap bagian dari perangkat lunak pengurai header IPv6 yang pernah ditulis harus diperbarui secara bersamaan jika ekstensi baru akan digunakan.
Jadi, bagaimana saya dapat mengurai header IPv6 jika saya tidak mengetahui ekstensi yang mereka gunakan? Bagaimana saya bisa melewati tajuk untuk ekstensi yang tidak diketahui, karena saya tidak tahu panjangnya?
sumber
Jawaban:
Jika Anda mengalami sesuatu yang tidak dapat Anda parse, Anda harus membuat keputusan atau melakukan tindakan berdasarkan apa yang sudah Anda parse.
Desainnya seperti itu karena di IPv6, setiap header ekstensi "membungkus" sisa paket. Jika Anda melihat header perutean, lalu beberapa header yang belum pernah Anda dengar, lalu payloadnya, Anda tidak dapat mengurai payload. Arti payload pada prinsipnya bergantung pada header yang Anda tidak tahu cara menafsirkannya.
Router dapat merutekan paket tersebut, karena yang mereka butuhkan hanyalah header perutean. Gadget inspeksi paket yang mendalam dan semacamnya perlu tahu banyak, tapi begitulah nasib mereka.
Diedit untuk menambahkan: Desain ini berarti middlebox hanya dapat mengubah apa yang mereka ketahui. Jika middlebox melihat header yang tidak diketahuinya, maka middlebox hanya memiliki dua opsi: Tolak atau teruskan. Di IPv4, itu juga bisa menghapus ekstensi yang tidak dikenal dan meneruskan sisanya. IMO properti ini membuat desain lebih dapat diperluas daripada kurang.
sumber
Dari RFC 2460 :
sumber
With one exception, extension headers are not examined or processed by any node along a packet's delivery path, until the packet reaches the node (or each of the set of nodes, in the case of multicast) identified in the Destination Address field of the IPv6 header.
Salah, karena:
Hanya host tujuan yang diizinkan untuk menolak berdasarkan header ekstensi yang tidak dikenal (dengan satu pengecualian yang disebutkan dalam pertanyaan yang Anda tautkan )
Jika tajuk ekstensi baru Anda dalam beberapa cara opsional (sebaiknya), Anda akan menerima kesalahan ICMP tentang itu dan dapat mencoba lagi tanpanya.
sumber
Pembaruan RFC 6564 mencakup kasus ini. Ini menjabarkan persis skenario yang Anda gambarkan dan mengedepankan format untuk setiap header ekstensi baru (jika ada yang pernah ditentukan) yang middlebox seperti milik Anda akan dapat bekerja dengannya, setidaknya untuk beberapa waktu.
Perlu diingat bahwa ini tidak dimaksudkan untuk memperluas IPv6 dengan membuat header ekstensi baru, tetapi dengan menambahkan Opsi Tujuan baru. Seharusnya sepele, atau setidaknya jauh lebih mudah, bagi Anda untuk berurusan dengan opsi tujuan yang tidak diketahui.
sumber