Mengurai header ekstensi IPv6 yang berisi ekstensi yang tidak dikenal

113

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?

AdamIerymenko
sumber
10
Berdasarkan pertanyaan ini, sepertinya saya tidak bodoh dan ya saya membaca ini dengan benar: tidak mungkin (di dunia nyata) menambahkan header ekstensi baru ke IPv6. stackoverflow.com/questions/9847923/…
AdamIerymenko
10
Dan ya, tampaknya juga panjang tajuk komputasi memerlukan traversal daftar tertaut: stackoverflow.com/questions/14762193/… Jangan salah paham. IPv6 luar biasa dan sangat dibutuhkan. Tapi ini masih tampak berkepala dingin.
AdamIerymenko
3
Spesifikasi (ditautkan di komentar atas) mengatakan router tidak seharusnya melihat header, jadi tidak peduli header apa yang Anda tambahkan. Hanya node tujuan yang seharusnya melihat header.
Anders E. Andersen
2
Sekadar catatan: "hair-brained" adalah ejaan yang cukup membingungkan, dan "hare-brained" sebaiknya lebih disukai (sumber: tfd )
pzkpfw
2
Sejauh ini hanya ada satu ejaan yang benar, yaitu 'berotak kelinci'.
Alan B

Jawaban:

33

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.

arnt
sumber
97

Bagaimana jika saya menemukan jenis tajuk ekstensi yang tidak dikenal?

Dari RFC 2460 :

Jika, sebagai hasil dari pemrosesan header, node diperlukan untuk melanjutkan ke header berikutnya tetapi nilai Header Berikutnya di header saat ini tidak dikenali oleh node, ia harus membuang paket dan mengirim pesan Masalah Parameter ICMP ke sumber paket , dengan nilai Kode ICMP 1 ("jenis Header Berikutnya yang tidak dikenal") dan bidang Penunjuk ICMP yang berisi offset dari nilai yang tidak dikenal dalam paket asli. Tindakan yang sama harus diambil jika node menemukan nilai Header Berikutnya nol di header selain header IPv6.

Oliver Charlesworth
sumber
15
Baik. Saya pikir saya sudah gila. Jadi ya, ini benar-benar desain yang benar-benar tidak dapat diperluas ... setidaknya tanpa sinyal in-band dan peretasan lainnya. Itu bisa dimaafkan dalam protokol aplikasi di mana Anda mengontrol kedua ujungnya dan hanya harus memperhitungkan versi baru aplikasi Anda, tetapi tidak dalam sesuatu yang dirancang untuk bertahan selama ... ratusan tahun?
AdamIerymenko
8
Memiliki kemampuan untuk mengabaikan tajuk yang tidak dikenal akan menyebabkan masalah yang jauh lebih rumit. (Bagaimana jika proxy perantara memodifikasi header TCP tanpa pengetahuan tentang header ESP yang merangkum?) Kesederhanaan mengalahkan "extensible" dalam kasus ini!
jman
4
@Max IPv6 memiliki alamat yang cukup untuk menetapkan satu alamat ke setiap atom di Bumi. Tidak ada pemanggang roti yang tersambung ke Internet yang akan menghabiskan ruang ini.
Tyler McHenry
8
@Max Saya tidak akan mengatakan bahwa kita sama sekali tidak membutuhkan IPv7, tetapi dengan IPv6 kita memiliki ruang alamat yang cukup untuk memberikan setiap milimeter kubik di atmosfer bumi (130.000 km ke atas) alamat unik ... 100.000 kali lipat. Jadi maksud saya, begitu kita mulai menjajah galaksi lain, kita mungkin memiliki sesuatu yang perlu dikhawatirkan, tetapi sampai saat itu kita harus cukup baik.
cincodenada
4
Beberapa konteks hilang: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.
Tobu
28

Tidak mungkin (di dunia nyata) menambahkan header ekstensi baru ke IPv6.

Salah, karena:

  1. Hanya host tujuan yang diizinkan untuk menolak berdasarkan header ekstensi yang tidak dikenal (dengan satu pengecualian yang disebutkan dalam pertanyaan yang Anda tautkan )

  2. Jika tajuk ekstensi baru Anda dalam beberapa cara opsional (sebaiknya), Anda akan menerima kesalahan ICMP tentang itu dan dapat mencoba lagi tanpanya.

Andreas Klöckner
sumber
1
Dan Anda yakin bahwa paket ICMP akan berhasil melewati NAT ke pengirim yang sebenarnya?
Dexter
5
@Dexter ipv6 akan membunuh NAT ... semoga
Janus Troelsen
2
@Dexter: Paket ICMP tersebut harus tiba karena sejumlah alasan. Misalnya, jika MTU pipa telah menyusut (mungkin enkapsulasi paket telah terjadi karena PPPoE atau VPN), dan paket yang dikirim terlalu besar, paket ICMP akan dikembalikan dengan mengatakan bahwa paket tersebut terlalu besar.
Bill Lynch
4
@JanusTelsen tidak semua orang berbagi harapan Anda.
Dexter
4

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.

Michael Hampton
sumber