Hướng dẫn cấu hình tường lửa Linux cho Docker Swarm trên CentOS7
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.