Arpchat - Ứng dụng chat gửi tin nhắn cho bạn bè cùng mạng chỉ bằng ARP
(github.com/kognise)- arpchat là một công cụ được tạo thành ứng dụng chat bằng cách sử dụng ARP, vốn được máy tính dùng để tìm địa chỉ MAC của các máy tính khác trong cùng một mạng
- Đây là một dự án được khởi xướng từ nhu cầu muốn trò chuyện với bạn bè trong mạng có bật cô lập máy khách
- Nó triển khai một giao thức truyền tải đa dụng đơn giản trên nền ARP để có thể gửi các tin nhắn dài tới hàng chục nghìn ký tự, đồng thời cũng dùng một chút nén
- Có hệ thống presence discovery và heartbeat để cập nhật danh sách người dùng đang trực tuyến, kèm thông báo khi tham gia và rời đi
- Có thể tải binary cài đặt từ releases page
- Trên Windows, có thể cần npcap, và khi cài đặt cần chọn
Install Npcap in WinPcap API-compatible Mode - Trên Linux, có thể cần cấp quyền mạng bằng
sudo setcap CAP_NET_RAW+ep /path/to/arpchat
- Trên Windows, có thể cần npcap, và khi cài đặt cần chọn
- Chạy binary trong terminal; nếu tin nhắn đã gửi xuất hiện trên chính màn hình của mình thì có thể xem là đang hoạt động bình thường
- Việc build đã được thử nghiệm trên Rust unstable mới nhất, và bản build cho Windows cần WinPcap Developer's Pack cùng bước đặt biến môi trường
LIBtrỏ tới thư mụcWpdPack/Lib/x64/
1 bình luận
Ý kiến trên Hacker News
Tôi là người tạo ra cái này. Hôm nay tôi cũng làm một thứ khác được đăng lên HN (https://news.ycombinator.com/item?id=37062422), nên thấy ArpChat cũng được đưa lên cùng lúc thì khá thú vị. Có lẽ ai đó đã xem hồ sơ của tôi
Đây thật sự là một dự án rất vui, và tôi đã học được rất nhiều về networking
Cách đây không lâu tôi cũng có dịp dùng thử nó trong một môi trường hoàn toàn offline, khá vui. Tuy nhiên sau đó tôi phát hiện một lỗi lớn, lỗi này đang gây độ trễ khủng khiếp. Tôi đã sửa rồi nhưng vẫn chưa kịp tải bản build mới lên, nên nếu định thử trong môi trường thực tế thì tốt hơn là tự build từ source. Nhân tiện cho vui tôi cũng thêm màu cho tên người dùng và thời gian tin nhắn. Tôi hứa sẽ sớm đăng bản phát hành mới
Nếu quan tâm, tôi cũng có một bài viết khoảng 1 năm trước về cách ArpChat hoạt động: https://kognise.dev/writing/arp
Mong bạn tiếp tục nghịch code. Nó cũng hơi giống những gì justine tunney thể hiện trong các tác phẩm như https://justine.lol/ape.html: đào sâu vào một lĩnh vực chỉ một số ít người thật sự hiểu, chẳng hạn các chi tiết của định dạng binary compiler, rồi đặt những câu hỏi điên rồ kiểu “liệu có thể buộc mọi định dạng binary vào một meta-format duy nhất để nó thật sự chạy được trên tất cả không?”, và rồi tạo ra thứ thật sự hoạt động
# sudo getcap ./arpchat./arpchat cap_net_raw=epTôi nhận được “error getting channel, might be missing permissions”
Bổ sung: lỗi này đến từ arpchat, không phải từ cấu hình
setcapĐây đúng là thứ tôi muốn. Nghịch ở tầng liên kết dữ liệu cơ đấy
Với những ai không biết Address Resolution Protocol (ARP) là gì, nói rất đại khái thì nó là mắt xích còn thiếu nối địa chỉ MAC (thứ Ethernet dùng) với địa chỉ IP (thứ Internet dùng). Khi bảng định tuyến IP mà bạn có thể xem bằng
routequyết định gói tin sẽ được gửi tiếp tới địa chỉ IP nào, thì ARP cache mà bạn có thể xem bằngarpsẽ quyết định địa chỉ MAC tương ứng với IP đó. Thông thường đó là địa chỉ IP cục bộ của routerNgày nay, chỉ cần biết ARP tồn tại thôi cũng đã hơi giống một thứ kiến thức bí truyền không chuyên, còn người anh em phía IPv6 của nó là Neighbor Discovery Protocol thì còn hơn thế. Trong các triển khai hiện đại dựa trên cloud, dù bạn không thường trực tiếp đụng tới nó, việc biết nó tồn tại sẽ giúp bạn có cái nhìn bao quát về toàn bộ network stack hoàn chỉnh hơn nhiều
arpingrất hữu ích khi muốn kiểm tra một thiết bị trong cùng đoạn mạng có đang bật nhưng không phản hồi ICMP ping hay khôngNếu xem dump từ
tcpdumphoặc Wireshark thì sớm muộn gì bạn cũng chắc chắn gặp nó. Dù vậy, với kỹ sư phần mềm, vì cloud và mạng truyền thống khác nhau khá nhiều, họ có thể gặp nó trước khi debug mạng gia đình hơn là ứng dụngViệc lạm dụng chuyện ARP có thể chứa payload tùy ý thì thú vị, nhưng nói lại từ góc nhìn nhập môn networking, điểm cốt lõi mà tác giả dựa vào chỉ là sự thật đơn giản rằng switch sẽ flood các gói hướng tới
ff:ff:ff:ff:ff:ffra toàn bộ broadcast domainNgay cả khi không có quyền superuser hay quyền raw packet, nếu gửi gói tin tới địa chỉ broadcast L3 thì thường nó cũng sẽ bị flood ở L2, nên có thể tạo ra cách lan truyền tin nhắn tương tự. Nói cách khác, ping vào địa chỉ broadcast là một trò vui
Không có lợi thế đặc biệt nào khi dùng ARP. Ngoài ra, nhiều switch hiện đại có tính năng giám sát gói ARP, nên nếu đẩy một lượng lớn lưu lượng ARP giả thì thật sự có thể gây tác động xấu. Dù vậy đây vẫn là một việc thú vị, gợi tôi nhớ những trò nghịch tôi từng làm hồi đang học. Cá nhân tôi có lẽ sẽ lạm dụng ICMP cho mục đích này, và đó cũng có thể là hướng phát triển trong tương lai. Xin vỗ tay cho một dự án thú vị
ARP, DNS, HTTP, TLS một mặt đúng là những giao thức mà chúng ta nghĩ tới, nhưng đồng thời tất cả cũng chỉ là các con số. ARP truy cập vào cùng không gian số như HTTP. Không phải chỉ UDP mới dùng byte 11 bit, cũng không có lệnh CPU đặc biệt nào chỉ DNS mới dùng được. Cuối cùng tất cả đều là số. Sau cùng, bạn có thể đẩy những con số mình muốn lên đường truyền, và phần còn lại của thế giới sẽ nhận những con số đó rồi tiếp tục làm việc của nó
Ngày nay nó không nên còn hoạt động, nhưng hồi đó các triển khai TCP/IP ngây thơ, nói cách khác là rất nhiều trong số chúng, sẵn sàng tham gia
Tôi thích lạm dụng các giao thức được tích hợp sẵn trong hầu hết hệ điều hành. Vì không tìm được hệ thống nhắn tin GUI/CLI đa nền tảng không cần cài phần mềm client riêng, tôi từng tạo một chia sẻ Samba giả ngớ ngẩn để có thể xem tin nhắn trong Finder.app/Explorer.exe/Gnome/KDE
Trên mạng cục bộ, gọi netcat cũng không ổn lắm, còn nếu muốn broadcast thì mỗi hệ điều hành lại có khác biệt về flag. Cách làm là xem tin nhắn trên chia sẻ Samba trong trình duyệt tệp, nhấp vào đó rồi sửa tên tệp để cập nhật một “bảng tin” 3 dòng
https://github.com/jedahan/samba-haiku/blob/master/index.js
Cái này vốn cũng là bản triển khai lại từ một thứ dùng Wi-Fi SSID để tạo haiku captive portal
https://github.com/jedahan/haiku-wifi
Có thể thú vị hơn dự đoán. Tôi từng dùng VLAN với phần cứng của các nhà cung cấp lớn để tách mạng, và phát hiện rằng trong hầu hết trường hợp VLAN vẫn hoạt động nhưng lưu lượng ARP lại bị rò rỉ
Các máy lẽ ra phải gửi mọi lưu lượng qua router, nhưng đôi khi chúng thấy các phản hồi ARP mà đáng ra không được thấy và kết luận rằng có thể đến trực tiếp máy khác. Kết quả là khá đau đầu vì không thể gửi lưu lượng cho đến khi mục ARP cache hết hạn. Nhà cung cấp quá lớn nên không quan tâm, và cũng không tỏ ra hứng thú sửa lỗi
Trong một số tình huống nhất định, ứng dụng chat này có thể xuyên qua VLAN
Vợ, các con và tôi phần lớn làm việc hoặc học ở nhà nên thường ở các phòng riêng. Để nhắn cho nhau khi cần, chúng tôi dùng BeeBEEP. Không cần server và có cả client Linux lẫn Windows, đó là yếu tố quyết định
Nó hoạt động khá tốt, nhưng đôi khi phải khởi động lại sau khi laptop thức dậy từ chế độ ngủ để thấy lại những người khác trên LAN. Và việc không thể mở ngay cửa sổ nhắn tin cho một người cụ thể từ biểu tượng khay gần như là phàn nàn duy nhất của tôi. Cũng có thể copy rồi dán ảnh mèo hài hước, và có cả các tính năng tôi không dùng như truyền tệp. Đây không phải quảng cáo trả tiền, chỉ là tôi luyên thuyên hơi dài thôi
https://www.beebeep.net/
Hồi trung học tôi từng làm chuyện này bằng
net sendrồi bị mắngVì vậy tôi giả mạo tên người dùng của quản trị viên hệ thống (trên Win9x thì không khó), rồi gửi một thông báo cảnh cáo nghiêm khắc. Thấy các tin nhắn đột ngột dừng hết, chắc họ đã khá hoảng
writegửi lời hỏi thămhttps://en.wikipedia.org/wiki/Write_(Unix)
net sendphải được kết nối với domain, nên có lẽ nó không dùng ARPRất tuyệt. Tuy nhiên TCP/IP không tuân theo mô hình OSI, nên khó áp dụng nguyên xi các phân biệt tinh tế của OSI
Về mặt thực tế, ARP có thể được định nghĩa là tầng 2.5 theo mô hình TCP/IP của Stevens, nên gọi là 2.5 có vẻ hợp lý nhất. Và frame ARP không được định tuyến, nên rõ ràng không phải L3
Vào thời IPv4 NAT gần như là chuẩn mặc định — thật ra bây giờ vẫn vậy, nhưng ngày nay còn có IPv6 và CGNAT — tôi từng làm một thứ gọi là NATChat
Về cơ bản, nó tạo phòng chat dựa trên địa chỉ IPv4 công cộng, để bạn có thể chat với bất kỳ ai trong cùng mạng. Dùng với những người khác ở văn phòng thì khá ổn. Mà văn phòng cũng là thứ từng tồn tại vào thời đó
Cũng có một bản tương tự viết bằng C++: https://github.com/gbonacini/arpchatcpp