You are on page 1of 7

BÀI THỰC HÀNH 4

Môn học: Hệ thống nhúng & Mạng không dây

Ghi chú: định dạng file bài nộp <Hoten>_<MSSV>_BTn.doc hoặc .zip nếu có yêu cầu chỉnh
sửa source

VD: NguyenVanA_13020010_BT4.doc

I. Nội dung

Trong bài Lab này, chúng ta sẽ tìm hiểu về cách viết một module NetFilter, là thành phần
packet filtering trong nhân Linux (từ v2.6). Netfilter chủ yếu cung cấp một bộ các hooks
trong nhân Linux cho phép các Kernel module có thể đăng ký các hàm trả về (callback)
trong các tầng giao thức mạng. Một hàm trả về sẽ được gọi khi mỗi gói tín truyền qua đúng
hook mà lúc đầu đã đăng ký. Trong lab này sẽ làm việc với gói tin IPv4.

II. Chuẩn bị:


Hệ điều hành Ubuntu cài trên một máy vật lý.

Một máy khác cùng kết nối vào mạng (OS tùy ý) (cài iperf)

Các gói thư viện cần cài đặt trên Ubuntu (Make, Kernel 3.19):

sudo apt-get install build-essential module-assistant iperf linux-


generic-lts-vivid

sudo reboot

Khởi động lại giữa phím Shift nếu không hiện vào bootmenu Grub
III. Cấu trúc một kernel module cơ bản
Gồm 4 nội dung chính:
- Import các thư viện
- Hàm init
- Hàm exit
- Cài đặt
Ví dụ một chương trình mẫu, tạo file hello.c với nội dung sau:

Tạo file Makefile (chú ý phải đúng từng khoảng trắng)


Lưu ý dòng 1 chỉnh tên cho đúng với tập tin .c ban đầu, thay .c bằng .o
Cho 2 tập tin vào cùng 1 thư mục và tiến hành build và loade vào kernel  xem mục V
IV. Các Netfilter hooks cho IPv4
Netfilter định nghĩa 5 hooks cho IPv4. Chúng được định nghĩa trong file
linux/netfilter_ip4.h

Hook Được gọi lúc


NF_INET_PRE_ROUTING Trước khi ra các quyết định routing
Sau các quyết định routing nếu các packets
NF_INET_LOCAL_IN
đi đến host này
Nếu packets được chuyển tiếp đến interface
NF_INET_FORWARD
khác
NF_INET_LOCAL_OUT Khi packets đi ra ngoài
Trước khi các outbound packets đi lên
NF_INET_POST_ROUTING
đường truyền
Bảng 1. Các sự kiện mà các hook có thể đăng ký

Hình 1. Thứ tự các sự kiện mà các hook có thể đăng ký


(Tham khảo thêm tại https://www.netfilter.org/documentation/HOWTO/netfilter-
hacking-HOWTO-3.html)
Sau khi các hàm trả về đã hoàn thành việc xử lý của chúng với gói tin, chúng phải trả về
(đưa ra) các quyết định DROP hay ACCEPT gói tin, các quyết định này được định nghĩa
sẵn trong Netfilter dưới các code như sau:

Return code Ý nghĩa


NF_DROP Hủy gói tin.
NF_ACCEPT Giữa gói tín, và thực thi tiếp các hooks còn lại
NF_STOLEN Tạm quên gói tin, nhưngvẫn giữ gói tin trong resource của kernel.
NF_QUEUE Đưa gói tin vào hàng đợi
NF_REPEAT Gọi hàm trả về này thêm lần nữa
NF_STOP Giữa gói tin, bỏ qua các hooks còn lại
Bảng 2. Các mã trả về của các hàm Netfilter Callback
V. Build và thử một module
Để file Makefile và nkmod.c vào chung 1 thư mục, gõ lệnh:
sudo make
Lưu ý các khoảng trắng và tab trong Makefile:

Output:

Trong trường hợp build bị lỗi nếu thiếu linux-header, thì install gói thư viện sau:
apt-get install linux-headers-`uname -r`

Hoặc
sudo apt-get install linux-headers-$(uname -r)

Sau khi build xong, chạy iperf server trên máy hiện tại bằng lệnh: iperf -s -i 1

Trên máy client, khởi tạo kết nối và gửi gói tin đến iperf server bằng giao thức TCP bằng
lệnh: iperf -c <serverIp> -i 1

 Kết nối và gửi dữ liệu thành công.

Dùng lệnh insmod để cài đặt Netfilter module này vào Kernel:

sudo insmod nkmod.ko

Kiểm tra bằng lệnh:


dmesg | tail

Trên server:
Trên máy client, thực hiện lại lệnh iperf -c <serverIp> -i 1

 Không còn kết nối được nữa  Giải thích vì sao?


Dùng lệnh rmmod để unregister module.
sudo rmmod nkmod.ko

VI. Yêu cầu chi làm yc 1

1. Cài đặt, hoàn thành các bước trong phần hướng dẫn thực hành ở trên (1đ)
2. Sửa lại file nkmod.c để hook DROP các gói tin UDP và ICMP (2đ).
Hướng dẫn:
- Protocol code tham khảo ở đây:
http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
- Sau khi thực hiện xong, dùng công cụ Ping và Iperf để kiểm tra kết quả.
- Cách sử dụng Iperf: Ref#1, Ref#2.

3. MỞ RỘNG
Tìm hiểu và chỉnh sửa lại hook theo các yêu cầu sau:

a. DROP các packets có source IP đến từ địa chỉ máy client, chẳng hạn,
192.168.10.10, ACCEPT tất cả các packets còn lại (2đ)
Hướng dẫn: kiểm tra source IP của IP header.
- Cấu trúc IP header tham khảo tại đây: ip.h
- Hàm hỗ trợ chuyển IP (kiểu unsigned int) sang địa chỉ IP (char array): snprintf
b. DROP các packet kết nối đến Port đích là 80 (2đ)
Hướng dẫn: xét destination port trong cả hai trường hợp UDP header và TCP
header.
- Cấu trúc UDP/TCP header tham khảo tại đây: tcp.h, udp.h
- Trích xuất UDP header.
c. DROP các gói tin đi từ máy tính hiện tại đến facebook.com, ACCEPT tất cả
các packets còn lại (3đ)
Hướng dẫn:
- Kiểm tra và drop packet gửi đến tất cả các địa chỉ IP của facebook.com
- Thay đổi Hook phù hợp để kiểm tra packet được gửi từ máy tính ra ngoài.
Lưu ý: từng câu làm được sẽ được cộng thêm số điểm tương đương, lưu ý làm xong
phải có bước kiểm tra lại kết quả bằng iperf hoặc lệnh ping.

You might also like