Hướng dẫn cấu hình tường lửa Linux cho Docker Swarm trên CentOS7

4 năm trước

 

Giới thiệu

Docker Swarm là một tính năng của Docker giúp dễ dàng chạy các host và container Docker trên quy mô lớn. Một Docker Swarm, hoặc Docker cluster, được tạo thành từ một hoặc nhiều máy chủ Dockerized có chức năng như quản lý, và bất kỳ số lượng các node worker. Thiết lập một hệ thống như vậy đòi hỏi phải thao tác cẩn thận tường lửa Linux

Cổng mạng được yêu cầu để chạy Docker Swarm là:

  • TCP port 2376 cho việc bảo mật giao tiếp của các khách hàng Docker. Cổng này được yêu cầu để chạy Docker Machine. Docker Machine được dùng để bố trí các host Docker. 
  • TCP port 2377.  Cổng này được dùng để giao tiếp giữa các node của Docker Swarm hay cluster. Ta chỉ cần nó để mở các node quản lí.
  • TCP và UDP port 7946 cho việc giao tiếp giữa các node (container network discovery).
  • UDP port 4789 cho việc chồng các lưu lượng mạng (container ingress networking). 

 

Lưu ý: Bên cạnh những cổng trên, cổng22 ( cho lưu lượng SSH) và bất cứ cổng nào cần cho việc chạy các dịch vụ cụ thể trên cluster phải để mở.

Trong bài viết này, bạn sẽ đi cấu hình tường lửa Linux trên CentOS 7 sử dụng FirewallD và IPTables. FirewallD là ứng dụng tường lửa mặc định trên CentOS 7 nhưng IPTable vẫn có sẵn. Vì bài hướng dẫn này sẽ bao gồm cả hai cách và mỗi cách đề cho một kết quả như nhau nên bạn có chọn các mà bạn cảm thấy quen thuộc.

Điều kiện cần

Trước khi thực hiện bài hướng dẫn này bạn nên:

  • Cài đặt các máy chủ tạo cluster của bạn, bao gồm ít nhất một swarm manager và một swarm worker.

Lưu ý: Bạn phải lưu ý rằng các command( và tất cả các command trong bài hướng dẫn này) không được thêm tiền tốsudo. Bạn phải làm vậy vì nó cho rằng bạn đăng nhập vào server sử dụng command docker-machine ssh csau khi cho phép nó sử dụng Docker Machine

Cách 1 — Mở các cổng Docker Swarm Ports sử dụng FirewallD

FirewallD là một ứng dụng tường lửa mặc định trên CentOS 7, nhưng trên một server CentOS 7 mới thì nó bị vô hiệu hoá. Cho nên hãy khởi động nó và thêm các cổng mạng cần thiết để chạy Docker Swarm.

Trước khi bắt đầu, xác minh trạng thái:

$ systemctl status firewalld 

Khởi động nó:

$ systemctl start firewalld 

Sau nó kích hoạt nó để nó chạy trên boot:

$ systemctl enable firewalld 

Trên node có vai trò là Swarm manager, dùng các command sau để mở các cổng cần thiết:

$ firewall-cmd --add-port=2376/tcp --permanent $ firewall-cmd --add-port=2377/tcp --permanent $ firewall-cmd --add-port=7946/tcp --permanent $ firewall-cmd --add-port=7946/udp --permanent $ firewall-cmd --add-port=4789/udp --permanent 

Lưu ý:Nếu bạn mắc lỗi và cần xoá cái vừa nhập, gõ: firewall-cmd --remove-port=port-number/tcp —permanent

Sau đó load lại tường lửa:

$ firewall-cmd --reload 

Sau đó khởi động lại Docker.

$ systemctl restart docker 

Trên mỗi node có vai trò là Swarm worker, dùng các command sau:

$ firewall-cmd --add-port=2376/tcp --permanent $ firewall-cmd --add-port=7946/tcp --permanent $ firewall-cmd --add-port=7946/udp --permanent$ firewall-cmd --add-port=4789/udp --permanent 

Sau đó load lại tường lửa:

$ firewall-cmd --reload 

Sau đó khở động lại Docker.

$ systemctl restart docker 

Bạn đã sử dụng FirewallD thành công để mở các cổng cần thiết cho Docker Swarm.

Lưu ý: Nếu bạn muốn kiểm tra các ứng dụng trên cluster yêu cầu truy cập ngoài mạng thì hãy chắc chắn rằng bạn đã mở các cổng cần thiết. Ví dụ, nếu bạn muốn kiểm tra ứng dụng Web yêu cầu truy cập trên cổng 80. thêm một quy tắc yêu cầu quyền truy cập tới cổng đó sử dụng command sau trên tất cả các node( bao gồm cả manager và worker) trong cluster:                                                                                                                                             firewall-cmd --add-port=80/tcp --permanent                                                                                                   

Nhớ load lại tường lửa khi bạn thực hiện thay đổi này.

 

Cách 2 — Mở các cổng Docker Swarm dùng IPTables

Để dùng IPTables trên bất cứ bản phân phối Linux nào, bạn sẽ phải gỡ cài đặt mọi tính năng tường lửa khác. Để đổi từ FirewallD sang IPTables, đầu tiên dừng FirewallD:

$ systemctl stop firewalld 

Sau đó vô hiệu hoá nó:

$ systemctl disable firewalld 

Sau đó cài đặt gói iptables-services quản lí việc tự động load các quy tắc IPTables 

$ yum install iptables-services 

Sau đó khởi động IPTables:

$ systemctl start iptables 

Sau đó kích hoạt nó để nó tự động chạy trên boot:

$ systemctl enable iptables 

Trước khi bạn bắt đầu thêm các quy tắc cụ thể của Docker Swarm vào chuỗi INPUT, hãy nhìn vào các quy tắc mặc định trong chuỗi đó:

$ iptables -L INPUT --line-numbers 

Output nên như sau:

Output
Chain INPUT (policy ACCEPT) 
num target prot opt source destination 
1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 
2 ACCEPT icmp -- anywhere anywhere 
3 ACCEPT all -- anywhere anywhere 
4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh 5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

 Kết hợp với nhau, các quy tắc mặc định cung cấp trạng thái bảo vệ cho máy chủ, từ chối tất cả lưu lượng đầu vào ngoại trừ các quy tắc đã được thiết lập. Lưu lượng truy cập SSH được cho phép vào . Hãy chú ý đến quy tắc số 5, được đánh dấu ở trên, vì đó là quy tắc từ chối catchall. Để Docker Swarm của bạn hoạt động đúng cách, các quy tắc bạn thêm cần phải được thêm vào phía trên quy tắc này. Điều đó có nghĩa là các quy tắc mới cần được chèn vào, thay vì gắn thêm vào chuỗi INPUT

Bây giờ bạn có thể thêm các quy tắc sử dụng tính năng iptables. Tập command đầu tiên này nên được xử lí trên các node đóng vai trò là các Swarm manager .

$ iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT $ iptables -I INPUT 6 -p tcp --dport 2377 -j ACCEPT $ iptables -I INPUT 7 -p tcp --dport 7946 -j ACCEPT $ iptables -I INPUT 8 -p udp --dport 7946 -j ACCEPT $ iptables -I INPUT 9 -p udp --dport 4789 -j ACCEPT 

 

Những quy tắc đó là các quy tắc lúc chạy và sẽ bị mất nếu hệ thống được khởi động lại. Để lưu các quy tắc lúc chạy hiện tại vào một tệp để chúng tồn tại sau khi khởi động lại, hãy nhập:

 $ /usr/libexec/iptables/iptables.init save

 

Những quy tắc trên sẽ được lưu vào một file gọi là iptables trong thư mục /etc/sysconfig. Và nếu bạn xem cách quy tắc này sử dụng iptables -L --line-numbers, bạn sẽ thấy mọi quy tắc đã được nhập vào trên trên các quy tắc từ chối:

OutputChain INPUT (policy ACCEPT) 
num target prot opt source destination 
1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 
2 ACCEPT icmp -- anywhere anywhere 
3 ACCEPT all -- anywhere anywhere 
4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh 
5 ACCEPT tcp -- anywhere anywhere tcp dpt:2376 
6 ACCEPT tcp -- anywhere anywhere tcp dpt:7946 
7 ACCEPT udp -- anywher anywhere udp dpt:7946 
8 ACCEPT udp -- anywhere anywhere udp dpt:4789 
9 ACCEPT tcp -- anywhere anywhere tcp dpt:http 
10 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited 

Sau đó khởi động lại Docker.

Output$ systemctl restart docker 

Trên các node có vai trò là Swarm worker. dùng các command sau:

$ iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT 
$ iptables -I INPUT 6 -p tcp --dport 7946 -j ACCEPT 
$ iptables -I INPUT 7 -p udp --dport 7946 -j ACCEPT 
$ iptables -I INPUT 8 -p udp --dport 4789 -j ACCEPT 

Lưu vào quy tắc sau vào ổ đĩa:

$ /usr/libexec/iptables/iptables.init save 

Sau đó khởi động lại Docker:

$ systemctl restart docker 

Đó là tất cả những gì cần để mở các cổng cần thiết cho Docker Swarm sử dụng IPTables

Lưu ý: Nếu bạn muốn kiểm tra các ứng dụng trên cluster yêu cầu truy cập ngoài mạng thì hãy chắc chắn rằng bạn đã mở các cổng cần thiết. Ví dụ, nếu bạn muốn kiểm tra ứng dụng Web yêu cầu truy cập trên cổng 80. thêm một quy tắc yêu cầu quyền truy cập tới cổng đó sử dụng command sau trên tất cả các node( bao gồm cả manager và worker) trong cluster:                                                                                            iptables -I INPUT rule-number -p tcp --dport 80 -j ACCEPT

Hãy nhớ nhập các quy tắc bên trên các quy tắc reject

 

Kết luận

FirewallD và IPTables là hai trong số các ứng dụng quản lý tường lửa phổ biến nhất trong Linux. Bạn chỉ cần đọc cách sử dụng chúng để mở các cổng mạng cần thiết để thiết lập Docker Swarm. Phương pháp bạn sử dụng chỉ là vấn đề sở thích cá nhân, bởi vì chúng đều có khả năng như nhau.