Phát hiện và phòng chống ARP Spoofing với Arpwatch và Dynamic ARP Inspection

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Vấn đề: Tại sao mạng Layer 2 dễ bị đánh lừa bởi lưu lượng giả mạo

Các mạng Layer 2 truyền thống luôn mặc định mọi host kết nối đều đáng tin cậy. Khi một máy chủ cần giao tiếp với một IP trong cùng subnet cục bộ, nó sẽ broadcast một gói tin truy vấn Address Resolution Protocol (ARP): Ai đang giữ IP này? Máy chủ sở hữu IP đó sẽ phản hồi kèm địa chỉ Media Access Control (MAC) của mình, sau đó cả hai host đều cập nhật ARP cache cục bộ.

Giao thức ARP tiêu chuẩn hoàn toàn không có cơ chế xác thực. Bất kỳ máy tính lạ, container bị xâm nhập hay máy ảo giả mạo nào cũng có thể gửi các gói tin gratuitous ARP reply không mong muốn. Kẻ tấn công có thể mạo nhận IP của default gateway, database node hoặc core DNS resolver. Các host mục tiêu sẽ ghi đè bảng cache mà không hề kiểm tra. Toàn bộ lưu lượng ngay lập tức bị định tuyến qua kẻ tấn công, cho phép thực hiện packet inspection, can thiệp chỉnh sửa dữ liệu hoặc âm thầm drop gói (blackholing).

Vấn đề này không hề mang tính lý thuyết. Năm ngoái, đội ngũ của chúng tôi đã mất ba giờ đồng hồ để truy tìm nguyên nhân gây lỗi 502 gián đoạn và rớt TLS handshake trên một staging Kubernetes cluster. Thủ phạm là một máy ảo thử nghiệm bị cấu hình sai, chạy script cân bằng tải liên tục broadcast IP của default gateway (10.0.10.1) gắn với địa chỉ MAC của chính nó. Hơn 40 worker node đã bị đầu độc cache chỉ trong vài phút.

Khái niệm cốt lõi: Giám sát thụ động và Thực thi chủ động trên Switch

Để ngăn chặn ARP poisoning, cần kết hợp hai lớp phòng thủ bổ trợ: phát hiện ở cấp độ host và thực thi bằng phần cứng ở cấp độ switch.

1. Cơ chế của ARP Cache Poisoning

Hệ điều hành duy trì một bảng ARP trong bộ nhớ để tránh phải gửi truy vấn broadcast liên tục cho mỗi gói tin. Giả sử Host A (10.0.10.25) muốn kết nối đến Gateway 10.0.10.1. Kẻ tấn công gửi một gói tin giả mạo thông báo 10.0.10.1 is at aa:bb:cc:11:22:33. Host A tiếp nhận frame và cập nhật bảng ARP mà không cần xác thực. Kể từ thời điểm đó, Host A sẽ chuyển toàn bộ lưu lượng ra ngoài (egress traffic) trực tiếp đến kẻ tấn công.

2. Phát hiện thụ động với Arpwatch

Arpwatch là một daemon Linux gọn nhẹ giúp giám sát các hoạt động broadcast ở Layer 2. Nó ghi nhận và theo dõi các cặp IP-MAC theo thời gian, đồng thời ghi log các bất thường vào syslog hoặc gửi email cảnh báo mỗi khi một IP đổi sang địa chỉ MAC mới, chuyển đổi giữa các interface hoặc xuất hiện vendor OUI chưa đăng ký.

3. Phòng ngừa chủ động với Dynamic ARP Inspection (DAI)

Arpwatch chỉ cảnh báo sau khi sự cố đã xảy ra chứ không thể drop các frame độc hại. Đây chính là lúc cần đến Dynamic ARP Inspection (DAI). DAI là một tính năng phần cứng trên các managed switch. Nó chặn các yêu cầu và phản hồi ARP trên các access port không đáng tin cậy (untrusted ports), kiểm tra từng frame dựa trên database binding của DHCP Snooping trên switch. Nếu cặp IP-MAC không khớp với một lease hợp lệ, ASIC của switch sẽ drop frame ngay lập tức.

Thực hành: Triển khai Arpwatch và cấu hình DAI trên Switch

Dưới đây là hướng dẫn triển khai từng bước. Chúng ta sẽ cấu hình cảnh báo thụ động trên một node giám sát Ubuntu trước, sau đó khóa các access port trên switch.

Bước 1: Cài đặt và cấu hình Arpwatch trên Linux

Cài đặt package trên máy chủ quản trị hoặc network probe chuyên dụng của bạn:

sudo apt update
sudo apt install -y arpwatch

Xác định interface giám sát bằng lệnh ip link show, sau đó chỉnh sửa file cấu hình mặc định của service:

sudo nano /etc/default/arpwatch

