Phòng Thủ Chống ARP Spoofing và Tấn Công Man-in-the-Middle trên Linux với arpwatch và arptables

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Mạng Của Bạn Đang Nói Dối Bạn

Sau khi server của tôi bị tấn công brute-force SSH liên tục vào lúc nửa đêm, bảo mật trở thành điều không thể bỏ qua trong mọi lần thiết lập mới. Firewall, fail2ban, xác thực bằng key — những thứ cơ bản đã được xử lý. Nhưng có một vector tấn công tôi đã bỏ qua quá lâu: ARP spoofing, nằm ngay tại tầng mạng. Nó im lặng, nhanh chóng, và hoàn toàn vô hình với hầu hết các công cụ giám sát thông thường.

Bạn đang chạy home lab, mạng văn phòng nhỏ, hay VPS trên một hypervisor dùng chung? Tấn công dựa trên ARP là mối đe dọa thực sự. Kẻ tấn công trên cùng phân đoạn mạng có thể âm thầm chuyển hướng toàn bộ traffic qua máy của họ — đọc thông tin đăng nhập, chèn payload, bỏ gói tin — mà không kích hoạt một quy tắc firewall nào.

Dưới đây, tôi sẽ phân tích chi tiết cuộc tấn công, thiết lập phát hiện bằng arpwatch, và chỉ cách chặn nó chủ động với arptables.

ARP Spoofing Thực Sự Hoạt Động Như Thế Nào

ARP (Address Resolution Protocol) ánh xạ địa chỉ IP sang địa chỉ MAC trên mạng nội bộ. Khi máy của bạn muốn kết nối tới 192.168.1.1, nó phát một ARP request: “ai có 192.168.1.1?” Router trả lời bằng địa chỉ MAC của nó, và máy bạn lưu ánh xạ đó vào cache.

Vấn đề: ARP không có cơ chế xác thực nào. Bất kỳ ai trên mạng đều có thể gửi ARP reply giả mạo, tuyên bố rằng bất kỳ IP nào cũng ánh xạ tới MAC của họ. Máy bạn cập nhật ARP cache mà không thắc mắc — không kiểm tra, không xác nhận.

Đây là các bước của cuộc tấn công:

  1. Kẻ tấn công gửi ARP reply giả đến nạn nhân: “192.168.1.1 (gateway) có MAC là AA:BB:CC:DD:EE:FF”
  2. Kẻ tấn công đồng thời nói với gateway: “192.168.1.50 (nạn nhân) có MAC là AA:BB:CC:DD:EE:FF”
  3. Toàn bộ traffic chạy qua máy của kẻ tấn công — vị trí Man-in-the-Middle điển hình
  4. Kẻ tấn công tiếp tục chuyển tiếp gói tin để duy trì kết nối, khiến nạn nhân không nhận ra bất thường

Các công cụ như arpspoof, ettercap, và bettercap có thể thực hiện điều này trong vòng chưa đầy 30 giây. Trên một mạng văn phòng đông đúc với 50 máy, kẻ tấn công chạy bettercap có thể bắt đầu thu thập thông tin đăng nhập HTTP trong vòng một phút sau khi kết nối. Phát hiện và phòng ngừa cũng nhanh không kém khi bạn đã hiểu rõ cơ chế.

Thiết Lập arpwatch Để Phát Hiện Tấn Công

arpwatch giám sát traffic ARP và cảnh báo bất cứ khi nào một cặp MAC-IP thay đổi. Nó duy trì cơ sở dữ liệu các liên kết đã biết và gắn cờ các thay đổi bất thường — chính xác là những gì ARP spoofing kích hoạt.

Cài Đặt

# Debian/Ubuntu
sudo apt update && sudo apt install arpwatch -y

# CentOS/RHEL/Rocky
sudo dnf install arpwatch -y

# Arch Linux
sudo pacman -S arpwatch

Cấu Hình Cơ Bản

Phần lớn cấu hình được thực hiện qua các flag của service thay vì file cấu hình. Bắt đầu bằng cách kiểm tra tên network interface của bạn:

ip link show

Sau đó chỉnh sửa cấu hình service để giám sát interface của bạn:

