Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

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 phần chính
- 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
NF_INET_LOCAL_IN Sau các quyết định routing nếu các
packets đi đến host này
NF_INET_FORWARD Nếu packets được chuyển tiếp đến
interface khác
NF_INET_LOCAL_OUT Khi packets đến từ những
NF_INET_POST_ROUTING Trước khi các outbound packets đi lên
đườ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 dùng máy còn lại ping đến máy Ubuntu:
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
Dùng máy còn lại kiểm tra lại sẽ thấy không ping được máy Ubuntu nữa  Giải thích vì
sao?
Dùng lệnh rmmod để unregister module.
sudo rmmod nkmod.ko

VI. Yêu cầu


1. Sửa lại file nkmod.c để hook chỉ DROP các gói tin UDP
Gợi ý: sử dụng nkmod_udp(student)
Dùng hàm skb_network_header(<kiểu sk_buff *>) để lấy thông tin header
Dùng ip_header->protocol== <protocol_code> để lấy thông tin protocol sử dụng
trong gói tin  để kiểm tra protocol có phải UDP hay không
Protocol code tham khảo ở đây:
http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
Struct của IP header, TCP/UDP header tham khảo trong các file sau của linux source
code
ip.h, tcp.h, udp.h
Sau khi chỉnh sửa xong build và sử dụng lệnh insmod để cài đặt vào kernel
Kiểm tra bằng iperf:
Trên máy Ubuntu start UDP server bằng lệnh:
iperf –s –u –i 1

Máy còn lại start UDP client để kết nối tới máy Ubuntu bằng lệnh:
iperf –c <ip_máy_ubuntu> -u

2. 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 packet có source IP đến từ một địa chỉ cụ thể, chẳng hạn,
192.168.10.10 , ACCEPT tất cả
b. DROP các packet đi đến địa chỉ Port đích là 80.
c. Chỉ cho phép các gói tin đi đến địa chỉ 118.69.123.142 (uit.edu.vn) đi ra
ngoài, DROP tất cả còn lạ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