Balasan ARP berisi alamat MAC yang salah

14

Saya punya robot yang menjalankan linux dengan adaptor berkabel dan nirkabel. Ketika saya boot, itu terhubung ke denda nirkabel. Ketika saya menetapkan IP ke kabel (baik secara statis atau dengan DHCP), sepertinya berfungsi. Seperti dalam, ifconfigmenunjukkan IP yang tepat dan routemenunjukkan rute yang tepat. Namun, ketika saya melakukan permintaan ARP dari IP kabel, jawaban ARP berisi MAC nirkabel.

??? Tidak ada jembatan yang berjalan di robot, jadi mengapa saya tidak mendapatkan MAC kabel ???

Ketika kabel terputus, IP kabel membalas ke ...

Mengapa robot membalas melalui antarmuka nirkabel untuk permintaan IP pada kabel ???

EDIT: baik adaptor berkabel dan nirkabel pada subnet IP yang sama. Saya melakukan permintaan ARP dari komputer (mencoba dengan komputer yang berbeda) pada subnet IP yang sama.

output ifconfig yang relevan:

eth0      Link encap:Ethernet  HWaddr 00:01:C0:04:BD:F7  
          inet addr:192.168.0.110  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
ra0       Link encap:Ethernet  HWaddr 24:3C:20:06:3E:6D  
          inet addr:192.168.0.101  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:59 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:31023598 (29.5 MiB)  TX bytes:85640627 (81.6 MiB)

output rute yang relevan:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 ra0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

Ini adalah linux yang sangat ketat, jadi saya tidak memiliki alat seperti artptables, iptables, sysctl, brctl, dll.

EDIT: diagram seperti yang diminta

diagram jaringan

EDIT: Saya membuang lalu lintas dan melihat tabel ARP. Permintaan ARP 192.168.0.110 mengembalikan balasan ARP yang berisi 24: 3C: 20: 06: 3E: 6D. Sumber MAC dari paket balasan ARP juga 24: 3C: 20: 06: 3E: 6D. Saya sudah mencoba mengutak-atik _filter, _ignore, dan _announce, seperti yang disebutkan di sini , tetapi tidak berhasil.

EDIT: mengatur gateway (di kedua antarmuka) tidak ada bedanya (sebagaimana seharusnya).

EDIT: ini bekerja dengan baik pada versi OS sebelumnya (berdasarkan openembedded). apakah mungkin mereka mengubah sesuatu?

Jayen
sumber
5
mungkin diagram akan menjadi keren, dan Anda dapat menempatkan robot di dalamnya ... poin ekstra keren
The Unix Janitor
Apakah kedua adaptor kabel dan nirkabel pada subnet IP yang sama? Di mana Anda "melakukan permintaan ARP" dari? Mungkin membantu memasukkan hasil 'ifconfig' dan menampilkan tabel perutean Anda.
Dave
Apakah ini pernah diselesaikan? Saya melihat masalah yang sama, dan benar-benar tidak dapat menemukan resolusi.
Kirk
1
Saya percaya modul kernel untuk kartu nirkabel rusak.
Jayen
1
Pertanyaannya adalah MENGAPA Anda melakukan ini ... Saya kira Anda menginginkannya sehingga ketika robot itu bergerak dapat berbicara, tetapi ketika Anda mencolokkan kabel Ethernet Anda bisa mendapatkan kecepatan transfer tinggi? Jika demikian, pernahkah Anda mempertimbangkan untuk menyatukan antarmuka kabel dan nirkabel, menempatkan keduanya pada IP yang sama, dan kemudian mengonfigurasinya sehingga jika kabel tersambung, ia mendapat prioritas, tetapi jika tidak lalu lintas melewati nirkabel? Saya biasa mengatur laptop saya dengan cara ini dan itu bekerja dengan baik, tetapi sekarang saya memiliki 300Mbps nirkabel daripada 2Mbps, jadi saya tidak melakukan itu lagi.
Sean Reifschneider

Jawaban:

12

Apa yang Anda lihat adalah perilaku normal ketika Anda memiliki dua antarmuka di jaringan yang sama. Ini dijelaskan dalam artikel LWN ini .

sciurus
sumber
pengaturan arp_filter tidak berpengaruh. kenapa tidak?
Jayen
1
Karena kedua antarmuka Anda memiliki rute ke jaringan lokal, linux akan mengirim paket dari salah satu IP Anda ke luar dari antarmuka Anda. Dengan demikian itu akan menjawab permintaan ARP untuk salah satu IP Anda dari kedua antarmuka. Untuk mengubah ini, Anda tidak hanya harus menetapkan arp_filter ke 1, Anda juga harus mengaktifkan perutean berbasis sumber dan mengatur tabel perutean yang memastikan bahwa lalu lintas untuk setiap IP keluar dari antarmuka yang Anda inginkan. Ini adalah skenario yang sedikit berbeda dari yang Anda miliki, tetapi wlug.org.nz/SourceBasedRouting dapat membantu Anda.
sciurus
4

Ketika Anda mengatakan Anda mendapatkan respons ARP untuk antarmuka yang salah, apakah Anda benar-benar membuang lalu lintas atau hanya melihat tabel ARP yang dihasilkan? Mungkin Anda mendapatkan balasan ARP untuk kedua antarmuka ...

Bagaimanapun, saya percaya jawaban untuk masalah Anda terletak pada memanipulasi rp_filterdan arp_filter. Dokumentasi untuk masing-masing termasuk di bawah ini.

Saya sarankan terlebih dahulu mencoba ini:

echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter

Anda mungkin perlu melakukan perubahan ini juga:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
rp_filter - BOOLEAN
    1 - lakukan validasi sumber dengan jalur terbalik, sebagaimana ditentukan dalam RFC1812
        Opsi yang disarankan untuk host homed tunggal dan jaringan rintisan
        router. Dapat menyebabkan masalah rumit (tidak bebas loop)
        jaringan yang menjalankan protokol lambat yang tidak dapat diandalkan (semacam RIP),
        atau menggunakan rute statis.

    0 - Tidak ada validasi sumber.

    conf / all / rp_filter juga harus disetel ke TRUE untuk melakukan validasi sumber
    pada antarmuka

    Nilai default adalah 0. Perhatikan bahwa beberapa distribusi mengaktifkannya
    dalam skrip startup.

arp_filter - BOOLEAN
    1 - Memungkinkan Anda memiliki banyak antarmuka jaringan
    subnet, dan minta ARP untuk setiap antarmuka dijawab
    berdasarkan apakah kernel akan merutekan suatu paket
    IP ARP dari antarmuka itu (karena itu Anda harus menggunakan sumber
    routing berbasis untuk ini berfungsi). Dengan kata lain memungkinkan kontrol
    kartu mana (biasanya 1) akan merespons permintaan arp.

    0 - (default) Kernel dapat menanggapi permintaan arp dengan alamat
    dari antarmuka lain. Ini mungkin tampak salah tetapi biasanya membuat
    akal, karena meningkatkan peluang komunikasi yang sukses.
    Alamat IP dimiliki oleh host lengkap di Linux, bukan oleh
    antarmuka tertentu. Hanya untuk pengaturan yang lebih kompleks seperti load-
    balancing, apakah perilaku ini menyebabkan masalah.

    arp_filter untuk antarmuka akan diaktifkan jika setidaknya satu dari
    conf / {all, interface} / arp_filter diatur ke TRUE,
    itu akan dinonaktifkan jika tidak

Untuk perawatan yang lebih menyeluruh, lihat artikel ini:

http://www.embedded-bits.co.uk/tag/rp_filter/

Insyte
sumber
1
Saya membuang lalu lintas dan melihat tabel ARP. Permintaan ARP 192.168.0.110 mengembalikan balasan ARP yang berisi 24: 3C: 20: 06: 3E: 6D. Sumber MAC paket ini juga 24: 3C: 20: 06: 3E: 6D. Saya sudah mencoba kedua pengaturan filter yang disarankan, tetapi tidak berhasil. Saya juga mencoba bermain dengan _ignore dan _announce, seperti yang disebutkan di sini .
Jayen
4

Saya tahu ini adalah masalah lama tapi baru-baru ini saya menghadapi situasi yang sama persis dengan perangkat yang disematkan. Perangkat ini memiliki antarmuka ethernet dan wifi dan persyaratannya adalah bahwa kedua antarmuka dapat aktif dan pada jaringan yang sama setiap saat, tetapi lalu lintas jaringan harus dialihkan melalui antarmuka "pilihan".

Sebagian besar pengguna tidak akan mengonfigurasi perangkat di sana dengan cara ini, tetapi secara teori itu harus dimungkinkan.

Kami pertama kali mengangkat masalah dengan router Netgear karena mereka akan melaporkan konflik Alamat IP - 2 alamat MAC berbagi satu IP. Tampaknya router akan mulai berperilaku buruk dalam skenario ini dan mengacaukan jaringan pengguna.

Saya membuat jaringan pribadi yang hanya berisi router (ethernet + wifi), windows laptop (hanya Ethernet), dan perangkat tertanam (ethernet + wifi). Menggunakan wireshark, tcpdump di perangkat, dan arp di windows saya bisa melihat perilaku berikut:

  1. Ifconfig pada perangkat menunjukkan alamat IP dan Ethernet IP dan alamat MAC yang berbeda
  2. Terkadang (sangat jarang) dan arp –a dari windows menunjukkan kombinasi IP-MAC yang benar.
  3. Sebagian besar waktu arp –a dari windows menunjukkan bahwa wln dan eth0 memiliki alamat MAC yang sama
  4. Saat melakukan ping baik wln atau eth0 dari windows, respons ping berasal dari wln dan sangat jarang dari eth0. tcpdump menunjukkan wln hanya merespons 1 dari 4 ping (misalnya)
  5. Ketika windows mengirimkan pesan arp "who has" untuk eth0 IP - baik antarmuka eth0 dan wln merespons dengan mengatakan mereka memiliki IP tersebut

Saya percaya bahwa item 3 disebabkan oleh item 5. Tabel arp sedang kacau karena wln menanggapi pesan arp yang hanya harus merespon eth0. Saya percaya item 4 juga disebabkan oleh item 5. Ping dikirim berdasarkan alamat MAC dan karena pesan arp terakhir yang diterima dari wln mengatakan ia memiliki IP eth0, ping diarahkan secara tidak benar ke antarmuka wln.

Setelah banyak menggali dan menguji solusinya sebenarnya sangat sederhana. Lihat artikel ini - http://blog.cj2s.de/archives/29-Preventing-ARP-flux-on-Linux.html

Driver jaringan kernel Linux dikonfigurasi sedemikian rupa sehingga ketika permintaan arp diterima untuk antarmuka yang dikenal (bahkan jika diterima pada antarmuka lain) itu akan merespons ke arp.

Pengaturan ini menyelesaikan masalah:

echo 1 > /proc/sys/net/ipv4/conf/wln/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore

Penjelasan:

arp_ignore - INTEGER
Define different modes for sending replies in response to
received ARP requests that resolve local target IP addresses:
0 - (default): reply for any local target IP address, configured
on any interface
1 - reply only if the target IP address is local address
configured on the incoming interface
2 - reply only if the target IP address is local address
configured on the incoming interface and both with the
sender's IP address are part from same subnet on this interface
3 - do not reply for local addresses configured with scope host,
only resolutions for global and link addresses are replied
dev-rowbot
sumber
Balasan yang sangat informatif, tetapi seperti yang dikatakan OP, ia mencobanya dan menautkan ke jawaban yang serupa serverfault.com/a/30648/57200
Jayen
1

Karena ini bekerja dengan baik pada versi OS sebelumnya (berdasarkan openembedded), solusi saya adalah menunggu versi OS berikutnya. Tebakan terbaik saya adalah bahwa modul kernel nirkabel bermasalah.

Jayen
sumber
Tidak mungkin, karena perilaku yang Anda alami diharapkan seperti yang disebutkan oleh @sciurus. Mungkin rilis sebelumnya di mana ia "bekerja dengan baik" adalah yang bermasalah dan mereka telah memperbaikinya :-). Sebenarnya, hanya saja satu yang terakhir merespons adalah satu yang menempel di tabel ARP di ujung jarak jauh. Karena nirkabel cenderung lebih lambat daripada kabel, Anda akan mendapatkan nirkabel.
Sean Reifschneider
0

Menindaklanjuti komentar Insyte.

Mari kita beri nama:

  • PC1 - Kanan Atas
  • PC2 - Kiri Atas
  • PC3 - Kiri Bawah

Untuk robot Anda dapat dijangkau dari 3 PC melalui media kabel dan nirkabel. Dan karena mereka berada di subnet yang sama, Anda tidak bisa memastikan bahwa ke arah mana permintaan arp untuk media kabel Anda telah melewati. Maksud saya adalah ketika saklar menyiarkan permintaan arp, robot Anda menerimanya di kedua antarmuka [mengacu pada diagram Anda] sehingga untuk itu menerima permintaan arp untuk IP pada media kabel pada media nirkabel juga kemungkinannya adalah itu menjawab dengan alamat fisik media nirkabel untuk kotak memang memiliki IP yang dikonfigurasi di dalamnya

Saya memiliki masalah ini di masa lalu, itu tidak tepat untuk Anda tetapi serupa. Secara default, linux membalas dengan alamat fisik antarmuka yang menerima permintaan arp terlepas dari antarmuka mana IP dikonfigurasi. Jadi, dalam kasus Anda, sambungkan PC3 ke antarmuka eth0 robot secara langsung dan lakukan permintaan arp untuk 192.168.0.101 itu akan menjawab Anda dengan alamat fisik antarmuka eth0 alih-alih ra0.

Skenario penerapan saya adalah:

[RTR] | ------------ eth0 --- [server]
| -------- | switch1 | ----- eth1 ----- [server]

Saklar yang sama, yang terhubung dengan kedua antarmuka. Semoga itu akan membantu Anda.

Router memiliki alamat IP primer dan sekunder yang dikonfigurasi pada antarmuka untuk dua jaringan yang berbeda pada dua antarmuka yang berbeda di server. Tetapi menerima permintaan arp pada eth1 untuk alamat IP eth0 itu menjawab dengan alamat fisik eth1

Untuk mencegahnya, berikut ini sejauh ini berhasil bagi saya

# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/ra0/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/ra0/arp_ignore

letakkan di suatu tempat di robot Anda sehingga Anda bisa menerapkannya saat boot.

Rekomendasi: Saya akan merekomendasikan Anda memiliki dua subnet yang berbeda dikonfigurasikan (katakanlah 192.168.1.x / 24 pada ra0 dan 192.168.2.x / 24 pada eth0) Anda dapat menggunakan alias IP pada PC Anda dan robot Anda akan dapat diakses melalui semua dari dua IP. Anda tidak dapat memiliki dua jalur keluar untuk subnet yang sama pada host yang sama. Tidak, kecuali ada sesuatu yang membuat robot Anda lebih suka satu daripada yang lain. Robot Anda hanya dapat mengambil satu jalur untuk mengirim paket.

Beberapa bacaan: arp_announce , arp_ignore

Gaumire
sumber
arp_announce & arp_ignore tidak berfungsi untuk saya. lihat komentar saya pada solusi insyte. Sayangnya, dua subnet berbeda, bukan opsi. Juga, sesuai dengan edit terakhir pertanyaan saya, ini berfungsi dengan baik pada versi OS sebelumnya, jadi saya dapat memiliki dua jalur keluar untuk subnet yang sama pada host yang sama.
Jayen
-2

saya pikir ada kesalahan konfigurasi antara AP nirkabel Anda dan sakelar Anda. beralih dan AP semakin bingung ke mana harus mengirim paket. tidak yakin tentang ini. juga, saya pikir Anda harus mencoba mendefinisikan gateway di mana program bisa tahu ke mana harus mengirim paket. sesuatu seperti

route add default gw 192.168.0.1

fmysky
sumber
laptop pada kabel dan nirkabel berfungsi dengan baik, jadi bukan AP atau switch. juga, gateway hanya diperlukan ketika saya mencoba keluar dari subnet. (Saya tetap mencobanya, dan itu tidak mengubah apa pun. Tidak masalah jika saya menambahkan gateway ke eth0 atau ra0.)
Jayen
tidak ada RX / TX pada eth0 Anda, menunjukkan beberapa konfigurasi. kesalahan?
fmysky
hrm, kurasa itu benar. eth0 setidaknya harus menerima permintaan ARP, karena itu siaran, kan?
Jayen
ya, itu yang saya pikirkan
fmysky
masalah arp dalam artikel lwn itu tampaknya hanya memengaruhi kernel 2.4.x
fmysky