Thứ Bảy, 7 tháng 5, 2011

Tìm Hiểu Về IPTables

Chắc ai cũng đã từng nghe iptables, iptables, rồi snort...trên Linux..mà nhiều khi tự hỏi, nó là cái gì thế? Lên mạng lục được cái này vậy post lên đây cho mọi người cùng tìm hiểu và có gì trao đổi với nhau.

I. Iptables là gì?

Trước đây, package tường lửa/NAT phổ biến nhất chạy trên Linux là ipchains. Tuy nhiên, theo thời gian, ipchains có một số nhược điểm nên đã được Netfilter thay bằng iptables, với các improvement sau đây:

- Tích hợp tốt hơn với nhân của hệ điều hành Linux.

- Cho phép load tốt hơn các modules đặc biệt của iptables giúp cho việc cái thiện độ tin cậy và tốc độ xử lý.

- Là một statefull firewall.

- Filter packet dựa trên địa chỉ MAC và các cờ của TCP header.

- NAT tốt hơn.

- Hỗ trợ việc tích hợp một cách trong suốt với các chương trình như Web proxy: Squid.

- Một số thông số limit có thể được sử dụng trong iptables giúp cho việc ngăn chặn được các cuộc tấn công DOS.

Vậy có thể tóm tắt lại: iptables là một package firewall/NAT được sử dụng rộng rãi nhất hiện nay và được tích hợp sẵn hay cài đặt sử dụng trên các hệ điều hành của Redhat.


II. Tìm hiểu iptables qua ví dụ:

Trong iptables chia ra thành các bảng (tables); trong mỗi bản sẽ chia ra thành nhiều chuỗi (chains) để xử lý packet tùy theo tình huống (hướng đi của packets); trong mỗi chain sẽ có các luật (rules) mà mình sẽ cấu hình để xử lý các packets tương ứng với mỗi chain.

Giả sử bạn muốn block tất cả các packets từ IP 200.200.200.1 thì bạn sẽ dùng option -s để chỉ ra địa chỉ IP nguồn hay DNS nguồn. Vì thế, bạn sẽ viết như sau để chỉ các traffic đến từ nguồn 200.200.200.1

iptables -s 200.200.200.1

Nhưng như thế bạn chưa nói iptables xử lý các gói tin đó như thế nào? Do đó, bạn phải dùng option -j để bảo iptables phải xử lý như thế nào:ACCEPT, REJECT, và DROP. Ở đây, ta DROP.

iptables -s 200.200.200.1 -j DROP.

Tuy nhiên, máy tính vẫn chưa biết cách xử lý như thế nào vì ta chưa xác định rule này thuộc chain nào? Do đó, ta phải dùng option –A để thêm rule này vào một chain mà ta chỉ định. Bởi vì bạn muốn block các gói tin từ ngoài vào firewall nên ta dùng chain INPUT.

iptables -A INPUT -s 200.200.200.1 -j DROP

Lệnh trên sẽ block tất cả các gói tin xuất phát từ máy có ip là 200.200.200.1. Bây giờ, ta chỉ muốn block gói tin telnet xuất phát từ máy có ip trên thì sao? Telnet là dịch vụ sử dụng TCP, port 23. Ta có thể dùng option –p để chỉ định protocols; --destination-port để chỉ ra port trên máy đích ( port mà máy có ip trên đang cố gắng truy cập trên máy tính của ta hiện giờ). Nếu nhớ port là 23 thì sau --destination-port có thể dùng là 23; không thì dùng chữ telnet.

iptables -A INPUT -s 200.200.200.1 -p tcp --destination-port telnet -j DROP

Ở trên, là địa chỉ IP trong rule; bây giờ, ta muốn đề cập tới một dãy IP 200.200.200.* thì sao? Ta có thể sử dụng như sau: 200.200.200.0/24.

iptables –A INPUT -s 200.200.200.0/24 -p tcp --destination-port telnet -j DROP

Bây giờ, ta sẽ xem xét iptables trong một mô hình lớn hơn một tí. Tôi có một hệ thống mạng LAN và kết nối Internet. Firewall của tôi tất nhiên là nằm giữa LAN và Internet rồi. Chúng ta cũng coi là nối LAN qua interface eth0, và kết nối internet gọi là interface ppp0. Bây giờ, bạn chỉ muốn các máy tính trong LAN mới có thể thực hiện telnet đến firewall thôi, còn đối với Internet thì không? Vậy bạn làm thế nào?

Khi này, ta sẽ dùng option –i tương ứng với input interface và –o tương ứng với output interface. Mặc dù ta có thể thêm luật sau vào chain OUTPUT; nhưng để “ngăn chặn ngay từ trong trứng nước” thì tốt hơn ta nên thêm nó vào chain INPUT, để cho telnet service chạy trên firewall không hề nhận được request telnet nào từ bên ngoài Internet.

iptables –A INPUT -p tcp --destination-port telnet -i ppp0 -j DROP

Mặc định với option –A thì rule sẽ được add vào cuối chain (A = append). Ta có thể sử dụng một số option khác để add, hay delete rule theo ý mình.

-I INPUT 1 : để add rule vào dòng thứ 1 trong chain, -D :delete, -F: flush một chain, -L : list các rules trong chain.

Bạn muốn cấm tất cả các incoming traffic đối với firewall ( vì lý do bảo mật mà ); nhưng nếu như thế, khi một máy tính bên trong LAN giao tiếp với một máy tính bên ngoài thì sau khi gửi một request thì máy tính bên ngoài sẽ gửi lại một reply. Nếu ta cấm tất cả incoming traffic thì vô tình ta cấm cả các máy bên trong liên lạc với bên ngoài.

Giải pháp: Khi mới tạo kết nối, các máy bắt đầu bằng cờ SYN. Dựa vào đây, ta có thể tạo một luật, cấm tất cả các máy tính mà bắt đầu gửi cờ SYN cho các máy bên trong LAN; hay nói cách khác, cấm các máy chủ động tạo kết nối tới các máy trong LAN, dùng option --syn

iptables -A INPUT -i ppp0 -p tcp --syn -j DROP

Nhưng, nếu ta đang chạy web service ở một server nào trong LAN và muốn người bên ngoài truy cập thì sao? Khà khà, ta chỉ cần chỉnh sửa luật đôi chút thôi:

iptables -A INPUT -i ppp0 -p tcp --syn --destination-port ! 80 -j DROP

Các bạn có hiểu luật trên không?: Cấm tất cả các kết nối bắt nguồn từ bên ngoài vào trong, trừ các kết nối có destination port là 80 (www).

Không có nhận xét nào: