Bagaimana mencegah spoofing IP menggunakan MAC dan ebtables?

10

Saya mencoba membuat aturan penyandingan IP-MAC di ebtables . Ada beberapa tutorial dan pertanyaan terkait [1] yang tersedia tetapi saya memiliki jenis pengaturan khusus.

LINGKUNGAN: Saya memiliki banyak host fisik . Setiap host memiliki beberapa kartu ethernet, bergabung dalam ikatan dan digunakan sebagai slave untuk bridge. Ada banyak mesin virtual di setiap host (kvm, qemu, libvirt). Setiap mesin virtual terhubung ke jembatan host fisiknya melalui port baru bernama vnet [0-9] +. Tidak ada NAT. Jaringan berfungsi dengan baik, semua host fisik dapat di-ping, semua mesin virtual juga. Setiap mesin virtual memiliki alamat IP dan alamat MAC sendiri.

MASALAH: Di dalam mesin virtual, alamat IP dapat diubah ke yang lain.

SOLUSI DITEMUKAN: Ada solusi yang diketahui di situs ebtables [2], tetapi solusi ini dapat diterapkan ketika hanya satu host yang digunakan. Ini memungkinkan semua lalu lintas dan jika ada paket dari IP dengan MAC lain dari yang diizinkan, paket dijatuhkan. Jika ada lebih dari satu host, semua pasangan IP-MAC yang ada harus terdaftar pada semua host. Ada kebutuhan untuk solusi kebijakan terbalik.

SOLUSI CRAFTED: Saya telah mencoba menggunakan ebtables dengan cara terbalik. Berikut ini contoh yang saya coba.

CONTOH 1

Bridge table: filter
Bridge chain: INPUT, entries: 2, policy: DROP
-i bond0 -j ACCEPT 
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

CONTOH 2

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: DROP
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

Inti dari apa yang saya inginkan adalah memiliki DROP kebijakan default dan hanya mengizinkan lalu lintas dari mesin virtual dengan pasangan IP-MAC yang benar yang digunakan pada host yang diberikan. Namun, solusi itu tidak berhasil.

PERTANYAAN: Bagaimana mengizinkan lalu lintas di jembatan hanya untuk pasangan IP-MAC tertentu yang menjalankan mesin virtual dan menjatuhkan semua pasangan IP-MAC yang tidak dikenal yang datang dari ports vnet [0-9] +?

Terima kasih banyak atas jawaban Anda.

Martin
sumber
2
Tapi, bagaimana jika seseorang memalsukan mac mereka?
Zoredache
1
Nah, itu juga masalah. Tetapi menebak pasangan IP-MAC yang benar sangat sulit dan tepat waktu melebihi tingkat keamanan layanan saya.
Martin

Jawaban:

12

Saya akhirnya berhasil membuat solusi kerja.

  1. Solusi menggunakan ebtables dan pasangan IP-MAC.
  2. Hanya tabel yang dibutuhkan adalah tabel 'filter' default.
  3. Tidak perlu menambahkan aturan atau kebijakan ke rantai INPUT, karena rantai INPUT TIDAK terkait dengan menjalankan mesin virtual. Penjelasan arti rantai INPUT, OUTPUT dan FORWARD di tabel filter ada di halaman tabel ebtables.
  4. Karena ebtables berfungsi pada tingkat ethernet dan pemasangan IP-MAC hanya dapat diterapkan untuk paket IP, ada kebutuhan untuk menegaskan bahwa dalam aturan agar tidak memblokir frame ARP dan lalu lintas penting lainnya.

Jadi, pada awalnya, tidak ada aturan apa pun dan semua kebijakan diatur untuk MENERIMA. Tidak ada rantai yang ditentukan pengguna. Tabel filter terlihat seperti ini:

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

Rantai baru ditambahkan. Rantai ini berisi semua pasangan IP-MAC yang diizinkan. Itu disebut VMS.

# ebtables -N VMS

Sekarang, bagian yang penting. Untuk setiap frame yang berisi paket IP (atau bagian-bagiannya) yang melalui bridge dari port vnet [0-9] +, terapkan kebijakan rantai dan aturan rantai VMS. Dengan kata lain, untuk setiap paket IP yang datang dari mesin virtual apa pun, terapkan rantai VMS.

# ebtables -A FORWARD -p ip -i vnet+ -j VMS

Kebijakan default rantai VMS harus DROP. Dengan cara ini, setiap paket IP yang berasal dari mesin virtual mana pun akan dihapus secara default. Kemudian, pengecualian pasangan IP-MAC yang diizinkan ditambahkan. DROP kebijakan default menyebabkan, bahwa semua lalu lintas dari mesin virtual apa pun dengan pasangan IP-MAC yang tidak diketahui dibuang sekaligus, membuat spoofing IP menjadi tidak mungkin.

# ebtables -P VMS DROP

Filter tabel terlihat seperti ini sekarang. Juga, cara ini terlihat ketika tidak ada mesin virtual yang berjalan (diizinkan).

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-p IPv4 -i vnet+ -j VMS
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Bridge chain: VMS, entries: 0, policy: DROP

Misalkan, ada dua mesin yang berjalan. Jika kami mencoba melakukan ping ke / dari mereka, lalu lintas turun dan tujuan tidak dapat dijangkau. Ini adalah hasil yang diinginkan, karena lalu lintas ini belum diizinkan. Hanya satu perintah yang cukup untuk memungkinkan setiap lalu lintas mesin virtual.

# ebtables -A VMS -p ip --ip-src 192.168.11.125 -s 54:52:00:cc:35:fa -j ACCEPT
# ebtables -A VMS -p ip --ip-src 192.168.11.122 -s 54:52:00:98:d7:b6 -j ACCEPT

Sekarang, lalu lintas dari mesin virtual yang diizinkan mengalir dengan baik dan spoofing IP dicegah.

Solusi ini mungkin tidak sempurna dan jika Anda memiliki komentar atau perbaikan, saya akan dengan senang hati mendengarnya.

Martin
sumber