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 Debian và CentOS.
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.