Chỉ định interface lắng nghe và địa chỉ nhận thông báo:

# /etc/default/arpwatch
INTERFACES="eth0"
ARGS="-N -m [email protected] -R 6"

Khởi tạo state file và khởi động daemon:

# Khởi tạo database theo dõi
sudo touch /var/lib/arpwatch/arp.dat
sudo chown -R arpwatch:arpwatch /var/lib/arpwatch

# Khởi động service
sudo systemctl enable --now arpwatch
sudo systemctl status arpwatch

Theo dõi phát hiện thời gian thực trong system journal:

sudo journalctl -u arpwatch -f

Khi xảy ra xung đột địa chỉ, Arpwatch sẽ ghi log cảnh báo có cấu trúc:

arpwatch: changed ethernet address: 10.0.10.1 00:50:56:a1:2b:3c (old 00:0c:29:4f:8e:12)

Bước 2: Bật DHCP Snooping trên Access Switch

DAI dựa vào database của DHCP Snooping để xác thực các IP được cấp phát động. Trên switch (sử dụng cú pháp Cisco IOS), hãy bật snooping ở chế độ global và gán vào VLAN người dùng/máy chủ của bạn (ví dụ: VLAN 10):

Switch# configure terminal
Switch(config)# ip dhcp snooping
Switch(config)# ip dhcp snooping vlan 10
Switch(config)# no ip dhcp snooping information option

Cấu hình cổng uplink sang chế độ trusted để cho phép các phản hồi hợp lệ từ DHCP server:

Switch(config)# interface GigabitEthernet0/1
Switch(config-if)# description Core-Router-Uplink
Switch(config-if)# ip dhcp snooping trust
Switch(config-if)# exit

Bước 3: Bật Dynamic ARP Inspection (DAI)

Sau khi đã kích hoạt snooping, hãy bật DAI cho VLAN 10 và kích hoạt cơ chế xác thực payload nghiêm ngặt:

Switch(config)# ip arp inspection vlan 10
Switch(config)# ip arp inspection validate src-mac dst-mac ip

Đặt interface uplink ở chế độ trusted để cho phép các ARP reply hợp lệ của router đi qua trunk:

Switch(config)# interface GigabitEthernet0/1
Switch(config-if)# ip arp inspection trust
Switch(config-if)# exit

Thiết lập giới hạn tốc độ (rate limiting) trên các access port untrusted. Điều này giúp ngăn chặn kẻ tấn công làm quá tải CPU của switch bằng các đợt ARP flood:

Switch(config)# interface range GigabitEthernet0/2 - 24
Switch(config-if-range)# ip arp inspection limit rate 15
Switch(config-if-range)# exit

Bước 4: Cho phép các host dùng IP tĩnh bằng ARP Access List

Các máy chủ gán IP tĩnh không gửi DHCP request nên sẽ không có bản ghi trong DHCP Snooping database. Nếu không cấu hình ngoại lệ, DAI sẽ drop toàn bộ lưu lượng hợp lệ của chúng. Hãy định nghĩa một ARP Access List cho các endpoint này:

Switch(config)# arp access-list STATIC-SERVERS
Switch(config-arp-nacl)# permit ip host 10.0.10.10 mac host 0050.56a1.2b3c
Switch(config-arp-nacl)# permit ip host 10.0.10.11 mac host 0050.56a1.4d5e
Switch(config-arp-nacl)# exit

Switch(config)# ip arp inspection filter STATIC-SERVERS vlan 10 static

Bước 5: Kiểm tra Binding và xem thống kê Drop Counter

Kiểm tra xem switch đã cập nhật bảng lease hay chưa:

Switch# show ip dhcp snooping binding

Kiểm tra số liệu thống kê drop của DAI để xác minh hoạt động bảo vệ:

Switch# show ip arp inspection vlan 10

Source Mac Validation      : Enabled
Destination Mac Validation : Enabled
IP Transition Validation   : Enabled

Vlan 10 Configuration
---------------------
Verify Source MAC          : Enabled
Verify Destination MAC     : Enabled
Verify IP                  : Enabled

Vlan 10 Statistics
------------------
Forwarded                  : 128450
Dropped                    : 23
DHCP Drops                 : 23
ACL Drops                  : 0

Tổng kết

Arpwatch mang lại khả năng giám sát nhanh chóng ở cấp độ host trên các subnet Linux. Tuy nhiên, một hệ thống phòng thủ Layer 2 thực thụ bắt buộc phải có sự tham gia thực thi của phần cứng. Việc kết hợp DHCP Snooping và Dynamic ARP Inspection trên switch sẽ ngăn chặn các nỗ lực đầu độc ngay từ cổng vật lý, bảo vệ gateway và máy chủ của bạn khỏi các cuộc tấn công Man-in-the-Middle.

Share: