Iptables là một phần mềm tường lửa được sử dụng phổ biến trên các bản phân phối Linux. Hướng dẫn dạng “cheat sheet” này cung cấp một tài liệu tham khảo nhanh cho các lệnh iptables nhằm tạo ra các quy tắc tường lửa hữu ích trong các tình huống thường gặp hàng ngày. Tài liệu bao gồm các ví dụ về việc cho phép và chặn các dịch vụ khác nhau dựa theo cổng, giao diện mạng và địa chỉ IP nguồn.
Hướng Dẫn Sử Dụng
- Hầu hết các quy tắc được mô tả ở đây giả định rằng iptables của bạn được thiết lập để DROP lưu lượng đến (thông qua chính sách INPUT mặc định) và bạn muốn cho phép lưu lượng đến một cách chọn lọc.
- Sử dụng các phần sau phù hợp với mục tiêu của bạn. Hầu hết các phần đều độc lập, không phụ thuộc lẫn nhau.
- Sử dụng menu Nội dung ở bên phải (trong trình duyệt màn hình rộng) hoặc chức năng tìm kiếm của trình duyệt để định vị các phần bạn cần.
- Sao chép và dán các ví dụ dòng lệnh được đưa ra, thay thế các giá trị được đánh dấu (highlighted) bằng thông tin của riêng bạn.
Hãy nhớ rằng thứ tự của các quy tắc là quan trọng. Tất cả các lệnh iptables ở đây sử dụng tùy chọn -A
để thêm quy tắc vào cuối chuỗi. Nếu bạn muốn chèn quy tắc vào vị trí khác trong chuỗi, bạn có thể sử dụng tùy chọn -I
cho phép bạn chỉ định vị trí của quy tắc mới (hoặc chèn vào đầu chuỗi nếu không chỉ định số thứ tự).
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 (mặc định là cổng 22). Nếu bạn mất kết nối do các thiết lập tường lửa, bạn có thể cần truy cập máy chủ qua giao diện dự phòng web (web-based console) để sửa đổi các quy tắc. Nếu bạn sử dụng DataOnline, hãy tham khảo tài liệu về Recovery Console để biết thêm chi tiết. Một cách khác là khởi động lại máy chủ nếu các quy tắc lưu trữ cho phép lưu lượng SSH.
Bạn có thể kiểm tra tập quy tắc iptables hiện tại bằng:
sudo iptables -S sudo iptables -L
Hãy cùng xem qua các lệnh iptables!
Lưu Quy Tắc
Các quy tắc iptables là tạm thời (ephemeral), có nghĩa là bạn cần lưu chúng thủ công để chúng tồn tại sau khi khởi động lại máy chủ.
Trên Ubuntu, một cách để lưu các quy tắc iptables là sử dụng gói iptables-persistent.
Cài đặt bằng lệnh:
sudo apt install iptables-persistent
Trong quá trình cài đặt, bạn sẽ được hỏi có muốn lưu các quy tắc tường lửa hiện tại hay không. Nếu bạn cập nhật các quy tắc và muốn lưu thay đổi, chạy:
sudo netfilter-persistent save
Các bản phân phối Linux khác có thể có cách lưu các thay đổi iptables khác. Hãy tham khảo tài liệu tương ứng để biết thêm chi tiết.
Liệt Kê và Xóa Các Quy Tắc
Nếu bạn muốn biết cách liệt kê và xóa các quy tắc iptables, hãy tham khảo bài hướng dẫn “Cách Liệt Kê Và Xóa Các Quy Tắc Tường Lửa Iptables.”
Các Quy Tắc Hữu Dụng Thông Dụng
Phần này bao gồm các lệnh iptables tạo ra các quy tắc hữu ích cho hầu hết các máy chủ.
Cho Phép Kết Nối Loopback
Giao diện loopback (còn gọi là lo
) được sử dụng để chuyển tiếp lưu lượng mạng tới chính máy đó. Ví dụ: khi bạn chạy ping localhost
hoặc ping 127.0.0.1
, máy chủ sẽ tự ping chính nó. Giao diện loopback cũng được dùng nếu bạn cấu hình ứng dụng kết nối đến cơ sở dữ liệu qua địa chỉ localhost. Vì vậy, bạn cần đảm bảo rằng tường lửa 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, chạy các lệnh:
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 Đã Thiết Lập và Liên Quan
Để lưu lượng mạng hoạt động hai chiều (vào và ra) hoạt động bình thường, bạn thường tạo quy tắc cho phép các kết nối đã thiết lập và liên quan, để máy chủ cho phép lưu lượng phản hồi cho các kết nối mà máy chủ đã khởi tạo.
Chạy lệnh sau:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Cho Phép Các Kết Nối Outgoing Đã Thiết Lập
Nếu bạn muốn cho phép lưu lượng ra của tất cả các kết nối đã thiết lập, chạy:
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
Cho Phép Mạng Nội Bộ Truy Cập Mạng Ngoài
Giả sử giao diện eth0
là mạng ngoài và eth1
là mạng nội bộ, chạy lệnh sau để cho phép máy trong mạng nội bộ truy cập Internet:
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 có thể bị đánh dấu là không hợp lệ. Bạn có thể muốn xóa chúng (hoặc ghi log trước khi xóa) bằng lệnh:
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
Chặn Một Địa Chỉ IP
Để chặn lưu lượng mạng xuất phát từ một địa chỉ IP cụ thể, ví dụ 203.0.113.51, chạy:
sudo iptables -A INPUT -s 203.0.113.51 -j DROP
Nếu bạn muốn từ chối (reject) kết nối thay vì chặn (drop), thay “DROP” bằng “REJECT”:
sudo iptables -A INPUT -s 203.0.113.51 -j REJECT
Chặn Kết Nối Đến Một Giao Diện Mạng
Để chặn các 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
), chạy:
iptables -A INPUT -i eth0 -s 203.0.113.51 -j DROP
Dịch vụ: SSH
Nếu bạn sử dụng máy chủ không có console cục bộ, bạn có thể muốn cho phép các kết nối SSH đến (mặc định là cổng 22) để quản trị máy chủ. Phần này hướng dẫn cách cấu hình tường lửa cho các quy tắc liên quan đến SSH.
Cho Phép Tất Cả Kết Nối SSH Đến
Để cho phép tất cả các kết nối SSH đến, chạy các lệnh sau:
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
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
Lệnh thứ hai cho phép lưu lượng ra của các kết nối SSH đã thiết lập và chỉ cần nếu chính sách OUTPUT không được đặt thành ACCEPT.
Cho Phép Kết Nối SSH Đến Từ Một Địa Chỉ IP hoặc Mạng Con Cụ Thể
Để cho phép kết nối SSH đến từ một địa chỉ IP hoặc mạng con cụ thể, chỉ định nguồn. Ví dụ, để cho phép toàn bộ mạng 203.0.113.0/24, chạy:
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
Lệnh thứ hai chỉ cần thiết nếu chính sách OUTPUT không được đặt thành ACCEPT.
Cho Phép Kết Nối SSH Outgoing
Nếu chính sách OUTPUT không đặt thành ACCEPT và bạn muốn cho phép các kết nối SSH ra (máy chủ khởi tạo kết nối SSH tới máy khác), chạy:
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 kết nối Rsync đến từ địa chỉ IP hoặc mạng con được chỉ định
Để cho phép các kết nối rsync đến từ một địa chỉ IP hoặc mạng con cụ thể, chỉ định nguồn và cổng đích (rsync sử dụng cổng 873). Ví dụ, cho phép toàn bộ mạng 203.0.113.0/24:
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 chỉ cần nếu OUTPUT không đặt thành ACCEPT.
Dịch vụ: Web Server
Các máy chủ web như Apache và Nginx thường lắng nghe các yêu cầu trên cổng 80 (HTTP) và 443 (HTTPS). Nếu chính sách INPUT của bạn đặt là DROP hoặc DENY, bạn cần tạo các quy tắc cho phép máy chủ phản hồi các yêu cầu đó.
Cho Phép Tất Cả Kết Nối HTTP Đến
Để cho phép tất cả các kết nối HTTP đến (cổng 80), chạy:
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
Cho Phép Tất Cả Kết Nối HTTPS Đến
Để cho phép tất cả các kết nối HTTPS đến (cổng 443), chạy:
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
Cho Phép Cùng Lúc Kết Nối HTTP và HTTPS
Nếu bạn muốn cho phép cả lưu lượng HTTP và HTTPS cùng lúc, bạn có thể dùng module multiport để tạo quy tắc cho cả hai cổng:
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
Dịch vụ: MySQL
MySQL lắng nghe các kết nối client trên cổng 3306. Nếu cơ sở dữ liệu MySQL của bạn được sử dụng bởi một client từ xa, bạn cần cho phép lưu lượng đó.
Cho Phép Kết Nối MySQL Đến Từ Mộ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ể (ví dụ: 203.0.113.0/24), chạy:
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
Cho Phép MySQL Kết Nối Tới Một Giao Diện Mạng Cụ Thể
Nếu bạn muốn cho phép các kết nối MySQL đến một giao diện mạng cụ thể (ví dụ, giao diện nội bộ eth1
), chạy:
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
Dịch vụ: PostgreSQL
PostgreSQL lắng nghe các kết nối trên cổng 5432. Nếu cơ sở dữ liệu PostgreSQL của bạn được sử dụng từ xa, bạn cần cho phép lưu lượng đó.
Cho Phép Kết Nối PostgreSQL Đến Từ Một Địa Chỉ IP hoặc Mạng Con Cụ Thể
Ví dụ, để cho phép toàn bộ mạng 203.0.113.0/24, chạy:
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
Cho Phép PostgreSQL Kết Nối Tới Một Giao Diện Mạng Cụ Thể
Nếu bạn muốn cho phép kết nối PostgreSQL đến một giao diện mạng cụ thể (ví dụ: eth1
), chạy:
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
Dịch vụ: Mail
Các máy chủ mail, như Sendmail và Postfix, lắng nghe trên nhiều cổng tùy thuộc vào giao thức sử dụng cho việc gửi mail. Nếu bạn chạy máy chủ mail, hãy xác định giao thức bạn sử dụng và cho phép lưu lượng phù hợp. Dưới đây là ví dụ về cách tạo quy tắc chặn mail SMTP gửi đi cũng như cho phép các kết nối mail đến.
Chặn Mail SMTP Gửi Đi
Nếu máy chủ của bạn không nên gửi mail đi, bạn có thể chặn lưu lượng đó. SMTP sử dụng cổng 25, chạy:
sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT
Lệnh trên cấu hình iptables từ chối (REJECT) tất cả lưu lượng TCP ra trên cổng 25. Nếu cần chặn dịch vụ khác, hãy thay số cổng 25 bằng số cổng đó.
Cho Phép Tất Cả Kết Nối SMTP Đến
Để cho phép máy chủ của bạn phản hồi các kết nối SMTP đến (cổng 25), chạy:
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 chỉ cần nếu chính sách OUTPUT không được đặt thành ACCEPT.
Cho Phép Tất Cả Kết Nối IMAP Đến
Để cho phép máy chủ phản hồi các kết nối IMAP (cổng 143), chạy:
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
Cho Phép Tất Cả Kết Nối IMAPS Đến
Để cho phép kết nối IMAPS (cổng 993), chạy:
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
Cho Phép Tất Cả Kết Nối POP3 Đến
Để cho phép phản hồi các kết nối POP3 (cổng 110), chạy:
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
Cho Phép Tất Cả Kết Nối POP3S Đến
Để cho phép kết nối POP3S (cổng 995), chạy:
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
Kết Luận
Những lệnh iptables được đưa ra ở trên bao gồm hầu hết các quy tắc thường dùng khi cấu hình tường lửa iptables. Tất nhiên, iptables là một công cụ rất linh hoạt nên bạn có thể kết hợp các lệnh với các tùy chọn (tham số) khác nhau để phù hợp với nhu cầu cụ thể của mình nếu chúng không được đề cập ở đây.
Nếu bạn cần trợ giúp trong việc xác định cách thiết lập tường lửa cho máy chủ của mình, hãy tham khảo bài viết “Làm Thế Nào Để Lựa Chọn Một Chính Sách Tường Lửa Hiệu Quả Nhằm Bảo Vệ Máy Chủ”