Hướng dẫn mở port Firewall trên VPS Linux

Tác giả: Tran Thao 10 tháng 05, 2025

Tường lửa là lớp bảo vệ cốt lõi cho VPS Linux, kiểm soát lưu lượng mạng vào ra. Để các dịch vụ như web hay SSH hoạt động, bạn cần mở các port cụ thể trên tường lửa. Linux cung cấp các công cụ phổ biến như iptables, nftables, firewalldUFW để thực hiện điều này. Bài viết này sẽ hướng dẫn chi tiết cách mở port với từng công cụ đó.

Lưu ý: chỉ mở những port thực sự cần thiết để đảm bảo an toàn cho VPS của bạn.

Mục lục

  1. Trước khi bắt đầu
  2. Mở port với iptables
  3. Mở port với nftables
  4. Mở port với firewalld
  5. Mở port với UFW
  6. Kết luận

Trước khi bắt đầu

Để xác định công cụ tường lửa (firewall) nào đang hoạt động trên VPS Linux của bạn, bạn cần kiểm tra trạng thái của các dịch vụ hoặc xem các quy tắc đang được áp dụng trong nhân (kernel). Việc này rất quan trọng vì mỗi công cụ có cú pháp lệnh khác nhau.

Gợi ý theo hệ điều hành

  • Ubuntu/Debian: Thường sử dụng UFW hoặc có thể cấu hình trực tiếp bằng iptables/nftables.
  • CentOS/RHEL/Fedora: Thường sử dụng firewalld. Trên các phiên bản mới hơn, firewalld sử dụng nftables làm backend.
  • Các bản phân phối mới hơn: Có thể sử dụng nftables làm mặc định hoặc cho phép lựa chọn giữa các công cụ.

Lưu ý quan trọng về quyền quản trị

Tất cả các lệnh cấu hình tường lửa đều yêu cầu quyền quản trị (root). Hãy đảm bảo bạn:

  • Đăng nhập với quyền root, hoặc
  • Sử dụng lệnh sudo trước mỗi lệnh.

Nếu bạn không có quyền quản trị, các lệnh sẽ không thực thi được và có thể gây lỗi hoặc không có tác dụng.

Kiểm tra công cụ tường lửa đang hoạt động

Cách hiệu quả nhất là kiểm tra trạng thái của các công cụ phổ biến theo thứ tự:

Kiểm tra firewalld

firewalld là mặc định trên nhiều bản phân phối như CentOS/RHEL/Fedora.

Để kiểm tra trạng thái dịch vụ firewalld, bash:

sudo firewall-cmd --state

  • Kết quả running cho thấy firewalld đang hoạt động.
  • Nếu lệnh không tồn tại hoặc báo lỗi khác, firewalld có thể không được cài đặt hoặc không chạy.

Kiểm tra UFW

UFW thường là mặc định hoặc phổ biến trên các bản phân phối dựa trên Debian/Ubuntu.

Để kiểm tra trạng thái dịch vụ UFW, bash:

sudo ufw status

  • Nếu bạn nhận được kết quả như Status: active, thì UFW đang được sử dụng.
  • Nếu lệnh không được nhận diện hoặc báo lỗi, có thể UFW chưa được cài đặt hoặc không chạy.

Kiểm tra iptables (nếu firewalld và UFW không hoạt động)

Nếu cả firewalld và UFW đều không hoạt động, hệ thống có thể đang sử dụng iptables trực tiếp.

Để xem các quy tắc hiện tại, bash:

sudo iptables -L -n

  • Nếu lệnh này trả về danh sách các quy tắc đang hoạt động, thì iptables đang được sử dụng để quản lý tường lửa.
  • Nếu không có quy tắc nào được hiển thị hoặc lệnh báo lỗi, có thể iptables không được sử dụng hoặc không có quy tắc nào được tải.

Để kiểm tra trạng thái dịch vụ nftables (nếu có), bash:

sudo systemctl status iptables

Lưu ý: iptables quản lý các quy tắc trong nhân Linux. Các quy tắc này có thể được tải khi khởi động hệ thống thông qua các script hoặc dịch vụ khác nhau, không nhất thiết phải có một dịch vụ tên là iptables chạy (systemctl status iptables có thể không phải lúc nào cũng đúng).

Kiểm tra nftables

nftables là framework tường lửa mới hơn và có thể được sử dụng trực tiếp.

Để xem các quy tắc hiện tại, bash:

sudo nft list ruleset

  • Nếu lệnh này trả về một bộ quy tắc (ruleset), thì nftables đang được sử dụng.
  • Nếu không có kết quả hoặc báo lỗi, nftables có thể không được sử dụng hoặc không có quy tắc nào được tải.

Để kiểm tra trạng thái dịch vụ nftables (nếu có), bash:

sudo systemctl status nftables

  • Nếu dịch vụ đang chạy, nftables đang được sử dụng.

Kiểm tra các dịch vụ tường lửa đang hoạt động

Để liệt kê tất cả các dịch vụ đang hoạt động, bash:

sudo systemctl list-units --type=service --state=active

  • Tìm kiếm các dịch vụ liên quan đến tường lửa như iptables, nftables, firewalld, ufw.

Quan trọng: Nếu sau khi thực hiện tất cả các bước kiểm tra trên mà bạn không thấy bất kỳ công cụ tường lửa nào hoạt động và có quy tắc được áp dụng, hệ thống của bạn có thể không có tường lửa bảo vệ — đây là một tình huống rất nguy hiểm và bạn nên cài đặt, kích hoạt một công cụ tường lửa ngay lập tức.

Mở port với iptables

Kiểm tra các quy tắc hiện tại

Để xem danh sách các quy tắc iptables hiện tại, bash:

sudo iptables -L -n -v

Cách mở port với iptables

Mở một port cụ thể (ví dụ: port 8080)

Để cho phép lưu lượng TCP đến port 8080, bash:

sudo iptables -I INPUT -p tcp --dport 8080 -j ACCEPT

Nếu bạn muốn mở port UDP, bash:

sudo iptables -I INPUT -p udp --dport 8080 -j ACCEPT

  • Thay 8080 bằng số port bạn muốn mở.

Mở nhiều port cùng lúc

Để mở nhiều port, bạn có thể sử dụng module multiport:

sudo iptables -I INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT

Hoặc để mở một dải port (ví dụ: 1000-2000), bash:

sudo iptables -I INPUT -p tcp --dport 1000:2000 -j ACCEPT

  • Thay 1000:2000 bằng dải port bạn muốn mở.

Mở port cho một địa chỉ IP cụ thể

Để chỉ cho phép một IP truy cập vào port 22 (SSH), bash:

sudo iptables -I INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT

  • Thay 192.168.1.100 bằng địa chỉ IP bạn muốn cho phép.

Lưu và áp dụng cấu hình iptables

Sau khi thêm các quy tắc, bạn cần lưu lại để chúng có hiệu lực sau khi khởi động lại hệ thống.

Trên CentOS/RHEL:

Bash:

sudo service iptables save

Trên Ubuntu/Debian:

Nếu gói iptables-persistent cần cài đặt:

sudo apt update && sudo apt install iptables-persistent netfilter-persistent

Bash:

sudo netfilter-persistent save

Xóa quy tắc đã thêm

Xóa theo đặc tả, bash:

sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT

Xóa theo số dòng:

Để liệt kê quy tắc, bash:

sudo iptables -L INPUT -n --line-numbers

Ví dụ, để xóa quy tắc ở dòng số 5 trong chuỗi INPUT, bash:

sudo iptables -D INPUT 5

Lưu ý: Số dòng có thể thay đổi nếu các quy tắc khác bị thêm hoặc xóa.

Lưu ý quan trọng

  • Thứ tự quy tắc: iptables xử lý các quy tắc theo thứ tự từ trên xuống. Vì vậy, bạn nên chèn quy tắc mới vào đầu chuỗi để đảm bảo chúng được áp dụng trước.
    • Nếu bạn chỉ muốn thêm quy tắc vào cuối danh sách, dùng -A INPUT
    • Bạn có thể dùng -I INPUT [số_dòng] để chèn quy tắc vào một vị trí cụ thể (ví dụ: -I INPUT 5).
  • Kiểm tra kỹ trước khi áp dụng: Sai sót trong cấu hình iptables có thể khiến bạn mất kết nối SSH đến VPS. Hãy kiểm tra kỹ các quy tắc trước khi áp dụng.

Mở port với nftables

Đảm bảo nftables đang chạy

Bash:

sudo systemctl status nftables
sudo systemctl start nftables
sudo systemctl enable nftables

Tạo bảng và chuỗi (nếu chưa có)

Nếu bạn chưa có bảng và chuỗi, hãy tạo chúng:

Tạo một bảng mới có tên filter:

sudo nft add table inet filter

  • add table inet filter: Tạo bảng filter trong family inet, nghĩa là nó hoạt động cho cả IPv4 và IPv6.
  • Family inet giúp quản lý quy tắc tường lửa một cách thống nhất cho cả hai giao thức.

Tạo một chuỗi (chain) có tên input trong bảng filter:

sudo nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }

  • add chain inet filter input: Tạo chuỗi input trong bảng filter.
  • type filter hook input priority 0:
    • type filter: Đây là một chuỗi lọc gói tin.
    • hook input: Áp dụng cho gói tin đi vào hệ thống.
    • priority 0: Độ ưu tiên của chuỗi (có thể điều chỉnh nếu cần).
  • policy drop: Mặc định chặn tất cả gói tin, trừ khi có quy tắc cho phép.

Kiểm tra các quy tắc hiện tại

Để xem danh sách các quy tắc nftables hiện tại, bash:

sudo nft list ruleset

Cách mở port với nftables

Mở một port cụ thể (ví dụ: port 8080)

Để cho phép lưu lượng TCP đến port 8080, bash:

sudo nft add rule inet filter input tcp dport 8080 accept

Nếu bạn muốn mở port UDP, bash:

sudo nft add rule inet filter input udp dport 8080 accept

  • Thay 8080 bằng số port bạn muốn mở.

Mở nhiều port cùng lúc

Để mở nhiều port cùng lúc, bash:

sudo nft add rule inet filter input tcp dport { 80, 443, 8080 } accept

Hoặc để mở một dải port (ví dụ: 1000-2000), bash:

sudo nft add rule inet filter input tcp dport 1000-2000 accept

  • Thay 1000-2000 bằng dải port bạn muốn mở.

Mở port cho một địa chỉ IP cụ thể

Tương tự iptables, bạn có thể giới hạn IP nguồn được phép kết nối đến một port.

Để chỉ cho phép một IP cụ thể truy cập vào port 22 (SSH):

sudo nft add rule inet filter input ip saddr 192.168.1.100 tcp dport 22 accept

  • Thay 192.168.1.100 bằng địa chỉ IP bạn muốn cho phép.
  • Sử dụng ip6 saddr cho địa chỉ IPv6.

Lưu và áp dụng cấu hình nftables

Sau khi thêm các quy tắc, bạn cần lưu lại để chúng có hiệu lực sau khi khởi động lại hệ thống:

sudo nft list ruleset > /etc/nftables.conf

Đảm bảo rằng dịch vụ nftables sẽ tải cấu hình này khi khởi động:

sudo systemctl enable nftables

Lưu ý: Đường dẫn file cấu hình có thể hơi khác trên một số bản phân phối, nhưng /etc/nftables.conf là phổ biến.

Xóa quy tắc đã thêm

Để liệt kê quy tắc trong chuỗi input với handle, bash:

sudo nft --handle list ruleset inet filter input

Ví dụ, để xóa quy tắc ở handle số 5, bash:

sudo nft delete rule inet filter input handle 5

Lưu ý quan trọng

  • Chính sách mặc định: Trong ví dụ trên, chuỗi input có chính sách mặc định là drop, nghĩa là tất cả lưu lượng không được phép rõ ràng sẽ bị chặn. Hãy đảm bảo bạn đã cho phép tất cả các port cần thiết để tránh mất kết nối.
  • Thử nghiệm cẩn thận: Luôn kiểm tra kỹ các thay đổi cấu hình tường lửa và cân nhắc thử nghiệm trên môi trường ít rủi ro trước khi áp dụng cho các hệ thống quan trọng.

Mở port với firewalld

Kiểm tra zone đang hoạt động

Bash:

sudo firewall-cmd --get-default-zone
sudo firewall-cmd --get-active-zones

  • Thông thường, zone mặc định là public.

Kiểm tra các port đã mở

Để kiểm tra các port đã được mở trong zone public, bash:

sudo firewall-cmd --zone=public --list-ports

Để kiểm tra các dịch vụ đã được mở trong zone public, bash:

sudo firewall-cmd --zone=public --list-services

Để xem toàn bộ thông tin của zone, bash:

sudo firewall-cmd --zone=public --list-all

Cách mở port với firewalld

Mở một port cụ thể (ví dụ: port 8080)

Để mở port 8080 cho giao thức TCP trong zone public, bash:

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

Để mở port cho giao thức UDP, bash:

sudo firewall-cmd --zone=public --add-port=8080/udp --permanent
sudo firewall-cmd --reload

  • Thay 8080 bằng số port bạn muốn mở.

Mở nhiều port cùng lúc

Bạn có thể mở nhiều port bằng cách lặp lại lệnh với các port khác nhau:

sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

Để mở một dải port (ví dụ: 1000-2000), bash:

sudo firewall-cmd --zone=public --add-port=1000-2000/tcp --permanent
sudo firewall-cmd --reload

  • Thay 1000-2000 bằng dải port bạn muốn mở.

Mở port bằng tên dịch vụ

Để xem danh sách các dịch vụ có sẵn, bash:

sudo firewall-cmd --get-services

Để mở port bằng tên dịch vụ (ví dụ: SSH), bash:

sudo firewall-cmd --zone=public --add-service=ssh --permanent

  • Thay ssh bằng tên dịch vụ bạn muốn mở.

Xóa port hoặc dịch vụ đã thêm

Để đóng port TCP 8080, bash:

sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload

Để đóng dịch vụ SSH, bash:

sudo firewall-cmd --zone=public --remove-service=ssh --permanent
sudo firewall-cmd --reload

Lưu ý quan trọng

  • Luôn dùng --permanent--reload: Đây là quy trình chuẩn để đảm bảo thay đổi tồn tại sau khi khởi động lại và có hiệu lực ngay lập tức.
  • Zone phù hợp: Đảm bảo rằng bạn đang thêm quy tắc vào zone phù hợp với giao diện mạng của bạn.
  • Thận trọng với SSH: Nếu cấu hình qua SSH, hãy kiểm tra kỹ lệnh để tránh tự khóa mình ngoài VPS.

Mở port với UFW

Kiểm tra trạng thái và các quy tắc UFW

Để kiểm tra trạng thái của UFW và các quy tắc hiện tại, bash:

sudo ufw status verbose

Để xem danh sách các ứng dụng được UFW hỗ trợ, bash:

sudo ufw app list

Thiết lập chính sách mặc định

Để thiết lập chính sách mặc định để từ chối tất cả các kết nối đến và cho phép tất cả các kết nối đi, bash:

sudo ufw default deny incoming
sudo ufw default allow outgoing

Cách mở port với UFW

Mở một port cụ thể (ví dụ: port 8080)

Để mở port 8080 cho giao thức TCP, bash:

sudo ufw allow 8080/tcp

Để mở port cho giao thức UDP, bash:

sudo ufw allow 8080/udp

  • Thay 8080 bằng số port bạn muốn mở.

Mở nhiều port cùng lúc

Bạn có thể mở nhiều port bằng cách lặp lại lệnh với các port khác nhau:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp

Để mở một dải port (ví dụ: 1000-2000), bash:

sudo ufw allow 1000:2000/tcp

  • Thay 1000:2000 bằng dải port bạn muốn mở.
  • Lưu ý: Khi chỉ định phạm vi cổng, bạn phải chỉ định giao thức (tcp hoặc udp).

Mở port cho một địa chỉ IP cụ thể

Để chỉ cho phép một IP cụ thể truy cập vào port 22 (SSH):

sudo ufw allow from 192.168.1.100 to any port 22

  • Thay 192.168.1.100 bằng địa chỉ IP bạn muốn cho phép.

Mở port bằng tên dịch vụ

Để mở port bằng tên dịch vụ (ví dụ: SSH), bash:

sudo ufw allow ssh

  • Thay ssh bằng tên dịch vụ bạn muốn mở.

Xóa quy tắc đã thêm

Để xem các quy tắc có đánh số, bash:

sudo ufw status numbered

Ví dụ, để xóa quy tắc theo số dòng số 5, bash:

sudo ufw delete 5

Lưu ý quan trọng

  • Lưu cấu hình tự động: Một ưu điểm lớn của UFW là mọi quy tắc bạn thêm bằng lệnh ufw allow, ufw deny, v.v., đều được lưu tự động và sẽ tồn tại sau khi VPS khởi động lại. Bạn không cần thực hiện bước lưu thủ công.
  • Cảnh báo khi bật UFW qua SSH: Nếu bạn đang kết nối tới VPS qua SSH, khi chạy lệnh sudo ufw enable lần đầu tiên, UFW sẽ cảnh báo rằng điều này có thể làm gián đoạn kết nối hiện tại. Hãy chắc chắn rằng bạn đã thêm quy tắc cho phép port SSH trước khi bật UFW để tránh bị mất quyền truy cập.
  • Chính sách mặc định: Nếu bạn thiết lập chính sách mặc định là từ chối các kết nối đến (ví dụ: ufw default deny incoming), đảm bảo bạn đã cho phép tất cả các port cần thiết để tránh mất kết nối.

Kết luận

Việc mở port là thiết yếu để các dịch vụ của bạn hoạt động, nhưng luôn đi kèm với yêu cầu bảo mật nghiêm ngặt. Hãy lựa chọn công cụ phù hợp với kinh nghiệm và bản phân phối Linux của bạn. Quan trọng nhất, chỉ mở những port thực sự cần thiết và thường xuyên kiểm tra cấu hình tường lửa để đảm bảo an toàn tối đa cho VPS của mình.