Thiết lập tường lửa là bước quan trọng để bảo mật trong các hệ điều hành hiện đại. Hầu hết các bản phân phối Linux đều tích hợp sẵn nhiều công cụ cấu hình tường lửa. Trong hướng dẫn này, chúng ta sẽ tập trung vào Iptables Firewall.
Iptables là tường lửa tiêu chuẩn mặc định trong phần lớn bản phân phối Linux. Nó cung cấp giao diện dòng lệnh cho các hook netfilter
ở cấp nhân (kernel) nhằm quản lý ngăn xếp mạng. Cơ chế hoạt động là so khớp từng gói tin đi qua giao diện mạng với một tập quy tắc để quyết định hành động cần thực hiện.
Trong hướng dẫn này, bạn sẽ tìm hiểu cách Iptables Firewall hoạt động.
Cách hoạt động của Iptables
Trước tiên, chúng ta điểm qua một số thuật ngữ và tìm hiểu cách hoạt động của iptables.
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 quy tắc. Các quy tắc này xác định đặc điểm gói tin cần khớp và hành động áp dụng khi khớp.
Có nhiều yếu tố để xác định gói tin nào khớp với quy tắc. Bạn có thể so khớp theo loại giao thức của gói tin, địa chỉ nguồn hoặc đích, cổng nguồn hoặc cổng đích, giao diện đang sử dụng, mối quan hệ với các gói tin trước đó, và nhiều yếu tố khác.
Khi khớp với mẫu đã định nghĩa, hành động thực thi gọi là target. Một target có thể là quyết định gói tin được ACCEPT
hay DROP
. Nó cũng có thể chuyển gói tin sang một chain khác để xử lý, hoặc ghi log lại lần xử lý đó. Có nhiều tùy chọn khác nhau.
Các quy tắc được nhóm lại thành chain. Một chain là một tập hợp các quy tắc mà gói tin sẽ được kiểm tra lần lượt. Khi gói tin khớp với một quy tắc, nó sẽ thực thi hành động đi kèm và bỏ qua các quy tắc còn lại trong chain.
Người dùng có thể tạo chain tùy nhu cầu. Ba chain mặc định là:
- INPUT: xử lý tất cả các gói tin được gửi tới máy chủ.
- OUTPUT: chứa các quy tắc xử lý lưu lượng do máy chủ tạo ra.
- FORWARD: xử lý lưu lượng chuyển tiếp tới máy khác, không phát sinh từ máy chủ. Chain này là cách để cấu hình máy chủ định tuyến các yêu cầu đến những máy khác.
Mỗi chain có thể chứa không hoặc nhiều quy tắc và bao gồm một chính sách mặc định. Chính sách này quyết định điều gì sẽ xảy ra khi một gói tin đi qua toàn bộ 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ể chọn ACCEPT
hoặc DROP
đối với các gói tin này.
Ngoài ra, iptables cũng có khả năng theo dõi kết nối. Điều này cho phép bạn tạo quy tắc để định nghĩa điều gì sẽ xảy ra với một gói tin dựa trên mối quan hệ của nó với các gói tin trước đó. Khả năng này được gọi là “theo dõi trạng thái”, “theo dõi kết nối”, hoặc cấu hình “state machine”.
IPv4 So Với IPv6
Tường lửa netfilter tích hợp trong nhân Linux xử lý riêng biệt lưu lượng IPv4 và IPv6. Các công cụ Iptables dùng để quản lý các bảng quy tắc tường lửa cũng được tách biệt. Khi máy chủ của bạn kích hoạt IPv6, bạn phải cấu hình đồng thời cả hai bảng để xử lý lưu lượng.
Lưu ý: Nftables, phiên bản kế thừa của Iptables, cho phép xử lý IPv4 và IPv6 gắn kết hơn. Bạn có thể sử dụng lệnh iptables-translate
để chuyển đổi các quy tắc Iptables sang Nftables.
Lệnh iptables
thường được dùng để quản lý bảng quy tắc kiểm soát lưu lượng IPv4. Đối với IPv6, lệnh đi kèm là ip6tables
.
Các quy tắc thiết lập bằng iptables
chỉ tác động đến gói tin sử dụng địa chỉ IPv4, mặc dù cú pháp của cả hai lệnh đều giống nhau. Lệnh iptables
áp dụng cho lưu lượng IPv4, trong khi lệnh ip6tables
áp dụng cho lưu lượng IPv6. Khi tạo quy tắc với ip6tables
, bạn phải sử dụng địa chỉ IPv6 của máy chủ.
Những điều cần ghi nhớ
Giờ đây khi bạn đã biết cách iptables
xử lý các gói tin đi qua giao diện của nó, bạn có thể bắt đầu tạo quy tắc. Cụ thể, iptables
sẽ chuyển gói tin tới chuỗi phù hợp, kiểm tra lần lượt với từng quy tắc cho đến khi có quy tắc khớp. Nếu không tìm thấy quy tắc nào, nó sẽ áp dụng chính sách mặc định của chuỗi.
Trước tiên, hãy bảo đảm có các quy tắc giữ cho các kết nối hiện tại tiếp tục hoạt động nếu bạn triển khai chính sách mặc định là drop. Điều này đặc biệt quan trọng nếu bạn kết nối tới máy chủ thông qua SSH. Nếu vô tình áp dụng quy tắc hoặc chính sách khiến kết nối hiện tại bị ngắt, bạn có thể sẽ phải đăng nhập lại vào máy chủ bằng trình duyệt thông qua bảng điều khiển khôi phục.
Một điều khác cần ghi nhớ là thứ tự của các quy tắc trong mỗi chain có ý nghĩa quan trọng. Gói tin không nên bị một quy tắc tổng quát chặn mất trước khi có cơ hội khớp với quy tắc cụ thể hơn.
Vì lý do này, các quy tắc nằm gần đầu chain phải có mức độ cụ thể cao hơn so với các quy tắc ở cuối chain. Bạn nên xử lý các trường hợp cụ thể trước, rồi mới thêm các quy tắc tổng quát hơn để bao quát các mẫu rộng hơn. Nếu một gói tin đi hết toàn bộ chain mà không khớp với bất kỳ quy tắc nào, nó sẽ tuân theo quy tắc tổng quát nhất, tức là 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ẽ các loại quy tắc được đưa vào chain.
Nếu chain có chính sách mặc định là ACCEPT, nó thường chứa các quy tắc bổ sung để chặn gói tin cụ thể. Ngược lại, một chain mặc định là DROP sẽ bao gồm các quy tắc ngoại lệ cho những gói tin cần được chấp nhận.
Kết luận
Đến đây, bạn đã có thể triển khai tường lửa cho riêng mình.
Để làm điều này, bạn nên đọc bài viết “Cách thiết lập tường lửa bằng Nftables trên Ubuntu 22.04”.