Trang chủ Kiến thức cơ bản

Tìm hiểu về Iptables (phần 1)

Trong các server Linux luôn tích hợp sẵn một hệ thống tường lửa (firewall), đây là công cụ tường lửa rất mạnh, tuy nhiên lại hơi khó dùng với những người mới. Trong bài này, VCCloud sẽ giải thích kỹ về cấu trúc và cách sử dụng iptables, đưa ra một vài ví dụ cụ thể tạo tường lửa trên server.

1.Iptables là gì?

Iptables là một ứng dụng tường lửa dựa trên lọc gói rất mạnh, miễn phí và có sẵn trên Linux.

Iptables/Netfilter gồm 2 phần là Netfilter ở trong nhân Linux và Iptables nằm ngoài nhân. Iptables chịu trách nhiệm giao tiếp với người dùng và sau đó đẩy các luật của người dùng vào cho Netfiler xử lí. Netfilter tiến hành lọc các gói dữ liệu ở mức IP. Netfilter làm việc trực tiếp trong nhân, nhanh và không làm giảm tốc độ của hệ thống.

2.Cơ chế - Thành phần của Iptables:

Cơ chế lọc gói tin của Iptable được xây dựng dựa trên 3 thành phần cơ bản đó là table, chain và target. Nói đơn giản, table là một xử lý các gói tin theo những cách cụ thể. Nếu không chỉ định cụ thể thì mặc định là chúng ta sẽ làm việc với filter table, ngoài ra còn có các bảng khác.

Mỗi bảng sẽ được gắn thêm các chain. Việc gắn thêm chain vào table cho phép xử lý gói tin ở những giai đoạn khác nhau, ví dụ chúng ta có thể xử lý gói tin ngay khi gói tin vừa đến interface hay xử lý các gói tin trước khi các gói này được đẩy ra interface. Bạn có thể tạo ra rule rất cụ thể, ví dụ gói tin đó đến từ port nào, đến từ IP nào sau đó chỉ định hành động (TARGET) sẽ áp dụng với gói tin này.

Khi có một gói tin đến hoặc gói tin đi Iptable sẽ so sánh với từng rule trong một chain. Khi một gói tin giống với rule đặt ra Iptable sẽ thực hiện hành động ứng với rule đó. Nhưng nếu gói tin không khớp với bất cứ rule nào thuộc chain, Iptable sẽ áp dụng "default policy" cho gói tin đó. Mặc định "default policy" của các chain là cho phép gói tin.

Bây giờ chúng ta sẽ đi tìm hiểu cụ thể từng thành phần trong Iptable.

  • Table

Iptable sử dụng table để định nghĩa các rules cụ thể cho các gói tin. Các phiên bản Linux hiện nay có 4 loại table khác nhau:

- Đầu tiên phải kể đến filter table: Table này quen thuộc và hay được sử dụng nhất. table này nhằm quyết định liệu gói tin có được chuyển đến địa chỉ đích hay không.

- Tiếp theo là mangle table: Table này liên quan đến việc sửa head của gói tin, ví dụ chỉnh sửa giá trị các trường TTL, MTU, Type of Service.

- Table Nat: Table này cho phép route các gói tin đến các host khác nhau trong mạng NAT table cách thay đổi IP nguồn và IP đích của gói tin. Table này cho phép kết nối đến các dịch vụ không được truy cập trực tiếp được do đang trong mạng NAT.

- Table raw: 1 gói tin có thể thuộc một kết nối mới hoặc cũng có thể là của 1 một kết nối đã tồn tại. Table raw cho phép bạn làm việc với gói tin trước khi kernel kiểm tra trạng thái gói tin.

  • Chains.

Mỗi table được tạo với một số chains nhất định. Chains cho phép lọc gói tin tại các điểm khác nhau. Iptable có thể thiết lập với các chains sau:

- Chain PREROUTING: Các rule thuộc chain này sẽ được áp dụng ngay khi gói tin vừa vào đến Network interface. Chain này chỉ có ở table NAT, raw và mangle.

- Chain INPUT: Các rule thuộc chain này áp dụng cho các gói tin ngay trước khi các gói tin được vào hệ thống. Chain này có trong 2 table mangle và filter.

- Chain OUTPUT: Các rule thuộc chain này áp dụng cho các gói tin ngay khi gói tin đi ra từ hệ thống. Chain này có trong 3 table là raw, mangle và filter.

- Chain FORWARD: Các rule thuộc chain này áp dụng cho các gói tin chuyển tiếp qua hệ thống. Chain này chỉ có trong 2 table mangle và table.

- Chain POSTROUTING: áp dụng cho các gói tin đi network interface. Chain này có trong 2 table mangle và NAT.

Hình sau mô tả chi tiết thứ tự xử lý các table và các chain trong flow xử lý gói tin:

  • Target.

Target hiểu đơn giản là các hành động áp dụng cho các gói tin. Đối với những gói tin đúng theo rule mà chúng ta đặt ra thì các hành động (TARGET) có thể thực hiện được đó là:

– ACCEPT: chấp nhận gói tin, cho phép gói tin đi vào hệ thống.

– DROP: loại bỏ gói tin, không có gói tin trả lời, giống như là hệ thống không tồn tại.

– REJECT: loại bỏ gói tin nhưng có trả lời table gói tin khác, ví dụ trả lời table 1 gói tin “connection reset” đối với gói TCP hoặc bản tin “destination host unreachable” đối với gói UDP và ICMP.

- LOG: chấp nhận gói tin nhưng có ghi lại log.

Gói tin sẽ đi qua tất cả các rule chứ không dừng lại khi đã đúng với 1 rule đặt ra. Đối với những gói tin không khớp với rule nào cả mặc định sẽ được chấp nhận.

3.Các rule trong Iptable

Để xem các rule đang có trong iptables, dùng lệnh:  

iptables -L -v

TARGET    PROT   OPT  IN   OUT   SOURCE     DESTINATION

ACCEPT    all    --   lo   any   anywhere   anywhere

ACCEPT    all    --   any  any   anywhere   anywhere    ctstate  RELATED,ESTABLISHED

ACCEPT    tcp    --   any  any   anywhere   anywhere    tcp      dpt:ssh

ACCEPT    tcp    --   any  any   anywhere   anywhere    tcp      dpt:http

ACCEPT    tcp    --   any  any   anywhere   anywhere    tcp      dpt:https

DROP      all    --   any  any   anywhere   anywhere

Ý nghĩa của từng cột như sau:

  • TARGET: Hành động sẽ thực thi.
  • PROT: Là viết tắt của chữ Protocol, nghĩa là giao thức. Tức là các giao thức sẽ được áp dụng để thực thi quy tắc này. Ở đây chúng ta có 3 lựa chọn là all, tcp hoặc udp. Các ứng dụng như SSH, FTP, sFTP,..đều sử dụng giao thức kiểu TCP.
  • IN: chỉ ra rule sẽ áp dụng cho các gói tin đi vào từ interface nào, chẳng hạn như lo, eth0, eth1 hoặc any là áp dụng cho tất cả interface.
  • OUT: Tương tự như IN, chỉ ra rule sẽ áp dụng cho các gói tin đi ra từ interface nào.
  • DESTINATION: Địa chỉ của lượt truy cập được phép áp dụng quy tắc.

Để dễ hiểu hơn, mình giải thích các quy tắc ở table trên cho các bạn:

ACCEPT    all    --   lo   any   anywhere   anywhere

Chấp nhận toàn bộ gói tin từ interface lo, lo ở đây nghĩa là “Loopback Interface“, là interface ảo nội bộ, chẳng hạn như IP 127.0.0.1 là kết nối qua thiết bị này.

ACCEPT    all    --   any  any   anywhere   anywhere    ctstate  RELATED,ESTABLISHED

Chấp nhận toàn bộ gói tin của kết nối hiện tại. Nghĩa là khi bạn đang ở trong SSH và sửa đổi lại Firewall, nó sẽ không đá bạn ra khỏi SSH nếu bạn không thỏa mãn quy tắc.

ACCEPT    tcp    --   any  any   anywhere   anywhere    tcp      dpt:ssh

Chấp nhận toàn bộ gói tin của giao thức SSH ở bất cứ interface nào, với bất kể IP nguồn và đích là bao nhiêu. Mặc định sẽ hiển thị dpt:ssh để biểu diễn cổng 22 của SSH, nếu bạn đổi SSH thành cổng khác thì sẽ hiển thị số cổng.

ACCEPT    tcp    --   any  any   anywhere   anywhere    tcp      dpt:http

Cho phép kết nối vào cổng 80, mặc định sẽ biểu diễn thành chữ http.

ACCEPT    tcp    --   any  any   anywhere   anywhere    tcp      dpt:https

Cho phép kết nối vào cổng 443, mặc định nó sẽ biểu diễn thành chữ https.

DROP      all    --   any  any   anywhere   anywhere

Loại bỏ tất cả các gói tin nếu không khớp với các rule ở trên.

Giờ nếu bạn muốn thêm một rule mới thì làm thế nào? Sau đây là một số tùy chọn khi bạn thực hiện.

4.Các tùy chọn

  • Các tùy chọn để chỉ định thông số

