Cách liệt kê và xóa các quy tắc tường lửa iptables | Rule Iptable

cach liet ke va xoa cac quy tac tuong lua iptables

Iptables là một tường lửa đóng vai trò thiết yếu trong bảo mật mạng của hầu hết các hệ thống Linux. Nó có nhiều quy tắc tường lửa iptables. Trong khi nhiều hướng dẫn về iptables sẽ chỉ cho bạn cách tạo các quy tắc tường lửa để bảo vệ máy chủ, bài viết này sẽ tập trung vào một khía cạnh khác của quản lý tường lửa: liệt kê và xóa các quy tắc.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách thực hiện các tác vụ sau với iptables:

  • Liệt kê quy tắc
  • Xóa bộ đếm gói tin và kích thước byte
  • Xóa quy tắc
  • Xóa sạch các chuỗi (xóa tất cả các quy tắc trong một chuỗi)
  • Xóa sạch tất cả các chuỗi và bảng, xóa toàn bộ chuỗi, và chấp nhận toàn bộ lưu lượng

Lưu ý: Khi làm việc với tường lửa, hãy cẩn thận để không tự khóa mình ra khỏi máy chủ bằng cách chặn lưu lượng SSH (cổng: 22, theo mặc định). Nếu bạn mất quyền truy cập do cài đặt tường lửa, có thể bạn sẽ cần kết nối qua bảng điều khiển ngoài kênh để khắc phục.

Điều Kiện Tiên Quyết

Hướng dẫn này giả định rằng bạn đang sử dụng một máy chủ Linux có lệnh iptables được cài đặt, và người dùng của bạn có quyền sudo.

Nếu bạn cần trợ giúp với bước cài đặt ban đầu này, hãy tham khảo hướng dẫn Thiết Lập Máy Chủ Ban Đầu với Ubuntu 20.04. Hướng dẫn cũng có sẵn cho DebianCentOS.

Liệt Kê Quy Tắc theo Chi Tiết

Hãy cùng xem cách liệt kê các quy tắc trước. Có hai cách khác nhau để xem các quy tắc iptables đang hoạt động:

  • Dưới dạng bảng
  • Dưới dạng danh sách các chi tiết quy tắc

Cả hai phương pháp đều cung cấp thông tin tương tự nhau nhưng ở định dạng khác nhau.

Để liệt kê tất cả các quy tắc iptables đang hoạt động theo chi tiết, hãy chạy lệnh iptables với tùy chọn -S:

sudo iptables -S

Output

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N ICMP
-N TCP
-N UDP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
...

Như bạn có thể thấy, kết quả hiển thị trông giống như các lệnh đã được sử dụng để tạo ra các quy tắc, nhưng không có phần lệnh iptables đứng trước. Nó cũng tương tự như các tệp cấu hình quy tắc iptables, nếu bạn đã từng sử dụng iptables-persistent hoặc iptables save.

Liệt Kê Một Chuỗi Cụ Thể

Nếu bạn muốn giới hạn kết quả chỉ cho một chuỗi cụ thể (INPUT, OUTPUT, TCP, v.v.), bạn có thể chỉ định tên chuỗi ngay sau tùy chọn -S. Ví dụ, để hiển thị tất cả các chi tiết quy tắc trong chuỗi TCP, hãy chạy lệnh sau:

sudo iptables -S TCP

Output

-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

Liệt Kê Quy Tắc dưới Dạng Bảng

Việc hiển thị các quy tắc iptables dưới dạng bảng có thể hữu ích để so sánh các quy tắc với nhau.
Để xuất tất cả các quy tắc iptables đang hoạt động dưới dạng bảng, hãy chạy lệnh iptables với tùy chọn -L:

sudo iptables -L

Lệnh này sẽ xuất tất cả các quy tắc hiện tại được sắp xếp theo chuỗi.

Nếu bạn muốn giới hạn kết quả cho một chuỗi cụ thể (INPUT, OUTPUT, TCP, v.v.), bạn có thể chỉ định tên chuỗi ngay sau tùy chọn -L.

Hãy cùng xem ví dụ về chuỗi INPUT:

sudo iptables -L INPUT

Output

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere             ctstate INVALID
UDP        udp  --  anywhere             anywhere             ctstate NEW
TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
ICMP       icmp --  anywhere             anywhere             ctstate NEW
REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset
REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable

Dòng đầu tiên của kết quả hiển thị cho biết tên của chuỗi (INPUT, trong trường hợp này), theo sau là chính sách mặc định của nó (DROP). Dòng tiếp theo bao gồm tiêu đề của mỗi cột trong bảng, và theo sau đó là các quy tắc của chuỗi.
Hãy cùng tìm hiểu ý nghĩa của từng tiêu đề:

  • target: Nếu một gói tin khớp với quy tắc, mục tiêu (target) chỉ định hành động cần thực hiện với nó. Ví dụ, gói tin có thể được chấp nhận, loại bỏ, ghi nhật ký, hoặc chuyển sang một chuỗi khác để so sánh với các quy tắc khác.
  • prot: Giao thức, chẳng hạn như tcp, udp, icmp, hoặc all.
  • opt: Hiếm khi được sử dụng; cột này chỉ ra các tùy chọn IP.
  • source: Địa chỉ IP nguồn hoặc subnet của lưu lượng, hoặc anywhere.
  • destination: Địa chỉ IP đích hoặc subnet của lưu lượng, hoặc anywhere.

Cột cuối cùng, không có nhãn, chỉ ra các tùy chọn của quy tắc – tức là bất kỳ phần nào của quy tắc không được thể hiện ở các cột trước đó. Điều này có thể bao gồm từ cổng nguồn và đích đến trạng thái kết nối của gói tin.

Hiển Thị Số Lượng Gói Tin và Kích Thước Tích Lũy

Khi liệt kê các quy tắc iptables, bạn cũng có thể hiển thị số lượng gói tin và tổng kích thước (tính bằng byte) của các gói tin khớp với từng quy tắc cụ thể.
Điều này rất hữu ích khi bạn muốn có một ước lượng sơ bộ về các quy tắc đang khớp với lưu lượng. Để làm điều đó, hãy sử dụng kết hợp các tùy chọn -L và -v.

Ví dụ, hãy xem lại chuỗi INPUT với tùy chọn -v:

sudo iptables -L INPUT -v

Output

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 284K   42M ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
    0     0 DROP       all  --  any    any     anywhere             anywhere             ctstate INVALID
  396 63275 UDP        udp  --  any    any     anywhere             anywhere             ctstate NEW
17067 1005K TCP        tcp  --  any    any     anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
 2410  154K ICMP       icmp --  any    any     anywhere             anywhere             ctstate NEW
  396 63275 REJECT     udp  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable
 2916  179K REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-proto-unreachable
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED

Lưu ý rằng kết quả liệt kê bây giờ có thêm hai cột: pkts và bytes.

Đặt Lại Bộ Đếm Gói Tin và Kích Thước Tích Lũy

Nếu bạn muốn xóa (đặt về 0) bộ đếm gói tin và kích thước byte cho các quy tắc của mình, hãy sử dụng tùy chọn -Z.
Các bộ đếm này cũng sẽ được đặt lại khi máy chủ khởi động lại. Điều này hữu ích nếu bạn muốn kiểm tra xem máy chủ có nhận lưu lượng mới khớp với các quy tắc hiện có hay không.

Để xóa bộ đếm cho tất cả các chuỗi và quy tắc, chỉ cần sử dụng tùy chọn -Z một mình:

sudo iptables -Z

Để xóa bộ đếm cho tất cả các quy tắc trong một chuỗi cụ thể, hãy sử dụng tùy chọn -Z và chỉ định tên chuỗi. Ví dụ, để xóa bộ đếm của chuỗi INPUT, hãy chạy lệnh:

sudo iptables -Z INPUT

Nếu bạn muốn xóa bộ đếm cho một quy tắc cụ thể, chỉ định tên chuỗi và số thứ tự của quy tắc đó. Ví dụ, để đặt lại bộ đếm cho quy tắc đầu tiên trong chuỗi INPUT, hãy chạy:

sudo iptables -Z INPUT 1

Bây giờ, khi bạn đã biết cách đặt lại bộ đếm gói tin và kích thước byte của iptables, hãy cùng xem hai phương pháp để xóa các quy tắc.

Xóa Quy Tắc theo Chi Tiết

Một trong những cách để xóa quy tắc iptables là dựa trên chi tiết quy tắc.
Để làm điều này, bạn chạy lệnh iptables với tùy chọn -D kèm theo chi tiết của quy tắc.
Nếu bạn muốn xóa quy tắc bằng phương pháp này, bạn có thể dùng kết quả xuất từ lệnh liệt kê quy tắc (iptables -S) làm trợ giúp.

Ví dụ, nếu bạn muốn xóa quy tắc loại bỏ các gói tin đến không hợp lệ
(-A INPUT -m conntrack --ctstate INVALID -j DROP), bạn có thể chạy lệnh:

sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP

Lưu ý rằng tùy chọn -A (được sử dụng để chỉ định vị trí của quy tắc khi tạo) không được đưa vào lệnh

Xóa Quy Tắc theo Chuỗi và Số Thứ Tự

Cách khác để xóa quy tắc iptables là theo chuỗi và số thứ tự dòng của quy tắc.
Để xác định số thứ tự của một quy tắc, hãy liệt kê các quy tắc dưới dạng bảng và thêm tùy chọn –line-numbers:

sudo iptables -L --line-numbers

Output

Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
2    ACCEPT     all  --  anywhere             anywhere
3    DROP       all  --  anywhere             anywhere             ctstate INVALID
4    UDP        udp  --  anywhere             anywhere             ctstate NEW
5    TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
6    ICMP       icmp --  anywhere             anywhere             ctstate NEW
7    REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable
8    REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset
9    REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable
10   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED
...

Điều này thêm số thứ tự dòng cho mỗi quy tắc, được chỉ định bởi tiêu đề num.

Khi bạn đã biết quy tắc nào muốn xóa, hãy ghi nhận chuỗi và số thứ tự của quy tắc đó. Sau đó, chạy lệnh iptables -D kèm theo chuỗi và số thứ tự.

Ví dụ, nếu bạn muốn xóa quy tắc INPUT loại bỏ các gói tin không hợp lệ (quy tắc số 3 của chuỗi INPUT), hãy chạy:

sudo iptables -D INPUT 3

Bây giờ, khi bạn đã biết cách xóa các quy tắc tường lửa riêng lẻ, hãy cùng tìm hiểu cách xóa sạch các chuỗi quy tắc.

Xóa Sạch Các Chuỗi

Iptables cung cấp một cách để xóa tất cả các quy tắc trong một chuỗi (hay “xóa sạch” một chuỗi).
Phần này sẽ trình bày các phương pháp khác nhau để thực hiện điều đó.

Cảnh báo: Hãy cẩn thận để không tự khóa mình ra khỏi máy chủ qua SSH khi xóa sạch một chuỗi có chính sách mặc định là drop hoặc deny. Nếu điều đó xảy ra, bạn có thể cần kết nối qua bảng điều khiển để khắc phục.

Xóa Sạch Một Chuỗi Cụ Thể

Để xóa sạch một chuỗi cụ thể – tức là xóa tất cả các quy tắc trong chuỗi đó – bạn sử dụng tùy chọn -F (hoặc –flush) cùng với tên chuỗi.

Ví dụ, để xóa tất cả các quy tắc trong chuỗi INPUT, hãy chạy

sudo iptables -F INPUT

Xóa Sạch Tất Cả Các Chuỗi

Để xóa sạch tất cả các chuỗi (xóa toàn bộ các quy tắc tường lửa), bạn chỉ cần sử dụng tùy chọn -F một mình:

sudo iptables -F

Xóa sạch tất cả các quy tắc, Xóa toàn bộ các chuỗi, và Chấp nhận tất cả

Phần này sẽ hướng dẫn bạn cách xóa sạch toàn bộ các quy tắc tường lửa, bảng và chuỗi, đồng thời cho phép toàn bộ lưu lượng mạng.

Cảnh báo: Thao tác này sẽ vô hiệu hóa tường lửa của bạn. Bạn chỉ nên thực hiện phần này nếu muốn thiết lập lại cấu hình tường lửa từ đầu.

Đầu tiên, hãy đặt chính sách mặc định cho từng chuỗi tích hợp sẵn thành ACCEPT. Lý do chính để làm điều này là đảm bảo rằng bạn sẽ không bị khóa ra khỏi máy chủ thông qua SSH:

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

Sau đó, xóa sạch bảng nat và mangle, xóa sạch tất cả các chuỗi (-F), và xóa tất cả các chuỗi không mặc định (-X):

sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X

Bây giờ, tường lửa của bạn sẽ cho phép toàn bộ lưu lượng mạng. Nếu bạn liệt kê các quy tắc hiện có, bạn sẽ thấy không còn quy tắc nào, chỉ còn lại ba chuỗi mặc định (INPUT, FORWARD, và OUTPUT).

Kết Luận

Sau khi hoàn thành hướng dẫn này, bạn đã biết cách liệt kê và xóa các quy tắc tường lửa iptables.

Hãy nhớ rằng mọi thay đổi với iptables qua lệnh iptables chỉ mang tính tạm thời và cần được lưu lại để tồn tại qua các lần khởi động lại máy chủ. Việc này được đề cập trong phần Lưu Quy Tắc của hướng dẫn Quy Tắc Tường Lửa và Lệnh Thông Dụng.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *