Tìm hiểu Iptables Các Quy Tắc và Lệnh hữu ích

iptables

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!

Mục lục nội dung

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

Iptables Utility firewall developed for Linux systems

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ủ

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *