Nguồn bài viết: - http://www.linuxhomenetworking.com/...HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables - Giới thiệu về iptables: Trần nhật huy [FONT="]I. [/FONT][FONT="]GIỚI THIỆU VỀ IPTABLE:[/FONT] [FONT="]Bảo mật mạng là vấn đề quan trọng hàng đầu đối với một website, cũng như nhiều dịch vụ khác trên mạng. Một trong những cách bảo về là sử dụng firewall. Bài viết này sẽ giới thiệu đầy đủ về iptables - một firewall được sử dụng thông dụng nhất trong hệ thống Unix, Linux[/FONT] [FONT="]II. [/FONT][FONT="]SỬ DỤNG iptables[/FONT] [FONT="]1. [/FONT][FONT="]Khởi động iptables[/FONT] Mã: #service iptables start #service iptables stop #service iptables restart [FONT="]Ba câu lệnh trên dùng trong các hệ điều hành của Red Hat. Với các distro khác, các bạn thay service thành /etc/init.d/iptables[/FONT] [FONT="]Để cho iptables khởi động cùng máy:[/FONT] Mã: #chkconfig iptables on [FONT="]để xem trạng thái của iptables[/FONT] Mã: #service iptables status [FONT="]2. Xử lý gói trong Iptables[/FONT] [FONT="]Tất cả các gói dữ liệu đều được kiểm tra bởi iptables bằng cách dùng các loại hành động (queues). Có 3 loại gồm:[/FONT] [FONT="]- [/FONT][FONT="]Mangle: Chịu trách nhiệm thay đổi các bit chất lượng dịch vụ (TOS, TTL, MARK)[/FONT] [FONT="]- [/FONT][FONT="]Filter: Chịu trách nhiệm lọc gói dữ liệu: Nó bao gồm 3 quy tắc nhỏ (chain) để giúp bạn thiết lập nguyên tắc lọc gói , gồm:[/FONT] [FONT="]o [/FONT][FONT="]Forward chain: Lọc gói khi đến các server khác[/FONT] [FONT="]o [/FONT][FONT="]Input chain: Lọc các gói đi vào trong server[/FONT] [FONT="]o [/FONT][FONT="]Output chain: Lọc các gói đi ra khỏi server[/FONT] [FONT="]- [/FONT][FONT="]NAT: Gồm có hai loại[/FONT] [FONT="]o [/FONT][FONT="]Pre-routing chain: Thay đổi địa chỉ đến của gói dữ liệu khi cần thiết[/FONT] [FONT="]o [/FONT][FONT="]Post-routing chain: Thay đổi địa chỉ nguồn của gói dữ liệu khi cần thiết[/FONT] [FONT="] Các loại queues và các quy tắc xử lý gói (chain) của nó [/FONT][FONT="] [/FONT] [FONT="] [/FONT] [FONT="]Để có cái nhìn tổng quát hơn về việc lọc và xử lý gói tin trong iptables, ta có thể tham khảo hình sau:[/FONT] [FONT="]Dưới đây là biểu đồ đường đi của gói dữ liệu: [/FONT][FONT="] [/FONT] [FONT="] [/FONT] [FONT="]Nói chung, quy trình tuần tự:[/FONT] [FONT="]- [/FONT][FONT="]Gói dữ liệu có cần phải sửa các bit dịch vụ hay không (mangle table PREROUTING chain) [/FONT] [FONT="]- [/FONT][FONT="]Nó có cần phải thay đổi địa chỉ đích hay không (NAT table PREROUTING chain)[/FONT] [FONT="]- [/FONT][FONT="]Nó đi đến mạng ngoài hay vào trong máy cục bộ firewall (Routing)[/FONT] [FONT="]o [/FONT][FONT="]Nếu đi đến mạng ngoài: Nó sẽ được lọc bởi FORWARD chain filter table, và nếu cần sẽ được thay đổi địa chỉ nguồn (SNAT) trước khi vào mạng B.[/FONT] [FONT="]o [/FONT][FONT="]Nếu gói dữ liệu đi vào trong máy cục bộ firewall: nó sẽ được kiểm tra bởi INPUT chain trong mangle table, và sẽ được lọc bởi filter table. Nếu qua được nó sẽ vào các chương trình bên trong của máy cục bộ firewall.[/FONT] [FONT="]- [/FONT][FONT="]Khi firewall cần gởi dữ liệu ra ngoài:[/FONT] [FONT="]o [/FONT][FONT="]Nó sẽ được kiểm duyệt qua OUTPUT chain[/FONT] [FONT="]o [/FONT][FONT="]OUTPUT chain cũng kiểm tra xem có cần phải DNAT hay không[/FONT] [FONT="]o [/FONT][FONT="]Cuối cùng trước khi gói dữ liệu đi ra ngoài, nó POSTROUTING sẽ xem có cần SNAT và sửa các thông số dịch vụ hay không (Qos, TTL..)[/FONT] [FONT="]3. Targets:[/FONT] [FONT="]Target là hành động diễn ra khi một gói dữ liệu được kiểm tra phù hợp với một yêu cầu nào đó. Khi một target đã được nhận dạng, gói dữ liệu cần nhảy (jump) để thực hiện các xử lý tiếp theo. Bảng sau liệt kê các targets mà iptables sử dụng.[/FONT] [FONT="]4. Các tham số chuyển mạch quan trọng của iptables:[/FONT] [FONT="]Các tham số sau sẽ cho phép iptables thực hiện các hành động sao cho phù hợp với biểu đồ xử lý gói do người sử dụng hoạch định sẵn.[/FONT] [FONT="]Để rõ hơn, chúng ta xét ví dụ sau:[/FONT] Mã: iptables –A INPUT –s 0/0 –i eth0 –d 192.168.1.1 –p TCP –j ACCEPT [FONT="]iptables được cấu hình để cho phép (ACCEPT) các gói TCP đến từ interface eth0, có địa chỉ nguồn bất kỳ(0/0) và địa chỉ đích là 192.168.1.1. [/FONT] [FONT="]Bảng các điều kiện TCP và UDP thông dụng:[/FONT] [FONT="]Một ví dụ cụ thể:[/FONT] Mã: iptables -A FORWARD -s 0/0 -I eth0 -d 192.168.1.158 -o eth1 -p TCP --sport 1024:65535 --dport 80 -j ACCEPT [FONT="]iptables được cấu hình để cho phép firewall chấp nhận các gói dữ liệu có giao tiếp là TCP, đến từ card mạng eth0, có bất kỳ địa chỉ IP nguồn nào, địa chỉ đích là 192.168.1.158 đến card eth1. Số port nguồn từ 1024 đến 65535 và port đích đến là 80(HTTP).[/FONT] [FONT="] [/FONT][FONT="]Bảng điều kiện ICMP [/FONT] [FONT="]Ví dụ cụ thể về ICMP:[/FONT] Mã: iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT [FONT="]Hai ví dụ trên cấu hình cho iptables chấp nhận gởi ICMP echo-request (ping) và gởi lại các gói icmp echo-replies.[/FONT] [FONT="]Ta cùng xem ví dụ khác sau:[/FONT] Mã: iptables -A INPUT -p icmp --icmp-type icmp-request -m limit --limit 1/s -i eth0 -j ACCEPT [FONT="]Với cấu hình trên, iptables giới hạn 1 gói icmp request gởi đến trong 1 giây. Bạn có thể chỉ định thời gian theo định dạng /second, /minute, hour, hoặc /day. Hoạc sử dụng từ viết tắt như 3/s thay cho 3/second. Cấu hình này của iptables giúp chúng ta lọc bớt các lưu lượng lớn, đây là hình thức tấn công từ chối dịch vụ (DOS).[/FONT] Mã: iptables -A INPUT -p tcp --syn -m limit --limit 5/s -i eth0 -j ACCEPT [FONT="]Ví dụ trên là cấu hình phòng vệ chống lại kiểu tấn công SYN flood bằng cách hạn chế sự chấp nhận các phân đoạn TCP có bit SYN không nhiều hơn 5 lần trong 1 giây.[/FONT] [FONT="]Các điều kiện mở rộng thông dụng[/FONT] [FONT="]Ví dụ dưới đây là mở rộng cho ví dụ trước.[/FONT] Mã: iptables -A FORWARD -s 0/0 -i eth0 -d 192.168.1.58 -o eth1 -p TCP --sport 1024:65535 -m multiport --dport 80,443 -j ACCEPT iptables -A FORWARD -d 0/0 -o eth0 -s 192.168.1.58 -i eth1 -p TCP -m state --state ESTABLISHED -j ACCEPT [FONT="]iptables được cấu hình cho phép firewall chấp nhận các gói dữ liệu có giao tiếp (protocols) là TCP, đến từ card mạng eth0, có bất kỳ địa chỉ ip nguồn, đi đến địa chỉ 192.168.1.58 qua card mạng eth1. Số port nguồn từ 1024 đến 65535 và port đích là 80 (HTTP) hoặc 443 (HTTPS). Đến khi các gói dữ liệu được gởi trở lại từ 192.168.1.58, thay vì mở các port nguồn và đích, bạn chỉ việc cho phép dùng kết nối cũ đã thiết lập bằng cách dùng tham số -m state và --state ESTABLISHED[/FONT] [FONT="]5. Sử dụng user defined chains:[/FONT] [FONT="]Chuỗi User Defined Chain nằm trong bảng iptables. Nó giúp cho quá trình xử lý gói tốt hơn.[/FONT] [FONT="]Ví dụ: Thay vì sử dụng gói đơn được xây dựng trong chain cho tất cả các giao thức, ta có thể sử dụng chain này để quyết định loại giao thức cho gói và sau đó kiểm soát việc sử lý user-defined, protocol-specific chain trong bảng filter table.[/FONT] [FONT="]Sáu lệnh sau giúp cải tiến tốc độ xử lý:[/FONT] Mã: iptables -A INPUT -i eth0 -d 206.229.110.2 -j fast-input-queue iptables -A OUTPUT -o eth0 -s 209.229.110.2 -j fast-output-queue iptables -A fast-input-queue -p icmp -j icmp-queue-in iptables -A fast-output-out -p icmp -j icmp=queue-out iptables -A icmp-queue-out -p icmp --icmp-type echo-request -m state --state NEW -j ACCEPT iptable -A icmp-queue-in -p icmp --icmp-type echo-reply -j ACCEPT [FONT="] [/FONT] [FONT="]Sáu queue trên giúp cải thiện chức năng xử lý:[/FONT] [FONT="]6. Lưu lại các đoạn script iptables[/FONT] [FONT="]Dịch vụ iptables lưu vĩnh viễn cấu hình iptables trong tập tin /etc/sysconfig/iptables . Khi khởi động lại hệ thống, iptables sẽ đọc file cấu hình này và khôi phục lại các cấu hình trước.[/FONT] [FONT="] [/FONT]
Cảm ơn sunboy đã có một bài viết ý nghĩa cho nhưng bạn nào đang học quản trị mạng. Tôi có một số góp ý để bài viết hoàn thiện sau: 1. --->nên thay bằng: "trong các dòng distro Red Hat". 2. Mã: iptables -A FORWARD -s 0/0 [COLOR=red]-I[/COLOR] eth0 -d 192.168.1.158 -o eth1 -p TCP --sport 1024:65535 --dport 80 -j ACCEPT -->ko xác định tùy chọn này, phải thay bằng -i 3. --->chỗ này có lẻ sunboy dịch chưa chính xác, iptables chỉ chịu trách nhiệm kiểm tra trạng thái gói tin, cho nên tùy chọn -m state --state ESTABLISHED nhằm kiểm tra xem trạng thái gói tin có phải thuộc ESTABLISHED thì nó sẽ cho phép gói tin được FORWARD, ngược lại DROP theo chính sách mặc định của IPTABLES P/S: ESTABLISHED, là một trong 11 trạng thái cơ bản trong sơ đồ trạng thái TCP, với trạng thái này đồng nghĩa 2 bên gửi và nhận đã thực hiện một kết nối thông qua bắt tay 3 bước. Chi tiết về các trạng thái này tôi sẽ mô tả chi tiết trong loạt bài sau.
Cảm ơn Chip đã đóng góp ý kiến hoàn thiện. Mình có một chút giải thích: - Lỗi thứ hai chính xác như chip nói (cái này mình không cố ý, do word auto cap lock) - Lỗi thứ 3. Mình xin trích nguyên văn tiếng anh của nó và văn bản dịch như thế này Cái này, theo mình tác giả viết đúng và văn bản dịch cũng không sai
--->tại sao lại có việc mở các port nguồn port đích trên iptables ở đây? Sao lại cho phép dùng các kết nối cũ ở đây? Cậu giải thích ý nghĩa câu này xem sao. P/S: việc thiết lập [FONT="]-m state và --state ESTABLISHED không liên quan đến việc mở port và sử dụng kết nối cũ của hai bên. Với tùy chọn trên IPTABLES chỉ có nhiệm vụ theo dõi trạng thái gói tin, chứ không thể can thiệp sâu vào việc mở port hay sử dụng kết nối nào. Không tin cậu viết một câu lệnh không dùng tùy chọn trên xem thử nó có cho phép dùng lại các kết nối cũ không. [/FONT]
Đầy đủ là vầy: [FONT="]Ví dụ dưới đây là mở rộng cho ví dụ trước.[/FONT] Cảm ơn chip đã góp ý. Theo mình hiểu. Ở đây, từ mở port không có nghĩa là khởi tạo, mà có nghĩa là cho phép. Thay vì cho phép TCP port nguồn và port đích (như dòng ví dụ đầu tiên) thì ta có thể dùng -m state --state ESTABLISHED Còn ví dụ thì như 2 dòng trên đã quá rõ, bởi dòng nhứ nhất viết theo kiểu "mở port". Dòng thứ hai viết theo kiểu "state". PS: Tác giả viết hai dòng lệnh trên có ý muốn so sánh để làm nổi bật lên hai cách viết, chúng ta có thể rõ ràng thấy được điểm khác nhau giữa hai dòng lệnh trên. Best regards!