Việc thiết lập một tường lửa là bước cần thiết để bảo vệ bất kỳ hệ điều hành hiện đại nào. hôm nay, chúng ta sẽ tập trung vào tường lửa Iptables (iptables firewall). Với hầu hết các bản phân phối Linux đều được tích hợp sẵn một vài công cụ tường lửa khác nhau để bạn có thể cấu hình tường lửa.
Iptables là tường lửa tiêu chuẩn được cài đặt mặc định trên hầu hết các bản phân phối Linux. Đây là một giao diện dòng lệnh cho các hook netfilter ở cấp độ kernel, cho phép bạn thao tác trên ngăn xếp mạng của Linux. Nó hoạt động bằng cách so sánh từng gói tin đi qua giao diện mạng với một tập hợp các quy tắc để quyết định xử lý gói tin đó.
Trong bài hướng dẫn này, bạn sẽ được tìm hiểu cách iptables hoạt động. Nếu bạn muốn đi sâu hơn, bạn có thể đọc thêm bài viết “Tìm Hiểu Chuyên Sâu Về Iptables và Kiến Trúc Netfilter”.
Cách Iptables Hoạt Động
Trước tiên, hãy xem qua một số thuật ngữ và cùng tìm hiểu cách iptables xử lý lưu lượng mạng.
Tường lửa iptables hoạt động bằng cách so sánh lưu lượng mạng với một tập hợp các quy tắc. Các quy tắc này định nghĩa các đặc điểm mà một gói tin cần có để khớp với quy tắc, cũng như hành động nào cần được thực hiện đối với các gói tin khớp.
Có rất nhiều tùy chọn để xác định xem gói tin nào khớp với một quy tắc cụ thể. Bạn có thể so sánh theo kiểu giao thức, địa chỉ hoặc cổng nguồn (source) hoặc đích (destination), giao diện được sử dụng, mối quan hệ của gói tin đó với các gói tin trước đó, và nhiều thứ khác.
Khi mẫu định nghĩa khớp, hành động được thực hiện được gọi là target (mục tiêu). Một target có thể là quyết định chính sách cuối cùng cho gói tin, chẳng hạn như ACCEPT (chấp nhận) hoặc DROP (loại bỏ). Nó cũng có thể chuyển gói tin sang một chuỗi (chain) khác để xử lý thêm hoặc ghi lại thông tin gặp phải. Có rất nhiều lựa chọn khác nhau.
Các quy tắc này được tổ chức thành các nhóm gọi là chains (chuỗi). Một chain là một tập hợp các quy tắc mà gói tin sẽ được kiểm tra theo thứ tự. Khi gói tin khớp với một trong các quy tắc, hành động liên quan được thực hiện và các quy tắc còn lại trong chain sẽ bị bỏ qua.
Người dùng có thể tạo thêm các chain tùy ý. Có ba chain được định nghĩa mặc định:
- INPUT: Chain này xử lý tất cả các gói tin được gửi đến máy chủ của bạn.
- OUTPUT: Chain này chứa các quy tắc cho lưu lượng do máy chủ của bạn tạo ra.
- FORWARD: Chain này được sử dụng để xử lý lưu lượng dành cho các máy chủ khác, lưu lượng không được tạo ra bởi máy chủ của bạn. Đây là cách để cấu hình máy chủ của bạn định tuyến các yêu cầu tới các máy khác.
Mỗi chain có thể chứa không hoặc nhiều quy tắc, và có một chính sách mặc định. Chính sách này xác định hành vi khi một gói tin đi qua tất cả các quy tắc trong chain mà không khớp với bất kỳ quy tắc nào. Bạn có thể cấu hình để DROP (loại bỏ) gói tin đó hoặc ACCEPT (chấp nhận) nếu không khớp với quy tắc nào.
Iptables cũng có khả năng theo dõi kết nối. Điều này có nghĩa là bạn có thể tạo các quy tắc xác định hành động đối với gói tin dựa trên mối quan hệ của nó với các gói tin trước đó. Tính năng này được gọi là “state tracking” (theo dõi trạng thái), “connection tracking” (theo dõi kết nối) hoặc cấu hình “state machine” (máy trạng thái).
IPv4 So Với IPv6
Tường lửa netfilter được tích hợp trong kernel Linux giữ lưu lượng IPv4 và IPv6 hoàn toàn riêng biệt. Các công cụ iptables dùng để thao tác trên các bảng chứa tập hợp quy tắc tường lửa cũng được phân chia riêng. Nếu máy chủ của bạn bật IPv6, bạn sẽ phải cấu hình cả hai bảng để xử lý lưu lượng.
Lưu ý: Nftables, người kế nhiệm của iptables, tích hợp việc xử lý IPv4 và IPv6 một cách chặt chẽ hơn. Lệnh iptables-translate
có thể được sử dụng để chuyển đổi các quy tắc iptables sang nftables.
Lệnh iptables thông thường được sử dụng để thao tác trên bảng quy tắc điều khiển lưu lượng IPv4. Đối với lưu lượng IPv6, có lệnh đồng hành gọi là ip6tables. Bất kỳ quy tắc nào bạn thiết lập với iptables chỉ ảnh hưởng đến các gói tin sử dụng địa chỉ IPv4, nhưng cú pháp giữa hai lệnh này là giống nhau. Lệnh iptables tạo ra các quy tắc áp dụng cho lưu lượng IPv4, và lệnh ip6tables tạo ra các quy tắc áp dụng cho lưu lượng IPv6. Đừng quên sử dụng địa chỉ IPv6 của máy chủ khi thiết lập quy tắc ip6tables.
Một Số Điều Cần Lưu Ý về Iptables firewall
Bây giờ, khi bạn đã hiểu cách iptables chỉ đạo các gói tin đi qua giao diện – chuyển gói tin vào chain thích hợp, kiểm tra theo từng quy tắc cho đến khi khớp, và áp dụng chính sách mặc định của chain nếu không có quy tắc nào khớp – bạn có thể bắt đầu tạo các quy tắc của riêng mình.
Trước hết, bạn cần đảm bảo rằng có các quy tắc giữ cho các kết nối hiện có không bị gián đoạn nếu bạn thiết lập chính sách mặc định DROP. Điều này đặc biệt quan trọng nếu bạn đang kết nối vào máy chủ qua SSH. Nếu bạn vô tình thiết lập một quy tắc hoặc chính sách làm gián đoạn kết nối hiện tại, bạn có thể sẽ phải đăng nhập vào máy chủ thông qua một giao diện phục hồi dựa trên trình duyệt.
Một điều nữa cần lưu ý là thứ tự của các quy tắc trong mỗi chain rất quan trọng. Một gói tin không được gặp phải một quy tắc tổng quát hơn mà nó có thể khớp nếu mục đích ban đầu là khớp với một quy tắc cụ thể hơn.
Vì vậy, các quy tắc ở đầu chain nên có mức độ cụ thể cao hơn so với các quy tắc ở cuối. Bạn nên kiểm tra các trường hợp cụ thể trước, sau đó mới có các quy tắc tổng quát hơn để khớp với các mẫu chung. Nếu một gói tin đi qua toàn bộ chain (không khớp với bất kỳ quy tắc nào), nó sẽ được xử lý theo quy tắc chung nhất, tức chính sách mặc định.
Chính vì vậy, chính sách mặc định của một chain sẽ quyết định mạnh mẽ loại quy tắc nào sẽ được bao gồm trong chain đó. Một chain có chính sách mặc định ACCEPT sẽ chứa các quy tắc chỉ rõ việc loại bỏ các gói tin. Ngược lại, một chain mặc định DROP sẽ chứa các ngoại lệ cho những gói tin cần được chấp nhận cụ thể.
Kết Luận
Tại thời điểm này, bạn đã sẵn sàng để triển khai tường lửa của riêng mình. Để thực hiện điều này, bạn có thể tham khảo bài viết “Cách Thiết Lập Tường Lửa Bằng Nftables Trên Ubuntu 22.04” nếu bạn muốn cách tiếp cận chi tiết hơn, hoặc “Cách Thiết Lập Tường Lửa Với UFW Trên Ubuntu” nếu bạn muốn cách tiếp cận ở mức cao hơn.