Iptables là một phần mềm tường lửa dành riêng cho các bản phân phối Linux. Dưới đây là toàn bộ kiến thức về các lệnh iptables quan trọng nhất để xây dựng quy tắc tường lửa trong doan nghiệp để vận hành thàng ngày. Bên cạnh các lý thuyết cơ bản, tôi sẽ đưa ra thêm các ví dụ thực tiễn về allow và block iptables qua port, mạng hoặc địa chỉ IP.
Hướng dẫn nhanh về cách sử dụng bản hướng dẫn về Iptables này
Bài viết này tập trung vào việc xây dựng các quy tắc tường lửa trong môi trường sử dụng input policy là DROP. Tức là, mặc định, mọi lưu lượng truy cập đến sẽ bị chặn, trừ khi được chỉ định cho phép rõ ràng. Quy trình:
- Xác định nhu cầu cụ thể:
- Xác định rõ ràng dịch vụ hoặc loại lưu lượng truy cập nào bạn muốn cho phép.
- Ví dụ: cho phép truy cập SSH, HTTP, hoặc một dịch vụ tùy chỉnh trên một cổng cụ thể.
- Lựa chọn phần phù hợp:
- Tài liệu được chia thành các phần độc lập, mỗi phần giải quyết một tình huống cụ thể.
- Chọn phần phù hợp với nhu cầu bạn đã xác định ở bước 1.
- Ví dụ: nếu bạn muốn cho phép truy cập SSH, hãy xem phần liên quan đến SSH.
- Điều hướng nhanh chóng:
- Sử dụng menu nội dung (nếu có) hoặc chức năng tìm kiếm của trình duyệt để nhanh chóng tìm đến phần bạn cần.
- Giúp tiết kiệm thời gian và đảm bảo tìm kiếm đúng thông tin.
- Triển khai quy tắc:
- Sao chép và dán các ví dụ lệnh được cung cấp trong phần bạn chọn.
- Thay thế các giá trị được đánh dấu (ví dụ: địa chỉ IP, cổng) bằng các giá trị phù hợp với cấu hình hệ thống của bạn.
- Ví dụ thay vì 192.168.1.100, hãy thay bằng IP server của bạn.
- Kiểm tra và xác nhận:
- Sau khi thêm quy tắc, kiểm tra kỹ lưỡng để đảm bảo rằng dịch vụ được cho phép hoạt động như mong đợi.
- Sử dụng các công cụ kiểm tra kết nối (ví dụ:
telnet
,ssh
) để xác nhận.
Lưu ý:
- Sử dụng chính sách DROP mặc định giúp tăng cường bảo mật bằng cách chỉ cho phép lưu lượng truy cập cần thiết.
- Thay thế các giá trị trong ví dụ lệnh là bắt buộc để đảm bảo quy tắc hoạt động chính xác trên hệ thống.
- Hãy test kỹ các thay đổi trong môi trường test trước khi đưa vào Production.
Iptables save rules
Quy tắc iptables là tạm thời, tức là cần được lưu thủ công để duy trì sau khi khởi động lại. Trên Ubuntu, gói iptables-persistent
là một phương pháp để lưu trữ các rule này.
Cài đặt gói bằng lệnh sudo apt install iptables-persistent
. Trong quá trình cài đặt, hệ thống sẽ hỏi bạn có muốn lưu các quy tắc tường lửa hiện tại hay không. Sau khi cập nhật các quy tắc tường lửa, hãy chạy lệnh sudo netfilter-persistent save
để lưu các thay đổi. Các bản phân phối Linux khác có thể có các phương pháp thay thế để làm cho các thay đổi iptables của bạn trở thành vĩnh viễn.
Listing và delete iptables rule
Nội dung về listing và delete iptables rule khá phức tạp nên tôi đã viết 1 bài hướng dẫn riêng, mời bạn xem bài viết Các list và xóa rule của tường lửa Iptables.
Một số quy tắc chung bạn cần lưu ý
Cho phép kết nối Loopback
Giao diện loopback, còn được gọi là lo, là giao diện mà máy tính sử dụng để chuyển tiếp các kết nối mạng đến chính nó. Ví dụ: nếu bạn chạy ping localhost
hoặc ping 127.0.0.1
, máy chủ của bạn sẽ ping chính nó bằng loopback. Giao diện loopback cũng được sử dụng nếu bạn cấu hình máy chủ ứng dụng để kết nối với máy chủ cơ sở dữ liệu bằng địa chỉ localhost
. Do đó, bạn cần đảm bảo rằng tường lửa của bạn cho phép các kết nối này.
Để chấp nhận tất cả lưu lượng trên giao diện loopback, hãy chạy các lệnh sau:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
Cho phép các kết nối đến đã được thiết lập
Vì lưu lượng mạng thường cần hai chiều—đến và đi—để hoạt động bình thường, nên thông thường sẽ tạo một quy tắc tường lửa cho phép lưu lượng đến đã được thiết lập và liên quan, để máy chủ cho phép lưu lượng trả về cho các kết nối đi do chính máy chủ khởi tạo. Bạn sử dụng lệnh:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Cho phép các kết nối đi đã được thiết lập
Nếu bạn muốn cho phép lưu lượng đi của tất cả các kết nối đã được thiết lập, thường là phản hồi cho các kết nối đến hợp lệ, hãy sử dụng lệnh:
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
Cho phép mạng nội bộ truy cập mạng bên ngoài
Giả sử eth0
là mạng bên ngoài và eth1
là mạng nội bộ của bạn, lệnh này sẽ cho phép mạng nội bộ của bạn truy cập mạng bên ngoài:
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
Loại bỏ các gói tin không hợp lệ
Một số gói tin lưu lượng mạng được đánh dấu là không hợp lệ (invalid). Đôi khi, việc ghi nhật ký loại gói tin này có thể hữu ích, nhưng thường thì bạn chỉ cần loại bỏ chúng luôn. Sử dụng lệnh:
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
Chặn địa chỉ IP
Để chặn các kết nối mạng bắt nguồn từ một địa chỉ IP cụ thể, ví dụ: 203.0.113.51
, hãy chạy lệnh này:
sudo iptables -A INPUT -s 203.0.113.51 -j DROP
Chặn kết nối đến giao diện mạng
Để chặn kết nối từ một địa chỉ IP cụ thể, ví dụ: 203.0.113.51
, đến một giao diện mạng cụ thể, ví dụ: eth0
, sử dụng lệnh:
iptables -A INPUT -i eth0 -s 203.0.113.51 -j DROP
Cấu hình IPtables liên quan đến SSH
Nếu bạn đang sử dụng máy chủ không có console cục bộ, bạn có thể sẽ muốn cho phép các kết nối SSH đến (cổng 22) để có thể kết nối và quản lý máy chủ của mình.
Allow tất cả SSH đến
Sử dụng lệnh:
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối SSH đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cho phép SSH đến từ địa chỉ IP hoặc mạng con cụ thể
Để cho phép các kết nối SSH đến từ một địa chỉ IP hoặc mạng con cụ thể, hãy chỉ định nguồn. Ví dụ: nếu bạn muốn cho phép toàn bộ mạng con 203.0.113.0/24
, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Cho phép SSH đi
Nếu chính sách OUTPUT
của tường lửa không được đặt thành ACCEPT
và bạn muốn cho phép các kết nối SSH đi—máy chủ của bạn khởi tạo kết nối SSH đến một máy chủ khác—bạn có thể chạy các lệnh sau:
sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Cho Phép Rsync Đến từ Địa Chỉ IP hoặc Mạng Con Cụ Thể
Rsync, chạy trên cổng 873, có thể được sử dụng để truyền tệp từ máy tính này sang máy tính khác.
Để cho phép các kết nối rsync đến từ một địa chỉ IP hoặc mạng con cụ thể, hãy chỉ định địa chỉ IP nguồn và cổng đích.
Ví dụ: nếu bạn muốn cho phép toàn bộ mạng con 203.0.113.0/24
có thể rsync đến máy chủ của bạn, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối rsync đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cấu hình Iptables liên quan đến Web Server
Máy chủ web, chẳng hạn như Apache và Nginx, thường nhận các yêu cầu trên cổng 80 và 443 cho các kết nối HTTP và HTTPS, tương ứng. Nếu chính sách mặc định của bạn cho lưu lượng truy cập đến được đặt thành drop hoặc deny, hãy tạo các quy tắc cho phép máy chủ của bạn phản hồi các yêu cầu đó.
Cho phép tất cả HTTP đến
Để cho phép tất cả các kết nối HTTP (cổng 80) đến, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối HTTP đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cho phép tất cả HTTPS đến
Để cho phép tất cả các kết nối HTTPS (cổng 443) đến, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối HTTP đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cho phép tất cả HTTP và HTTPS đến
Nếu bạn muốn cho phép cả lưu lượng HTTP và HTTPS, bạn có thể sử dụng mô-đun multiport
để tạo một quy tắc cho phép cả hai cổng. Để cho phép tất cả các kết nối HTTP và HTTPS (cổng 443) đến, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối HTTP và HTTPS đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cấu hình Iptables cho MySQL
MySQL lắng nghe các kết nối máy khách trên cổng 3306. Nếu máy chủ cơ sở dữ liệu MySQL của bạn đang được sử dụng bởi một máy khách trên một máy chủ từ xa, hãy đảm bảo cho phép lưu lượng đó.
Cho phép MySQL từ địa chỉ IP hoặc mạng con cụ thể
Để cho phép các kết nối MySQL đến từ một địa chỉ IP hoặc mạng con cụ thể, hãy chỉ định nguồn. Ví dụ: nếu bạn muốn cho phép toàn bộ mạng con2 203.0.113.0/24
, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối MySQL đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cho phép MySQL đến giao diện mạng cụ thể
Để cho phép các kết nối MySQL đến một giao diện mạng cụ thể—ví dụ, bạn có một giao diện mạng riêng eth1
—hãy sử dụng các lệnh sau:
sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối MySQL đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cấu hình Ipatables cho PostgreSQL
PostgreSQL lắng nghe các kết nối máy khách trên cổng 5432. Nếu máy chủ cơ sở dữ liệu PostgreSQL của bạn đang được sử dụng bởi một máy khách trên một máy chủ từ xa, bạn cần đảm bảo cho phép lưu lượng đó.
PostgreSQL từ địa chỉ IP hoặc mạng con cụ thể
Để cho phép các kết nối PostgreSQL đến từ một địa chỉ IP hoặc mạng con cụ thể, hãy chỉ định nguồn. Ví dụ: nếu bạn muốn cho phép toàn bộ mạng con3 203.0.113.0/24
, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối PostgreSQL đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cho phép PostgreSQL đến giao diện mạng cụ thể
Để cho phép các kết nối PostgreSQL đến một giao diện mạng cụ thể—ví dụ, bạn có một giao diện mạng riêng eth1
—hãy sử dụng các lệnh sau:
sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối PostgreSQL đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cấu hình cho service Mail
Máy chủ mail, chẳng hạn như Sendmail và Postfix, lắng nghe trên nhiều cổng khác nhau tùy thuộc vào giao thức được sử dụng để phân phối mail. Nếu bạn đang chạy một máy chủ mail, hãy xác định giao thức bạn đang sử dụng và cho phép các loại lưu lượng thích hợp. Dưới đây là cách tạo một quy tắc để chặn mail SMTP đi.
Chặn Mail SMTP đi
Nếu máy chủ của bạn không nên gửi mail đi, bạn có thể muốn chặn loại lưu lượng đó. Để chặn mail SMTP đi, sử dụng cổng 25, hãy chạy lệnh sau:
sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT
Điều này cấu hình iptables để từ chối tất cả lưu lượng đi trên cổng 25. Nếu bạn cần từ chối một dịch vụ khác theo số cổng của nó, thay vì cổng 25, hãy thay thế số cổng đó cho 25
ở trên.
Cho phép tất cả SMTP đến
Để cho phép máy chủ của bạn phản hồi các kết nối SMTP trên cổng 25, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối SMTP đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cho phép tất cả IMAP đến
Để cho phép máy chủ của bạn phản hồi các kết nối IMAP, cổng 143, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối IMAP đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cho phép tất cả IMAPS đến
Để cho phép máy chủ của bạn phản hồi các kết nối IMAPS, cổng 993, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối IMAPS đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cho phép tất cả POP3 đến
Để cho phép máy chủ của bạn phản hồi các kết nối POP3, cổng 110, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối POP3 đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Cho phép tất cả POP3S đến
Để cho phép máy chủ của bạn phản hồi các kết nối POP3S, cổng 995, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Lệnh thứ hai, cho phép lưu lượng đi của các kết nối POP3 đã được thiết lập, chỉ cần thiết nếu chính sách OUTPUT
không được đặt thành ACCEPT
.
Để cho phép máy chủ của bạn phản hồi các kết nối POP3S, cổng 995, hãy chạy các lệnh sau:
sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Kết luận: Hy vọng hướng dẫn về cách sử dụng các rule trong Iptables này đã mang lại nhiều thông tin hữu ích cho bạn. Đăng ký nhận tin để được cập nhật nhiều kiến thức qua các bài viết mới của chúng tôi.
Bài viết cùng chủ đề: