Build từ source kernel CentOS 5.2 và iptables để sử dụng những tính năng của iptables Netfilter/ipbtales là software NAT/firewall được cài đặt sẵn và phổ biến trên các hệ thống Linux..
Trang 1Build từ source kernel CentOS 5.2 và iptables để sử dụng
những tính năng của iptables
Netfilter/ipbtales là software NAT/firewall được cài đặt sẵn và phổ biến trên các hệ thống Linux
Cent0S là một distro Linux được viết ra dựa trên Redhat chủ yếu dành cho máy chủ, mặc định distro này không được xây dựng kèm theo module connlimit vốn rất cần thiết cho các quản trị viên dùng để cản lọc các gói tin không hợp lệ, nhất là trong trường hợp bị tấn công từ chối dịch vụ
Bài viết này đưa ra cách tích hợp module này vào CentOS bằng cách build từ source của Kernel và Netfilter/iptables Để hiểu được kiến thức đưa ra trong bài này, bạn cần có thời gian tìm hiểu và nắm rõ được phần nào cơ bản về biên dịch kernel, cài đặt các phần mềm từ mã nguồn, cũng như môi trường cần thiết
để một user bình thường có thể "build" một phần mềm từ mã nguồn có sẵn, hệ thống file, các câu lệnh nâng cao
Chúng ta không đi sâu vào khái niệm Netfilter/iptables là gì? Động cơ dẫn đến bài viết là trong một trường hợp nào đó cần tới những modules không được tích hợp sẵn vào nhân hệ điều hành CentOS mà bạn đang sử dụng, bạn tìm cách để tích hợp những modules đó vào, một cách nhanh nhất có thể, mà
không làm hư tổn, hoặc gây ra lỗi trầm trọng đối với hệ thống đang hoạt động
ổn định
1.Phần đầu tiên: kiểm tra và tạo môi trường "build" cho user:
Để thực hiện được bài viết này, hệ thống của bạn phải được cài đặt sẵn gói rpm-build, Để kiểm tra xem rpm-build đã được cài đặt chưa bạn dùng câu lệnh
Trang 2sau:
Nếu kết quả là:
[whatvn@localhost ~]$ rpm -q rpm-build
rpm-build-4.4.2.3-2.fc9.i386
thì hệ thống đã cài sẵn rpm-build, ta tiếp tục bước tiếp theo
còn nếu kết quả như bên dưới:
[whatvn@localhost ~]$ rpm -q rpm-buid
package rpm-buid is not installed
thì bạn cài đặt rpm-build bằng cách:
[whatvn@localhost ~]$ sudo yum install rpm-build
Vì môi trường cũng như target của các bản cài đặt ta đều chỉ định ở Home directory của user, nên để dễ dàng, bạn nên đứng ở thư mục ~ của user, làm tất
cả các tác vụ về sau Ta download các gói cần thiết về (cần chú ý bài viết này đang đề cập đến centOS 5.2, nếu bạn sử dụng các phiên bản centOS cũ hơn thì không download các packet dưới đây)
Kernel Source
[whatvn@localhost ~]$ wget
http://mirror.centos.org/centos/5/os/SRPMS/kernel-2.6.18-92.el5.src.rpm iptables source
[whatvn@localhost ~]$ wget
http://www.netfilter.org/projects/iptables/files/iptables-1.4.0.tar.bz2
patch-o-matic-ng
Trang 3[whatvn@localhost ~]$ wget
http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20081130.tar.bz2
Tạo môi trường "buid" cho user:
[whatvn@localhost ~]$ mkdir -p
rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
Lệnh trên thực hiện tạo thư mục rpmbuild trong thư mục home của user, và các thư mục con tương ứng BUILD,RPMS,SOURCES,SPECS,SRPMS
[whatvn@localhost ~]$ echo '%_topdir %(echo $HOME)/rpmbuild'>
.rpmmacros
Lệnh thực hiện tạo ra script rpmmacros với nội dung như trong cặp dấu ngoặc đơn ' ', bạn chú ý là dùng dấu ngoặc đơn, không phải ngoặc kép Một vài
hươngs dẫn dùng câu lệnh với dấu ngoặc " ", sẽ báo lỗi tương tự:
[whatvn@localhost ~]$ echo “%_topdir %(echo $HOME)/rpmbuild”
bash: syntax error near unexpected token `('
2 Thực hiện:
Cài đặt kernel source:
[whatvn@localhost ~]$ rpm -i kernel-2.6.18-92.el5.src.rpm
Sau đó:
[whatvn@localhost ~]$ rpmbuild -bp target=`uname -m` kernel-2.6.spec
Trang 4Bước này nếu hệ thống báo lỗi thiếu gói unifdef thì cài đặt bằng yum
[whatvn@localhost ~]$ yum install unifdef
rồi chạy lại lệnh phía trên
Qúa trình cài đặt có thể hơi lâu một chút, sau khi hoàn tất trở về thư mục Home
và giải nén source iptables và gói patch-o-matic-ng đã down về trước đó
[whatvn@localhost ~]$ tar xvjf iptables-1.4.0.tar.bz2
[whatvn@localhost ~]$ tar xvfj patch-o-matic-ng-20081130.tar.bz2
Chuyển vào thư mục patch-o-matic-ng-20081130 vừa giải nén
[whatvn@localhost ~]$ cd patch-o-matic-ng-20081130
chạy lệnh sau
[whatvn@localhost ~/patch-o-matic-ng-20081130]$ /runme download
Chú ý sau runme là 2 dấu gạch giữa, không phải 1 gạch ngang, lệnh trên sẽ tìm kiếm và download những modules cần thiết về, trong quá trình chạy hệ thống
sẽ hỏi bạn kernel source dir và iptables source dir Kernel source dir là thư mục
~/rpmbuild/BUILD/kernel-2.6.18 (chú ý thay ~ là tên home của bạn, ví dụ của tôi là whatvn) iptables source dir là thư mục iptables mà bạn vừa giải nén Chạy tiếp:
[whatvn@localhost ~/patch-o-matic-ng-20081130]$ /runme connlimit
Trang 5Trong bài viết này tôi sử ví dụ module connlimit, nếu các bạn muốn thêm
module nào thì có thể tự thêm vào ở lệnh trên Lệnh này cũng hỏi kernel source dir và iptables source dir, ban copy và dán vào như trên kia là được
Chuyển đến thư mục ~/rpmbuild/BUILD/kernel-2.6.18 và chạy lần lượt các lệnh bên dưới:
[whatvn@localhost ~/rpmbuild/BUILD/kernel-2.6.18]$ make oldconfig
[whatvn@localhost ~/rpmbuild/BUILD/kernel-2.6.18]$ make prepare
[whatvn@localhost ~/rpmbuild/BUILD/kernel-2.6.18]$ make
modules_prepare
Lệnh đầu tiên biên dịch kernel mới (không cài đặt) với cấu hình hiện tại của kernel hệ thống
Lệnh thứ 2 tạo ra các file cần thiết để biên dịch các module với cấu hình trên Lệnh thứ 3 xây dựng các modules tương ứng
Tiếp tục vào chuyển directory:
[whatvn@localhost ~/rpmbuild/BUILD/kernel-2.6.18]$ cd
~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/net/ipv4/netfilter
Trang 6Chạy lệnh
[whatvn@localhost
2.6.18/linux-2.6.18.x86_64/net/ipv4/netfilter]$ make -C
~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64 M=$PWD modules
Chép modulle mới xây dựng vào thư mục updates của kernel hiện tại và active
để sử dụng
[whatvn@localhost
~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/net/ipv4/netfilter]$ cp ipt_connlimit.ko /lib/modules/2.6.18-92.el5/updates
$ depmod 2.6.18-92.el5
$ modprobe ipt_connlimit
3 Thử nghiệm: copy và chạy lệnh này trên console, nếu không báo lỗi thì bạn
đã thành công
iptables -A INPUT -p tcp -d $IP dport 80 -m state state ESTABLISHED -m connlimit connlimit-above 4 -j DROP
$IP là ip của bạn
Trang 7Vài điểm lưu ý: kernel của bạn hoàn toàn có thể khác của tôi, bạn dùng uname -a để xem kernel hiện tại của mình là gì