Chuyển tới nội dung chính

Cài Đặt và Cấu Hình Tường Lửa iptables trên Linux

Giới Thiệu

iptables là một tiện ích dòng lệnh mạnh mẽ cho phép quản trị viên hệ thống cấu hình các quy tắc lọc gói IP của tường lửa nhân Linux. Nó đóng vai trò thiết yếu trong việc bảo vệ máy chủ Linux bằng cách kiểm soát lưu lượng mạng vào, ra và đi qua hệ thống. Mặc dù có vẻ phức tạp ban đầu, việc nắm vững iptables là một kỹ năng quan trọng để đảm bảo an ninh mạng cho môi trường Linux của bạn.

Trong hướng dẫn này, chúng ta sẽ đi qua các bước cài đặt và cấu hình iptables với các quy tắc cơ bản để bảo vệ hệ thống của bạn.

📋 Thời gian: Khoảng 20 phút | Độ khó: Cơ bản

Yêu Cầu

Để thực hiện theo hướng dẫn này, bạn cần:

  • Một máy chủ hoặc máy ảo chạy hệ điều hành Linux (ví dụ: Ubuntu, Debian, CentOS, Fedora).
  • Quyền truy cập root hoặc tài khoản người dùng có quyền sudo.
  • Kiến thức cơ bản về dòng lệnh Linux.
  • Kết nối Internet để tải các gói phần mềm.

Các Bước Thực Hiện

Bước 1: Kiểm tra trạng thái iptables

Trước khi bắt đầu, hãy kiểm tra xem iptables đã được cài đặt và có quy tắc nào đang hoạt động trên hệ thống của bạn chưa.

# Liệt kê tất cả các quy tắc hiện có
sudo iptables -L -n -v

Nếu bạn thấy danh sách các quy tắc, iptables đã được cài đặt. Nếu không, hoặc nếu lệnh không tìm thấy, bạn cần cài đặt nó.

Bước 2: Cài đặt iptables (nếu cần)

Việc cài đặt iptables khác nhau tùy thuộc vào bản phân phối Linux bạn đang sử dụng.

Trên Debian/Ubuntu:

# Cập nhật danh sách gói
sudo apt update

# Cài đặt gói iptables
sudo apt install iptables

Trên CentOS/RHEL/Fedora:

# Cài đặt gói iptables-services
# Đối với CentOS/RHEL 7 trở về trước, hoặc các phiên bản Fedora cũ hơn
sudo yum install iptables-services

# Đối với CentOS/RHEL 8+ hoặc Fedora mới hơn, dùng dnf
# sudo dnf install iptables-services

Sau khi cài đặt, bạn có thể cần kích hoạt và khởi động dịch vụ iptables trên CentOS/RHEL/Fedora:

sudo systemctl enable iptables
sudo systemctl start iptables

Bước 3: Xóa các quy tắc hiện có (Tùy chọn)

⚠️ Cảnh báo: Bước này sẽ xóa tất cả các quy tắc iptables đang hoạt động. Nếu bạn đang kết nối qua SSH, bạn có thể bị mất kết nối nếu không có quy tắc cho phép. Hãy thực hiện cẩn thận hoặc đảm bảo bạn có quyền truy cập console vật lý.

# Xóa tất cả các quy tắc trong tất cả các chain
sudo iptables -F

# Xóa tất cả các chain không mặc định
sudo iptables -X

# Đặt lại bộ đếm gói và byte về 0
sudo iptables -Z

# Đặt chính sách mặc định về ACCEPT đư tránh bị khóa nếu bạn đang SSH
# Chúng ta sẽ thay đổi nó sau
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

Bước 4: Thiết lập chính sách mặc định (Default Policies)

Chính sách mặc định xác định hành vi của tường lửa đối với các gói không khớp với bất kỳ quy tắc nào. Để tăng cường bảo mật, chúng ta thường đặt chính sách mặc định là DROP cho các kết nối đến (INPUT) và chuyển tiếp (FORWARD), và ACCEPT cho các kết nối đi (OUTPUT).

  • INPUT: Các gói đến máy chủ.
  • FORWARD: Các gói đi qua máy chủ đến mạng khác (nếu máy chủ hoạt động như một router).
  • OUTPUT: Các gói đi từ máy chủ ra ngoài.
# Đặt chính sách mặc định cho INPUT chain là DROP (từ chối tất cả các kết nối đến)
sudo iptables -P INPUT DROP

# Đặt chính sách mặc định cho FORWARD chain là DROP (từ chối tất cả các kết nối chuyển tiếp)
sudo iptables -P FORWARD DROP

# Đặt chính sách mặc định cho OUTPUT chain là ACCEPT (cho phép tất cả các kết nối đi ra)
sudo iptables -P OUTPUT ACCEPT

Sau khi thực hiện lệnh này, hệ thống của bạn sẽ từ chối mọi kết nối đến trừ khi bạn thêm quy tắc cụ thể để cho phép chúng.

Bước 5: Cho phép các kết nối đã thiết lập và liên quan

Đây là một quy tắc cực kỳ quan trọng. Nó cho phép các gói tin thuộc về một kết nối đã được thiết lập (ví dụ: phản hồi cho một yêu cầu mà máy chủ của bạn đã gửi đi) hoặc các kết nối liên quan (như FTP data connections) được đi qua.

# Cho phép các gói tin của kết nối đã thiết lập (ESTABLISHED) hoặc liên quan (RELATED) đi vào
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

conntrack (connection tracking) là một module kernel giúp theo dõi trạng thái của các kết nối mạng.

Bước 6: Cho phép Loopback Interface

Giao diện loopback (lo) được sử dụng cho các giao tiếp nội bộ trong máy chủ (ví dụ: một ứng dụng giao tiếp với một dịch vụ khác trên cùng máy chủ). Việc cho phép nó là cần thiết cho hoạt động bình thường của nhiều ứng dụng.

# Cho phép tất cả lưu lượng trên giao diện loopback
sudo iptables -A INPUT -i lo -j ACCEPT

Bước 7: Mở các cổng dịch vụ cần thiết

Bây giờ, bạn cần mở các cổng cụ thể cho các dịch vụ mà máy chủ của bạn cung cấp. 💡 Mẹo: Chỉ mở các cổng mà bạn thực sự cần để giảm thiểu bề mặt tấn công.

Ví dụ:

  • SSH (Port 22): Cho phép kết nối SSH để quản lý máy chủ.
    sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  • HTTP (Port 80): Cho phép truy cập web nếu bạn có máy chủ web.
    sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  • HTTPS (Port 443): Cho phép truy cập web an toàn (SSL/TLS).
    sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  • Ping (ICMP): Cho phép phản hồi yêu cầu ping (tùy chọn).
    sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Sau khi thêm các quy tắc, hãy kiểm tra lại bằng lệnh:

sudo iptables -L -n -v

Thành công: Bạn sẽ thấy các quy tắc mới của mình trong danh sách.

Bước 8: Lưu các quy tắc iptables

Các quy tắc iptables được thiết lập bằng lệnh chỉ có hiệu lực cho đến khi hệ thống khởi động lại. Để các quy tắc này tồn tại vĩnh viễn, bạn cần lưu chúng.

Trên Debian/Ubuntu (sử dụng iptables-persistent):

# Cài đặt gói iptables-persistent
sudo apt install iptables-persistent

# Khi cài đặt, nó sẽ hỏi bạn có muốn lưu các quy tắc hiện tại không. Chọn Yes.
# Hoặc lưu thủ công:
sudo netfilter-persistent save

Các quy tắc sẽ được lưu vào /etc/iptables/rules.v4 (IPv4) và /etc/iptables/rules.v6 (IPv6).

Trên CentOS/RHEL/Fedora (sử dụng iptables-services):

# Lưu các quy tắc hiện tại
sudo service iptables save
# Hoặc trên các hệ thống mới hơn
# sudo /usr/libexec/iptables/iptables.init save