chỉ định tên table: -t ,

ví dụ -t filter, -t nat, .. nếu không chỉ định table, giá trị mặc định là filter table

chỉ đinh loại giao thức: -p ,

ví dụ -p tcp, -p udp hoặc -p ! udp để chỉ định các giao thức không phải là udp

chỉ định card mạng vào: -i ,

ví dụ: -i eth0, -i lo

chỉ định card mạng ra: -o ,

ví dụ: -o eth0, -o pp0

chỉ định địa chỉ IP nguồn: -s <địa_chỉ_ip_nguồn>,

ví dụ: -s 192.168.0.0/24 (mạng 192.168.0 với 24 bít mạng), -s 192.168.0.1-192.168.0.3 (các IP 192.168.0.1, 192.168.0.2, 192.168.0.3).

chỉ định địa chỉ IP đích: -d <địa_chỉ_ip_đích>, tương tự như -s

chỉ định cổng nguồn: --sport ,

ví dụ: –sport 21 (cổng 21), --sport 22:88 (các cổng 22 .. 88), --sport 0 (các cổng <=80), –sport 22: (các cổng >=22)

chỉ định cổng đích: --dport , tương tự như --sport

  • Các tùy chọn để thao tác với chain

– tạo chain mới: iptables -N

– xóa hết các rule đã tạo trong chain: iptables -X

– đặt chính sách cho các chain `built-in` (INPUT, OUTPUT & FORWARD): iptables -P , ví dụ: iptables -P INPUT ACCEPT để chấp nhận các packet vào chain INPUT

– liệt kê các rule có trong chain: iptables -L

– xóa các rule có trong chain (flush chain): iptables -F

– reset bộ đếm packet về 0: iptables -Z

  • Các tùy chọn để thao tác với rule

– thêm rule: -A (append)

– xóa rule: -D (delete)

– thay thế rule: -R (replace)

– chèn thêm rule: -I (insert)

5.Một số lệnh cơ bản

  • Tạo một rule mới

iptables -A INPUT -i lo -j ACCEPT

Lệnh này có nghĩa là:

-A INPUT: khai báo kiểu kết nối sẽ được áp dụng (A nghĩa là Append).

-i lo: Khai báo thiết bị mạng được áp dụng (i nghĩa là Interface).

-j ACCEPT: khai báo hành động sẽ được áp dụng cho quy tắc này (j nghĩa là Jump).

Gõ lại lệnh iptables -L -v bạn sẽ thấy 1 rule mới xuất hiện

after-created-iptables-rule

Sau khi thêm mới hoặc thay đổi bất cứ gì, hãy gõ lệnh lưu và khởi động lại iptables để áp đặt các thay đổi.

service iptables save

service iptables restart

Tiếp tục bây giờ chúng ta thêm một rule mới để cho phép lưu lại các kết nối hiện tại để tránh hiện tượng tự block bạn ra khỏi máy chủ.

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Cho phép các cổng được truy cập từ bên ngoài vào qua giao thức tcp: SSH(22), HTTP(80), HTTPS(443)

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

-p tcp: Giao thức được áp dụng (tcp, udp, all)

--dport 22: Cổng cho phép áp dụng. 22 là cho SSH

Và cuối cùng, chặn toàn bộ các kết nối truy cập từ bên ngoài vào không thỏa mãn những rule trên. Tương ứng với rule 5 ở trên.

iptables -A INPUT -j DROP

Đến đây cơ bản bạn đã có đủ các qui tắt cần thiết để thiết lập các chính sách của bạn cho hệ thống,

  • Bổ sung một rule mới

Nếu bạn muốn chèn 1 rule mới vào 1 vị trí (hàng) nào đó, ví dụ là vị trí thứ 2. Thì bạn hãy thay tham số -A table tham số INSERT -I.

iptables -I INPUT 2 -p tcp --dport 8080 -j ACCEPT

  • Xóa 1 rule

Để xóa 1 rule mà bạn đã tạo ra tại vị trí 4, ta sẽ sử dụng tham số -D

iptables -D INPUT 4

Xóa toàn bộ các rule chứa hành động DROP có trong iptables:

iptables -D INPUT -j DROP

Nhớ gõ lại lệnh kiểm tra lệnh xóa thành công hay không nhé.

Ở bài sau, VCCloud sẽ đưa ra một số ví dụ cụ thể hơn trong việc dùng iptables tạo tường lửa cho server, đồng thời cũng sẽ giải thích cụ thể từng ví dụ, giúp các bạn hiểu kỹ hơn về các rule của iptables.

>> Xem tiếp: Tìm hiểu về Iptables (phần 2)