Hướng Dẫn Cấu Hình Tường Lửa Docker Swarm Trên CentOS 7

Chào bạn, Bùi Mạnh Đức đây! Trong thế giới công nghệ hiện đại, việc bảo vệ hạ tầng mạng là yếu tố sống còn. Tường lửa đóng vai trò như một người lính gác cổng tận tụy, kiểm soát mọi luồng truy cập vào và ra khỏi hệ thống của bạn. Đặc biệt, khi bạn triển khai một môi trường phức tạp như Docker Swarm, vai trò của tường lửa càng trở nên quan trọng hơn bao giờ hết. Việc vận hành một cụm container trên CentOS 7 mang lại nhiều lợi ích, nhưng cũng đi kèm những thách thức về bảo mật. Cấu hình sai một quy tắc tường lửa có thể mở ra cánh cửa cho các truy cập trái phép, gây nguy hiểm cho toàn bộ hệ thống. Bài viết này sẽ hướng dẫn bạn từng bước chi tiết để cấu hình tường lửa một cách chính xác, giúp bạn xây dựng một hàng rào bảo vệ vững chắc cho cụm Docker Swarm của mình. Chúng ta sẽ cùng nhau đi từ những khái niệm cơ bản, cài đặt firewalld, mở các cổng cần thiết, cho đến cách kiểm tra và bảo trì hệ thống một cách hiệu quả.

Hình minh họa

Trước khi đi sâu vào kỹ thuật, hãy cùng tìm hiểu về những nhân vật chính trong câu chuyện của chúng ta: Docker SwarmCentOS 7. Việc hiểu rõ vai trò và đặc điểm của chúng sẽ giúp bạn cấu hình hệ thống một cách tự tin và chính xác hơn.

Docker Swarm là gì và vai trò trong quản lý cụm container

Bạn có thể hình dung Docker Swarm như một “nhạc trưởng” tài ba. Thay vì phải quản lý từng container riêng lẻ trên nhiều máy chủ khác nhau, Docker Swarm giúp bạn hợp nhất chúng thành một cụm (cluster) duy nhất. Nó tự động điều phối, phân phối và cân bằng tải các container trên toàn bộ cụm, đảm bảo ứng dụng của bạn luôn hoạt động ổn định và có khả năng mở rộng linh hoạt.

Docker Swarm được tích hợp sẵn trong Docker Engine, giúp việc triển khai trở nên vô cùng đơn giản. Nó không chỉ quản lý vòng đời của container mà còn cung cấp các tính năng bảo mật tích hợp như mã hóa TLS giữa các node và quản lý secret. Điều này tạo ra một nền tảng vững chắc để bạn xây dựng các lớp bảo mật bổ sung, như tường lửa mà chúng ta sắp cấu hình.

Đặc điểm và ưu điểm của CentOS 7 trong triển khai Docker Swarm

Vậy tại sao chúng ta lại chọn CentOS 7 làm sân khấu cho “nhạc trưởng” Docker Swarm? CentOS 7, một bản phân phối Linux được xây dựng từ mã nguồn của Red Hat Enterprise Linux (RHEL), nổi tiếng về sự ổn định và bảo mật. Đây là lựa chọn hàng đầu cho các môi trường máy chủ yêu cầu độ tin cậy cao.

Một trong những ưu điểm lớn nhất của CentOS 7 là việc nó sử dụng firewalld làm công cụ quản lý tường lửa mặc định. Firewalld cung cấp một giao diện quản lý linh hoạt và mạnh mẽ, cho phép bạn tạo ra các vùng (zone) bảo mật khác nhau và áp dụng quy tắc một cách linh hoạt mà không cần khởi động lại dịch vụ. Sự kết hợp giữa tính ổn định của CentOS 7 và khả năng của firewalld tạo nên một môi trường lý tưởng để triển khai và bảo vệ cụm Docker Swarm của bạn.

Hình minh họa

Bây giờ, hãy bắt tay vào việc xây dựng hàng rào bảo vệ đầu tiên cho hệ thống của chúng ta. Công cụ chính chúng ta sử dụng là firewalld, một dịch vụ tường lửa mạnh mẽ và linh hoạt trên CentOS 7.

Cài đặt và khởi động dịch vụ firewalld

Trên hầu hết các phiên bản CentOS 7, firewalld đã được cài đặt sẵn. Tuy nhiên, để chắc chắn, bạn có thể chạy lệnh sau để cài đặt nó:

sudo yum install firewalld -y

Sau khi cài đặt xong, bạn cần khởi động dịch vụ và cho phép nó tự khởi động cùng hệ thống. Điều này đảm bảo tường lửa của bạn luôn hoạt động ngay cả khi máy chủ reboot.

sudo systemctl start firewalld
sudo systemctl enable firewalld

Để kiểm tra xem firewalld đã chạy hay chưa, bạn có thể dùng lệnh:

sudo systemctl status firewalld

Nếu bạn thấy dòng chữ active (running) màu xanh lá, xin chúc mừng, dịch vụ tường lửa đã sẵn sàng!

Hình minh họa

Thiết lập cấu hình tường lửa cơ bản cho Docker Swarm

Firewalld sử dụng khái niệm “vùng” (zone) để quản lý các quy tắc. Mỗi vùng có một mức độ tin cậy khác nhau. Mặc định, card mạng của bạn sẽ được gán vào vùng public. Bạn có thể tạo một vùng riêng cho Docker để quản lý các quy tắc dễ dàng hơn, nhưng trong khuôn khổ bài viết này, chúng ta sẽ áp dụng các quy tắc vào vùng public cho đơn giản.

Bước tiếp theo là mở các cổng và dịch vụ cần thiết. Ví dụ, nếu bạn cần truy cập SSH vào máy chủ, bạn cần đảm bảo dịch vụ SSH đã được cho phép.

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

Lệnh này cho phép lưu lượng truy cập qua cổng SSH một cách vĩnh viễn. Sau khi thêm bất kỳ quy tắc --permanent nào, bạn cần tải lại cấu hình để chúng có hiệu lực.

sudo firewall-cmd --reload

Đây là những bước cơ bản đầu tiên để làm quen với firewalld. Tiếp theo, chúng ta sẽ mở các cổng chuyên dụng cho Docker Swarm.

Thiết lập các cổng và giao thức cần thiết cho Docker Swarm

Để các node trong cụm Docker Swarm có thể “nói chuyện” với nhau và hoạt động một cách trơn tru, chúng ta cần mở một số cổng giao tiếp cụ thể trên tường lửa. Việc này giống như mở đúng cửa cho những người có phận sự ra vào, trong khi vẫn đóng chặt các lối đi khác.

Danh sách cổng cần mở cho Docker Swarm hoạt động ổn định

Dưới đây là các cổng quan trọng bạn cần mở trên tất cả các node trong cụm Swarm. Mỗi cổng có một vai trò riêng biệt:

  • TCP port 2377: Cổng này dùng cho việc quản lý cụm. Các node worker sử dụng cổng này để giao tiếp với node manager. Đây là cổng trái tim của Swarm.
  • TCP và UDP port 7946: Dùng cho việc giao tiếp giữa các node trong cụm. Nó giúp các node phát hiện và duy trì kết nối với nhau.
  • UDP port 4789: Dành cho lưu lượng mạng overlay. Khi bạn tạo một mạng overlay cho các service của mình, lưu lượng giữa các container trên các node khác nhau sẽ đi qua cổng này.

Ngoài ra, nếu bạn có các service muốn public ra ngoài, bạn cũng cần mở cổng tương ứng cho service đó. Ví dụ, nếu bạn chạy một web server ở cổng 80, bạn cần mở cổng 80 trên tường lửa.

Hình minh họa

Thực hiện mở cổng bằng lệnh firewalld

Bây giờ, hãy sử dụng firewalld-cmd để mở các cổng đã nêu ở trên. Tùy chọn --permanent rất quan trọng để đảm bảo các quy tắc này không bị mất sau khi khởi động lại máy chủ.

Thực hiện các lệnh sau trên tất cả các node (manager và worker):

# Mở cổng quản lý cụm
sudo firewall-cmd --permanent --zone=public --add-port=2377/tcp

# Mở cổng giao tiếp giữa các node
sudo firewall-cmd --permanent --zone=public --add-port=7946/tcp
sudo firewall-cmd --permanent --zone=public --add-port=7946/udp

# Mở cổng cho mạng overlay
sudo firewall-cmd --permanent --zone=public --add-port=4789/udp

Sau khi đã thêm tất cả các quy tắc cần thiết, hãy tải lại cấu hình của firewalld để áp dụng chúng ngay lập tức.

sudo firewall-cmd --reload

Để kiểm tra lại, bạn có thể dùng lệnh firewall-cmd --list-ports để xem danh sách các cổng đã được mở. Kết quả trả về phải bao gồm các cổng bạn vừa thêm vào.

Kiểm tra và xác nhận cấu hình tường lửa hoạt động đúng

Sau khi đã thiết lập các quy tắc, làm thế nào để biết chắc chắn chúng hoạt động như mong đợi? Bước kiểm tra và xác nhận là vô cùng quan trọng, giúp bạn tránh được những lỗi kết nối khó chịu sau này.

Các lệnh kiểm tra trạng thái và quy tắc firewalld

Công cụ firewalld-cmd cung cấp các lệnh hữu ích để bạn xem lại toàn bộ cấu hình của mình. Lệnh quan trọng nhất là --list-all.

Hãy chạy lệnh sau:

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

Lệnh này sẽ hiển thị tất cả thông tin về vùng public, bao gồm các dịch vụ (services), các cổng (ports), và các giao diện mạng (interfaces) được áp dụng. Hãy chắc chắn rằng bạn thấy các cổng 2377/tcp, 7946/tcp, 7946/udp, và 4789/udp trong danh sách ports.

Hình minh họa

Nếu bạn muốn xem toàn bộ quy tắc đang hoạt động một cách chi tiết hơn, bạn có thể dùng lệnh:

sudo firewall-cmd --list-rich-rules

Lệnh này sẽ hiển thị các quy tắc phức tạp hơn nếu bạn đã thiết lập chúng. Việc thường xuyên kiểm tra lại cấu hình giúp bạn nắm rõ trạng thái bảo mật của hệ thống.

Thử nghiệm kết nối và xác minh hoạt động của Docker Swarm qua các cổng mở

Kiểm tra cấu hình là một chuyện, nhưng thử nghiệm thực tế mới là câu trả lời chính xác nhất. Bạn có thể sử dụng các công cụ đơn giản như telnet hoặc netcat (nc) để kiểm tra xem một cổng có thực sự mở giữa hai node hay không.

Ví dụ, từ một node A, bạn muốn kiểm tra xem có thể kết nối đến cổng 2377 trên node B (có địa chỉ IP là IP_NODE_B) hay không. Bạn có thể dùng lệnh:

telnet IP_NODE_B 2377

Nếu kết nối thành công, bạn sẽ thấy một thông báo như Connected to IP_NODE_B. Nếu kết nối bị từ chối (Connection refused) hoặc hết thời gian (Connection timed out), điều đó có nghĩa là tường lửa đang chặn kết nối hoặc dịch vụ chưa chạy.

Ngoài ra, hãy luôn theo dõi nhật ký của firewalld để phát hiện các truy cập bị chặn hoặc các lỗi bất thường. Bạn có thể xem nhật ký bằng lệnh:

sudo journalctl -u firewalld

Việc này giúp bạn chủ động phát hiện và xử lý các vấn đề bảo mật tiềm ẩn.

Hướng dẫn quản lý và bảo trì tường lửa trong cụm Docker Swarm

Cấu hình tường lửa không phải là công việc làm một lần rồi quên. Khi hệ thống của bạn phát triển, bạn sẽ cần cập nhật, sao lưu và bảo trì các quy tắc tường lửa để đảm bảo an ninh luôn được duy trì.

Thay đổi cấu hình khi mở rộng hoặc thay đổi thành phần cụm

Hệ thống của bạn sẽ không đứng yên. Có thể bạn sẽ muốn thêm một node worker mới vào cụm, hoặc triển khai một dịch vụ mới yêu cầu một cổng khác. Khi đó, bạn cần cập nhật lại quy tắc tường lửa.

Ví dụ, nếu bạn triển khai một dịch vụ web mới chạy trên cổng 8080, bạn cần mở cổng này trên tất cả các node trong Swarm để mạng overlay có thể định tuyến lưu lượng truy cập.

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

Quy trình rất đơn giản: xác định cổng và giao thức cần thiết, sau đó sử dụng firewalld-cmd để thêm quy tắc mới và tải lại cấu hình. Luôn nhớ thực hiện thay đổi trên tất cả các node để đảm bảo tính nhất quán.

Hình minh họa

Backup và phục hồi cấu hình tường lửa firewalld

Phòng bệnh hơn chữa bệnh. Việc sao lưu cấu hình tường lửa là một bước cực kỳ quan trọng để bạn có thể nhanh chóng phục hồi hệ thống khi gặp sự cố hoặc khi cần di chuyển sang một máy chủ mới.

Tất cả các tệp cấu hình của firewalld thường được lưu trong thư mục /etc/firewalld/. Bạn có thể sao lưu toàn bộ thư mục này:

sudo tar -czvf firewalld-backup-$(date +%F).tar.gz /etc/firewalld/

Lệnh này sẽ tạo một tệp nén chứa toàn bộ cấu hình tường lửa của bạn, kèm theo ngày tháng sao lưu. Hãy cất giữ tệp backup này ở một nơi an toàn.

Để phục hồi, bạn chỉ cần giải nén tệp sao lưu vào đúng thư mục /etc/firewalld/ và tải lại dịch vụ:

sudo tar -xzvf firewalld-backup-YYYY-MM-DD.tar.gz -C /
sudo systemctl reload firewalld

Việc này giúp bạn tiết kiệm rất nhiều thời gian và công sức, đảm bảo hệ thống nhanh chóng quay trở lại trạng thái an toàn.

Các vấn đề thường gặp và cách khắc phục

Ngay cả khi đã tuân thủ hướng dẫn, đôi khi bạn vẫn có thể gặp phải một số vấn đề. Dưới đây là hai sự cố phổ biến nhất khi cấu hình tường lửa cho Docker Swarm và cách để bạn khắc phục chúng.

Firewall chặn kết nối nội bộ giữa các node Docker Swarm

Đây là vấn đề kinh điển nhất. Bạn đã khởi tạo cụm Swarm, các node đã tham gia, nhưng các service không thể giao tiếp với nhau. Các container trên các node khác nhau không thể ping thấy nhau.

Nguyên nhân: Thường là do một trong các cổng thiết yếu (7946/tcp-udp, 4789/udp) chưa được mở đúng cách trên tường lửa của một hoặc nhiều node. Hoặc các node đang nằm ở các “vùng” (zone) tường lửa khác nhau với các quy tắc khác nhau.

Cách khắc phục:

  1. Kiểm tra lại quy tắc: Trên từng node, chạy lại lệnh sudo firewall-cmd --list-all để xác nhận rằng các cổng 2377, 7946, 4789 đã thực sự có trong danh sách.
  2. Kiểm tra vùng: Đảm bảo rằng giao diện mạng mà Docker sử dụng đang được áp dụng đúng vùng tường lửa mà bạn đã cấu hình. Dùng firewall-cmd --get-active-zones để xem giao diện nào thuộc vùng nào.
  3. Thử nghiệm kết nối trực tiếp: Sử dụng telnet hoặc nc để kiểm tra kết nối trên từng cổng giữa các node như đã hướng dẫn ở phần trước. Điều này sẽ giúp bạn xác định chính xác node nào và cổng nào đang gặp vấn đề.

Hình minh họa

Lỗi firewalld không lưu cấu hình sau khi reboot

Bạn đã cẩn thận thêm tất cả các quy tắc, kiểm tra mọi thứ hoạt động hoàn hảo. Nhưng sau khi khởi động lại máy chủ, toàn bộ cấu hình biến mất và cụm Swarm lại gặp lỗi kết nối.

Nguyên nhân: Lỗi này xảy ra khi bạn quên thêm tùy chọn --permanent vào các lệnh firewall-cmd. Nếu không có tùy chọn này, các quy tắc bạn thêm chỉ có hiệu lực trong phiên làm việc hiện tại và sẽ bị xóa khi firewalld khởi động lại.

Cách khắc phục:

  1. Luôn dùng --permanent: Hãy tạo thói quen luôn sử dụng cờ --permanent khi bạn muốn thay đổi cấu hình tường lửa một cách lâu dài.
    sudo firewall-cmd --permanent --zone=public --add-port=2377/tcp
  2. Tải lại sau khi thay đổi: Sau khi thêm một quy tắc vĩnh viễn, hãy luôn chạy sudo firewall-cmd --reload. Lệnh này sẽ nạp cấu hình vĩnh viễn vào cấu hình đang chạy, giúp bạn kiểm tra ngay lập tức mà không cần reboot.
  3. Kiểm tra dịch vụ enable: Đảm bảo rằng dịch vụ firewalld đã được kích hoạt để tự khởi động cùng hệ thống bằng lệnh sudo systemctl is-enabled firewalld. Nếu kết quả là disabled, hãy chạy sudo systemctl enable firewalld.

Những thực hành tốt trong cấu hình tường lửa Docker Swarm trên CentOS 7

Để xây dựng một hệ thống không chỉ hoạt động tốt mà còn thực sự an toàn và dễ quản lý, hãy ghi nhớ những nguyên tắc vàng sau đây. Đây là kinh nghiệm được đúc kết từ nhiều năm làm việc với hệ thống máy chủ.

  • Luôn kiểm tra và ghi nhận cấu hình trước khi thay đổi: Trước khi bạn gõ bất kỳ lệnh nào để thay đổi tường lửa, hãy chạy firewall-cmd --list-all để chụp lại ảnh màn hình hoặc ghi lại cấu hình hiện tại. Điều này giúp bạn dễ dàng quay trở lại nếu có sự cố xảy ra.
  • Mở tối thiểu các cổng cần thiết: Đây là “Nguyên tắc Đặc quyền Tối thiểu” (Principle of Least Privilege) áp dụng cho tường lửa. Chỉ mở những cổng thực sự cần thiết cho hoạt động của Docker Swarm và các ứng dụng của bạn. Tuyệt đối tránh mở các dải cổng lớn hoặc cho phép tất cả các kết nối một cách bừa bãi.
  • Thiết lập cơ chế giám sát và nhật ký: Tường lửa của bạn là tuyến phòng thủ đầu tiên, và nhật ký (log) của nó chứa đựng những thông tin vô giá. Hãy thường xuyên kiểm tra nhật ký của firewalld để phát hiện các mẫu truy cập đáng ngờ hoặc các nỗ lực tấn công sớm.
  • Không tắt hoàn toàn tường lửa dù trong quá trình thử nghiệm: Rất nhiều người có thói quen tạm thời tắt tường lửa (systemctl stop firewalld) để chẩn đoán lỗi kết nối. Đây là một hành động rủi ro, dù chỉ trong vài phút. Thay vào đó, hãy học cách thêm và xóa quy tắc một cách linh hoạt để giữ cho hệ thống luôn được bảo vệ.

Hình minh họa

Hình minh họa

Kết luận

Qua bài viết này, chúng ta đã cùng nhau đi qua một hành trình chi tiết để cấu hình tường lửa cho cụm Docker Swarm trên môi trường CentOS 7. Tường lửa không phải là một tùy chọn, mà là một thành phần bắt buộc để đảm bảo an ninh cho hạ tầng của bạn. Việc hiểu rõ và thiết lập đúng các quy tắc cho firewalld không chỉ giúp bảo vệ hệ thống khỏi các mối đe dọa từ bên ngoài mà còn đảm bảo các thành phần bên trong cụm Swarm có thể giao tiếp với nhau một cách thông suốt.

Bằng cách áp dụng các bước đã được hướng dẫn, từ việc cài đặt, mở cổng, kiểm tra cho đến bảo trì và xử lý sự cố, bạn đã xây dựng được một hàng rào bảo mật vững chắc. Hãy luôn ghi nhớ các thực hành tốt nhất: chỉ mở những gì cần thiết, luôn giám sát và sao lưu cấu hình thường xuyên. Thế giới công nghệ luôn thay đổi, vì vậy đừng ngừng học hỏi và tìm hiểu sâu hơn về bảo mật mạng và hệ sinh thái Docker. Chúc bạn thành công trên con đường xây dựng và phát triển các hệ thống an toàn, hiệu quả.

Đánh giá
Tác giả

Mạnh Đức

Có cao nhân từng nói rằng: "Kiến thức trên thế giới này đầy rẫy trên internet. Tôi chỉ là người lao công cần mẫn đem nó tới cho người cần mà thôi !"

Chia sẻ
Bài viết liên quan