Các quy tắc sẽ được lưu vào /etc/sysconfig/iptables.

Phương pháp chung (tạo script khởi động): Bạn có thể lưu các quy tắc vào một tệp và tạo một dịch vụ systemd hoặc thêm vào /etc/rc.local để khôi phục chúng khi khởi động.

# Lưu quy tắc vào một tệp (ví dụ: /etc/iptables/rules.v4)
sudo mkdir -p /etc/iptables
sudo iptables-save > /etc/iptables/rules.v4

Để khôi phục khi khởi động, bạn cần một script hoặc dịch vụ systemd để chạy:

sudo iptables-restore < /etc/iptables/rules.v4

Bạn có thể tạo một dịch vụ systemd đơn giản để tự động hóa việc này.

Troubleshooting

  • Bị khóa khỏi SSH sau khi cấu hình:

    • ⚠️ Đây là lỗi phổ biến nhất. Nếu bạn thiết lập chính sách DROP cho INPUT trước khi cho phép cổng SSH, bạn sẽ bị mất kết nối.
    • Giải pháp: Truy cập máy chủ qua console vật lý (nếu có) hoặc qua bảng điều khiển của nhà cung cấp dịch vụ đám mây.
    • Chạy sudo iptables -F để xóa tất cả các quy tắc và mở lại truy cập (tạm thời). Sau đó, cẩn thận thêm quy tắc SSH trước khi thiết lập chính sách DROP.
    • Kiểm tra log sudo journalctl -xe hoặc /var/log/syslog để xem gói nào bị từ chối.
  • Dịch vụ không hoạt động sau khi cấu hình iptables:

    • Kiểm tra lại danh sách quy tắc bằng sudo iptables -L -n -v. Đảm bảo rằng cổng dịch vụ của bạn đã được mở.
    • Kiểm tra xem quy tắc DROP có nằm trước quy tắc ACCEPT của dịch vụ đó không (thứ tự quy tắc rất quan trọng).
    • Kiểm tra log của dịch vụ để xem có lỗi nào liên quan đến mạng không.
  • Quy tắc không được lưu sau khi khởi động lại:

    • Đảm bảo bạn đã thực hiện đúng bước lưu quy tắc cho bản phân phối Linux của mình (Bước 8).
    • Xác minh rằng gói iptables-persistent (Debian/Ubuntu) hoặc iptables-services (CentOS/RHEL/Fedora) đã được cài đặt và kích hoạt đúng cách.
    • Kiểm tra tệp cấu hình nơi quy tắc được lưu (ví dụ: /etc/iptables/rules.v4 hoặc /etc/sysconfig/iptables) để đảm bảo chúng có mặt.

Kết Luận

iptables là một công cụ tường lửa mạnh mẽ và linh hoạt, cung cấp khả năng kiểm soát chi tiết đối với lưu lượng mạng trên hệ thống Linux của bạn. Bằng cách làm theo hướng dẫn này, bạn đã học cách cài đặt, cấu hình các quy tắc cơ bản và lưu chúng để đảm bảo an ninh liên tục.

Best Practices:

  • Nguyên tắc "ít nhất đặc quyền": Chỉ mở các cổng và cho phép lưu lượng mạng thực sự cần thiết. Mọi thứ khác nên bị từ chối (DROP).
  • Kiểm tra kỹ lưỡng: Luôn kiểm tra các quy tắc của bạn bằng sudo iptables -L -n -v sau khi thêm hoặc sửa đổi.
  • Sao lưu cấu hình: Luôn sao lưu các tệp cấu hình iptables của bạn.
  • Kiểm tra log: Thường xuyên kiểm tra log của tường lửa để phát hiện các nỗ lực truy cập trái phép hoặc sự cố.
  • Cẩn thận với DROP: Khi thiết lập chính sách DROP cho INPUT, hãy đảm bảo rằng bạn đã có quy tắc cho phép SSH hoặc bạn có quyền truy cập console.

Việc hiểu và sử dụng iptables hiệu quả là một phần quan trọng của việc quản trị hệ thống Linux an toàn.