# Trên Debian/Ubuntu, chỉnh sửa file default
sudo nano /etc/default/arpwatch

# Đặt interface (thay eth0 bằng tên interface của bạn)
IFACE="eth0"
ARPWATCH_OPTS="-N -p"

Flag -N tắt cảnh báo qua email (chúng ta sẽ xử lý cảnh báo riêng), còn -p giữ interface không ở chế độ promiscuous — hữu ích khi bạn chỉ cần theo dõi hoạt động ARP của máy mình, không phải toàn bộ broadcast domain.

Muốn nhận cảnh báo email trực tiếp? Cấu hình MTA trên hệ thống và bỏ flag -N. Arpwatch sẽ gửi email cho bạn mỗi khi xảy ra sự kiện “flip flop”.

Khởi Động và Bật arpwatch

sudo systemctl enable arpwatch
sudo systemctl start arpwatch
sudo systemctl status arpwatch

Đọc Log của arpwatch

Arpwatch ghi vào syslog. Đây là các loại sự kiện cần chú ý:

# Theo dõi sự kiện theo thời gian thực
sudo journalctl -u arpwatch -f

# Hoặc kiểm tra syslog trực tiếp
sudo tail -f /var/log/syslog | grep arpwatch

Các sự kiện quan trọng cần theo dõi:

  • flip flop — Một địa chỉ MAC của IP đã thay đổi rồi lại đổi về. Đây là dấu hiệu điển hình của ARP spoofing.
  • changed ethernet address — Một IP đã biết giờ ánh xạ sang MAC khác. Có thể là thiết bị thay thế hợp lệ, hoặc đang có tấn công xảy ra.
  • new activity — Một host đã biết xuất hiện lại sau thời gian không hoạt động.
  • new station — Một thiết bị mới vừa tham gia mạng.

Một entry tấn công thực tế trông như thế này:

May 21 03:14:22 myserver arpwatch: flip flop 192.168.1.1 aa:bb:cc:dd:ee:ff (00:11:22:33:44:55) eth0

Diễn giải: MAC của gateway vừa thay đổi từ 00:11:22:33:44:55 sang aa:bb:cc:dd:ee:ff. Cần điều tra ngay lập tức.

Chặn Tấn Công ARP với arptables

Phát hiện cho bạn biết có chuyện xảy ra. Arptables cho phép bạn áp đặt các quy tắc ARP ở cấp độ gói tin — đưa vào whitelist các cặp MAC-IP hợp lệ, loại bỏ tất cả phần còn lại.

Cài Đặt arptables

# Debian/Ubuntu
sudo apt install arptables -y

# CentOS/RHEL
sudo dnf install arptables -y

Xem Các Quy Tắc Hiện Tại

sudo arptables -L -v

Static ARP Entries — Phòng Thủ Đơn Giản Nhất

Trước khi động đến arptables, hãy dùng static ARP entries trước. Hardcode MAC của gateway vào ARP cache nghĩa là các ARP reply giả không thể ghi đè lên nó:

# Trước tiên tìm MAC thực của gateway
arp -n 192.168.1.1

# Thêm một static entry vĩnh viễn
sudo arp -s 192.168.1.1 00:11:22:33:44:55

# Kiểm tra xem nó đã được đánh dấu permanent chưa
arp -n

Kết quả đầu ra phải hiển thị PERM bên cạnh entry của gateway. Trên mạng /24 phẳng với một gateway duy nhất, bước này thôi đã ngăn chặn được kịch bản MITM phổ biến nhất.

Để áp dụng sau mỗi lần khởi động lại, dùng /etc/ethers với arp -f:

# Định dạng /etc/ethers: MAC IP
echo "00:11:22:33:44:55 192.168.1.1" | sudo tee -a /etc/ethers

# Tải khi khởi động — thêm vào /etc/rc.local hoặc một systemd service
sudo arp -f /etc/ethers

Áp Dụng Quy Tắc với arptables

Với server và hạ tầng được quản lý có topology mạng cố định, arptables cho bạn kiểm soát chính xác. Chỉ chấp nhận ARP từ gateway đã biết, loại bỏ phần còn lại:

# Chỉ cho phép ARP từ gateway hợp lệ của bạn
# Thay bằng MAC và IP gateway thực tế của bạn
sudo arptables -A INPUT --source-mac 00:11:22:33:44:55 --source-ip 192.168.1.1 -j ACCEPT

# Loại bỏ tất cả ARP reply khác tuyên bố là gateway IP
sudo arptables -A INPUT --source-ip 192.168.1.1 -j DROP

Chấp nhận từ MAC thực, loại bỏ bất cứ thứ gì khác tuyên bố là IP đó. Kẻ tấn công vẫn có thể gửi gói tin giả — nhưng kernel của bạn sẽ bỏ qua chúng.

Để ngăn máy bạn bị dùng làm MITM relay, hãy giới hạn cả ARP chiều ra:

# Chỉ gửi ARP với MAC của chính bạn
MY_MAC=$(cat /sys/class/net/eth0/address)
sudo arptables -A OUTPUT --source-mac ! $MY_MAC -j DROP

Lưu và Khôi Phục Quy Tắc

# Lưu các quy tắc
sudo arptables-save > /etc/arptables.rules

# Khôi phục quy tắc khi khởi động — thêm vào /etc/rc.local hoặc một systemd unit
sudo arptables-restore < /etc/arptables.rules

Script Phát Hiện Nhanh

Thay vì chạy một daemon đầy đủ trên các máy nhẹ, hãy đưa script này vào cron job. Nó chụp ảnh ARP table mỗi 2 phút và cảnh báo khi có thay đổi:

#!/bin/bash
# arp_monitor.sh — cảnh báo khi ARP cache thay đổi

SNAPSHOT_FILE="/tmp/arp_snapshot"
CURRENT=$(arp -n | awk 'NR>1 {print $1, $3}')

if [ ! -f "$SNAPSHOT_FILE" ]; then
    echo "$CURRENT" > "$SNAPSHOT_FILE"
    echo "Đã lưu snapshot ARP ban đầu."
    exit 0
fi

DIFF=$(diff <(cat "$SNAPSHOT_FILE") <(echo "$CURRENT"))

if [ -n "$DIFF" ]; then
    echo "[CẢNH BÁO] ARP table đã thay đổi lúc $(date):"
    echo "$DIFF"
    # Bỏ comment để gửi cảnh báo qua Telegram hoặc email tại đây
fi

echo "$CURRENT" > "$SNAPSHOT_FILE"
# Cấp quyền thực thi và lên lịch qua cron
chmod +x /usr/local/bin/arp_monitor.sh
(crontab -l; echo "*/2 * * * * /usr/local/bin/arp_monitor.sh >> /var/log/arp_monitor.log 2>&1") | crontab -

Tổng Hợp Lại

Đây là thiết lập nhiều lớp tôi áp dụng trên bất kỳ máy Linux nào nằm trên mạng dùng chung:

  1. Static ARP entries cho các host quan trọng (gateway, DNS server, NFS server) — bảo vệ ngay lập tức, không tốn tài nguyên
  2. arpwatch chạy như service — giám sát liên tục, mọi bất thường đều được ghi vào syslog
  3. Quy tắc arptables cho server có topology mạng cố định và đã biết
  4. Cron job giám sát ARP cho các máy nhẹ mà chạy daemon là quá cồng kềnh

Xếp chồng nhiều lớp tùy theo môi trường của bạn. Càng nhiều lớp, kẻ tấn công càng khó ẩn mình lâu.

Một điều cuối đáng kiểm tra: switch của bạn có hỗ trợ Dynamic ARP Inspection (DAI) không? Cisco Catalyst, HP ProCurve và hầu hết các switch enterprise được quản lý đều có. DAI xác thực gói tin ARP dựa trên bảng binding của DHCP snooping ở cấp phần cứng.

Các ARP reply giả bị loại bỏ trước khi chúng đến được máy chủ của bạn. Hãy bật tính năng này nếu bạn có phần cứng hỗ trợ. DAI ở tầng switch kết hợp với arpwatch và static ARP entries trên host sẽ bịt kín gần như mọi hướng tấn công thực tế mà bạn sẽ gặp trên mạng Linux.

Share: