Trả lời ARP chứa địa chỉ MAC sai


14

Tôi đã có một robot chạy linux với bộ điều hợp có dây và không dây. Khi tôi khởi động, nó kết nối với mạng không dây tốt. Khi tôi gán IP cho mạng có dây (tĩnh hoặc với DHCP), có vẻ như nó hoạt động. Như trong, ifconfighiển thị một IP thích hợp và routehiển thị các tuyến thích hợp. Tuy nhiên, khi tôi thực hiện yêu cầu ARP của IP có dây, phản hồi ARP chứa MAC không dây.

??? Không có cây cầu nào chạy trên robot, vậy tại sao tôi không có MAC có dây ???

Khi ngắt kết nối dây, IP có dây sẽ trả lời ping ...

Tại sao robot trả lời qua giao diện không dây với các yêu cầu IP trên mạng ???

EDIT: cả bộ điều hợp có dây và không dây trên cùng một mạng con IP. Tôi thực hiện một yêu cầu ARP từ một máy tính (đã thử với các máy tính khác nhau) trên cùng một mạng con IP.

đầu ra ifconfig có liên quan:

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)

đầu ra tuyến có liên quan:

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

Đây là một linux rất dễ hỏng, vì vậy tôi không có các công cụ như artptables, iptables, sysctl, brctl, v.v.

EDIT: sơ đồ theo yêu cầu

giản đồ hệ thống

EDIT: Tôi đang bỏ lưu lượng truy cập và nhìn vào bảng ARP. Yêu cầu ARP 192.168.0.110 trả về phản hồi ARP chứa 24: 3C: 20: 06: 3E: 6D. MAC nguồn của gói trả lời ARP cũng là 24: 3C: 20: 06: 3E: 6D. Tôi đã thử nghịch với _filter, _ignore và _announce, như đã đề cập ở đây , nhưng không có kết quả.

EDIT: thiết lập một cổng (trên một trong hai giao diện) không có sự khác biệt (vì nó không nên).

EDIT: điều này hoạt động tốt trên một phiên bản trước của HĐH (dựa trên openembedded). họ có thể thay đổi một cái gì đó?


5
có lẽ một sơ đồ sẽ rất tuyệt và bạn có thể đặt một con robot vào đó ... những điểm thú vị khác
Unix Janitor

Cả hai bộ điều hợp có dây và không dây trên cùng một mạng con IP? Bạn "thực hiện một yêu cầu ARP" từ đâu? Nó có thể giúp bao gồm các kết quả của 'ifconfig' và hiển thị bảng định tuyến của bạn.
Dave

Điều này đã bao giờ được giải quyết? Tôi đang thấy một vấn đề tương tự, và hoàn toàn không thể tìm ra giải pháp.
Kirk

1
Tôi tin rằng mô-đun kernel cho card không dây đã bị hỏng.
Jayen

1
Câu hỏi là TẠI SAO bạn đang làm điều này ... Tôi đoán rằng bạn đang muốn nó để khi robot di động, nó có thể nói chuyện, nhưng khi bạn cắm cáp Ethernet, bạn có thể có tốc độ truyền cao? Nếu vậy, bạn đã xem xét việc liên kết các giao diện có dây và không dây, đặt cả hai trên cùng một IP, sau đó định cấu hình nó để nếu có dây, nó được ưu tiên, nhưng nếu không lưu lượng truy cập qua mạng không dây? Tôi đã từng thiết lập máy tính xách tay của mình theo cách này và nó hoạt động rất tốt, nhưng bây giờ tôi có mạng không dây 300Mbps thay vì 2Mbps, vì vậy tôi không làm điều đó nữa.
Sean Reifschneider

Câu trả lời:


12

Những gì bạn đang thấy là hành vi bình thường khi bạn có hai giao diện trên cùng một mạng. Nó được mô tả trong bài viết này .


cài đặt arp_filter không có hiệu lực. tại sao không?
Jayen

1
Vì cả hai giao diện của bạn đều có tuyến đến mạng cục bộ, linux sẽ gửi các gói từ một trong hai IP của bạn ra khỏi giao diện của bạn. Do đó, nó sẽ trả lời các yêu cầu ARP cho một trong hai IP của bạn từ cả hai giao diện. Để thay đổi điều này, bạn không chỉ đặt arp_filter thành 1, bạn cũng phải bật định tuyến dựa trên nguồn và thiết lập các bảng định tuyến để đảm bảo lưu lượng truy cập cho mỗi IP đi ra ngoài giao diện bạn muốn. Đó là một kịch bản hơi khác so với những gì bạn có, nhưng wlug.org.nz/SourceBasingRouting có thể giúp bạn.
tọa

4

Khi bạn nói rằng bạn nhận được phản hồi ARP cho giao diện sai, bạn có thực sự bỏ lưu lượng truy cập hay chỉ nhìn vào bảng ARP kết quả? Có thể bạn đang nhận được trả lời ARP cho cả hai giao diện ...

Dù sao, tôi tin rằng câu trả lời cho vấn đề của bạn nằm ở thao tác đúng rp_filterarp_filter. Các tài liệu cho mỗi người trong số họ được bao gồm dưới đây.

Tôi đề nghị đầu tiên thử điều này:

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

Bạn cũng có thể cần thực hiện thay đổi này:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
rp_filter - BOOLESE
    1 - thực hiện xác nhận nguồn bằng đường dẫn đảo ngược, như được chỉ định trong RFC1812
        Tùy chọn được đề xuất cho các máy chủ homed và mạng sơ khai
        bộ định tuyến. Có thể gây rắc rối cho phức tạp (không phải vòng lặp miễn phí)
        các mạng chạy giao thức không đáng tin cậy chậm (loại RIP),
        hoặc sử dụng các tuyến tĩnh.

    0 - Không xác thực nguồn.

    conf / all / rp_filter cũng phải được đặt thành TRUE để xác thực nguồn
    trên giao diện

    Giá trị mặc định là 0. Lưu ý rằng một số bản phân phối cho phép nó
    trong các kịch bản khởi động.

arp_filter - BOOLESE
    1 - Cho phép bạn có nhiều giao diện mạng trên cùng một
    mạng con và có ARP cho mỗi giao diện được trả lời
    dựa trên việc hạt nhân có định tuyến một gói từ
    IPP'd IP ra giao diện đó (do đó bạn phải sử dụng nguồn
    định tuyến dựa trên để làm việc này). Nói cách khác, nó cho phép kiểm soát
    trong đó thẻ (thường là 1) sẽ đáp ứng yêu cầu arp.

    0 - (mặc định) Nhân có thể trả lời các yêu cầu arp có địa chỉ
    từ các giao diện khác. Điều này có vẻ sai nhưng nó thường làm
    ý nghĩa, bởi vì nó làm tăng cơ hội giao tiếp thành công.
    Địa chỉ IP được sở hữu bởi máy chủ hoàn chỉnh trên Linux, không phải bởi
    giao diện cụ thể. Chỉ dành cho các thiết lập phức tạp hơn như tải-
    cân bằng, hành vi này có gây ra vấn đề.

    arp_filter cho giao diện sẽ được bật nếu ít nhất một trong số
    conf / {all, interface} / arp_filter được đặt thành TRUE,
    nó sẽ bị vô hiệu hóa

Để điều trị kỹ lưỡng hơn, xem bài viết này:

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


1
Tôi đang phá giá lưu lượng và nhìn vào bảng ARP. Yêu cầu ARP 192.168.0.110 trả về phản hồi ARP chứa 24: 3C: 20: 06: 3E: 6D. MAC nguồn của gói cũng là 24: 3C: 20: 06: 3E: 6D. Tôi đã thử cả hai cài đặt bộ lọc được đề xuất của bạn, nhưng không có kết quả. Tôi cũng đã thử chơi với _ignore và _announce, như đã đề cập ở đây .
Jayen

4

Tôi biết đây là một vấn đề cũ nhưng gần đây tôi đã gặp phải tình huống tương tự với một thiết bị nhúng. Thiết bị có cả giao diện ethernet và wifi và yêu cầu là cả hai giao diện đều có thể hoạt động và trên cùng một mạng bất cứ lúc nào, nhưng lưu lượng truy cập mạng phải được chuyển qua giao diện "ưa thích".

Hầu hết người dùng sẽ không cấu hình các thiết bị theo cách này nhưng về lý thuyết thì điều đó là có thể.

Trước tiên, chúng tôi đã xử lý các sự cố với bộ định tuyến Netgear vì chúng sẽ báo cáo xung đột Địa chỉ IP - 2 địa chỉ MAC đang chia sẻ một IP. Rõ ràng bộ định tuyến sẽ bắt đầu hành xử tồi trong kịch bản này và gây rối mạng người dùng.

Tôi đã tạo một mạng riêng chỉ chứa bộ định tuyến (ethernet + wifi), máy tính xách tay windows (chỉ Ethernet) và thiết bị nhúng (ethernet + wifi). Sử dụng wireshark, tcpdump trên thiết bị và arp trên windows tôi có thể thấy hành vi sau:

  1. Ifconfig trên thiết bị hiển thị các địa chỉ MAC riêng biệt của Ethernet và Ethernet và các địa chỉ MAC riêng biệt
  2. Đôi khi (rất hiếm khi) và arp hèa từ các cửa sổ hiển thị kết hợp IP-MAC chính xác.
  3. Hầu hết thời gian arpiêua từ các cửa sổ cho thấy cả wln và eth0 đều có cùng địa chỉ MAC
  4. Khi ping wln hoặc eth0 từ windows, phản hồi ping xuất phát từ wln và rất hiếm khi từ eth0. tcpdump cho thấy wln chỉ trả lời 1 trong 4 ping (ví dụ)
  5. Khi các cửa sổ gửi một arp, người có thông báo về IP cho eth0 IP - cả giao diện eth0 và wln đều trả lời rằng họ có IP đó

Tôi tin rằng mục 3 là do mục 5. Các bảng arp đang bị rối vì wln đang trả lời các thông điệp arp mà chỉ eth0 mới phản hồi. Tôi tin rằng mục 4 cũng là do mục 5. Ping được gửi dựa trên địa chỉ MAC và vì tin nhắn arp cuối cùng nhận được là từ wln nói rằng nó có IP eth0, các ping được chuyển không chính xác đến giao diện wln.

Sau nhiều lần đào và thử nghiệm, giải pháp thực sự đơn giản. Xem bài viết này - http://blog.cj2s.de/archives/29-Preventing-kv-flux-on-Linux.html

Các trình điều khiển mạng nhân Linux được cấu hình theo cách mà khi nhận được yêu cầu arp cho một giao diện đã biết (ngay cả khi nhận được trên giao diện khác), nó sẽ đáp ứng với arp.

Cài đặt này giải quyết vấn đề:

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

Giải trình:

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

Trả lời rất nhiều thông tin, nhưng như OP đã nói, anh ấy đã thử và liên kết với câu trả lời tương tự serverfault.com/a/30648/57200
Jayen 23/1/2015

1

Vì điều này hoạt động tốt trên phiên bản HĐH trước đó (dựa trên openembedded), giải pháp của tôi là đợi phiên bản tiếp theo của HĐH. Dự đoán tốt nhất của tôi là mô-đun hạt nhân không dây đã bị lỗi.


Không thể, vì hành vi bạn đang gặp phải được mong đợi như được đề cập bởi @sciurus. Có thể là bản phát hành trước đó, nơi nó "hoạt động tốt" là lỗi và họ đã sửa nó :-). Trên thực tế, bất cứ ai trả lời cuối cùng là người nào dính vào bảng ARP ở đầu xa. Vì không dây có khả năng chậm hơn so với có dây, bạn sẽ có được không dây.
Sean Reifschneider

0

Theo dõi bình luận của Insyte.

Hãy thực hiện một số cách đặt tên:

  • PC1 - Trên cùng bên phải
  • PC2 - Trên cùng bên trái
  • PC3 - Dưới cùng bên trái

Đối với bạn, robot của bạn có thể truy cập từ 3 PC thông qua cả phương tiện có dây và không dây. Và đối với chúng nằm trên cùng một mạng con, bạn không thể chắc chắn nói rằng cách yêu cầu arp cho phương tiện có dây của bạn đã đi qua. Bởi rằng những gì tôi có nghĩa là khi chương trình phát sóng chuyển đổi cho một yêu cầu arp, robot của bạn nhận được nó trên cả giao diện [đề cập đến sơ đồ của bạn] để cho nó nhận được yêu cầu arp cho IP trên phương tiện truyền thông có dây trên phương tiện truyền thông không dây quá rất có thể là Nó trả lời với địa chỉ vật lý của phương tiện không dây cho hộp có IP được cấu hình trong đó

Tôi đã có vấn đề này trong quá khứ, nó không chính xác với bạn nhưng cũng tương tự. Theo mặc định, linux trả lời với địa chỉ vật lý của giao diện, nó nhận được yêu cầu arp bất kể IP được cấu hình trên giao diện nào. Vì vậy, trong trường hợp của bạn, hãy kết nối PC3 trực tiếp với giao diện eth0 của robot và thực hiện yêu cầu arp cho 192.168.0.101, nó sẽ trả lời bạn bằng địa chỉ vật lý của giao diện eth0 thay vì ra0.

Kịch bản triển khai của tôi là:

[RTR] | ------------ eth0 --- [máy chủ]
| -------- | chuyển đổi1 | ----- eth1 ----- [máy chủ]

Đó là cùng một công tắc, mà cả hai giao diện kết nối với. Hy vọng rằng nó sẽ giúp bạn.

Bộ định tuyến có địa chỉ IP chính và phụ được định cấu hình trên giao diện của nó cho hai mạng khác nhau trên hai giao diện khác nhau trên máy chủ. Nhưng nhận được yêu cầu arp trên eth1 cho địa chỉ IP của eth0, nó đã trả lời với địa chỉ vật lý của eth1

Để ngăn chặn nó, những điều sau đây đã làm việc cho tôi

# 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

đặt nó ở đâu đó trên robot của bạn để bạn có thể áp dụng nó khi khởi động.

Khuyến nghị: Tôi khuyên bạn nên cấu hình hai mạng con khác nhau (giả sử 192.168.1.x / 24 trên ra0 và 192.168.2.x / 24 trên eth0) bạn có thể sử dụng bí danh IP trên PC của mình và robot của bạn có thể truy cập được trên mọi của hai IP. Bạn không thể có hai đường dẫn đi cho cùng một mạng con trên cùng một máy chủ. Không, trừ khi có một cái gì đó làm cho robot của bạn thích cái này hơn cái khác. Robot của bạn chỉ có thể đi một đường để gửi các gói ra khỏi nó.

Một số bài đọc: arp_announce , arp_ignore


arp_announce & arp_ignore không hoạt động với tôi. xem bình luận của tôi về giải pháp của insyte. Thật không may, hai mạng con khác nhau, không phải là một lựa chọn. Ngoài ra, theo lần chỉnh sửa cuối cùng của câu hỏi của tôi, điều này đã hoạt động tốt trên phiên bản HĐH trước đó, vì vậy tôi có thể có hai đường dẫn ra ngoài cho cùng một mạng con trên cùng một máy chủ.
Jayen

-2

Tôi nghĩ rằng có một cấu hình sai giữa AP không dây và chuyển đổi của bạn. Switch và AP đang bị lẫn lộn nơi gửi gói tin. không chắc chắn về điều này mặc dù. Ngoài ra, tôi nghĩ bạn nên cố gắng xác định một cổng nơi các chương trình có thể biết nơi gửi gói tin. cái gì đó như

route add default gw 192.168.0.1


máy tính xách tay trên cả dây và không dây đều hoạt động tốt, vì vậy nó không phải là AP hay switch. Ngoài ra, một cổng chỉ cần thiết khi tôi đang cố gắng ra khỏi mạng con. (dù sao tôi cũng đã thử và nó không thay đổi gì cả. Không quan trọng nếu tôi thêm cổng vào eth0 hoặc ra0.)
Jayen

không có RX / TX trên eth0 của bạn, biểu thị một số cấu hình. lỗi?
fmysky 17/03/2016

hrm, tôi đoán đó là sự thật eth0 ít nhất nên nhận được yêu cầu ARP, vì đó là một chương trình phát sóng, phải không?
Jayen

vâng, đó là những gì tôi nghĩ
fmysky 17/03/2016

vấn đề arp trong bài viết lwn đó dường như chỉ ảnh hưởng đến hạt nhân 2.4.x
fmysky 17/03/2016
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.