前書き
Docker SwarmはDockerの機能であり、Dockerホストとコンテナーを大規模に簡単に実行できます。 Docker Swarm、またはDockerクラスターは、_manager_ノードとして機能する1つ以上のDockerizedホストと、任意の数の_worker_ノードで構成されます。 このようなシステムをセットアップするには、Linuxファイアウォールを慎重に操作する必要があります。
Docker Swarmが正しく機能するために必要なネットワークポートは次のとおりです。
-
安全なDockerクライアント通信用のTCPポート
+ 2376 +
。 このポートは、Docker Machineが機能するために必要です。 Docker Machineは、Dockerホストのオーケストレーションに使用されます。 -
TCPポート
+ 2377 +
。 このポートは、Docker Swarmまたはクラスターのノード間の通信に使用されます。 マネージャーノードでのみ開く必要があります。 -
ノード間の通信用のTCPおよびUDPポート「+7946 +」(コンテナネットワーク検出)。
-
オーバーレイネットワークトラフィック用のUDPポート
+ 4789 +
(コンテナーの入力ネットワーク)。
この記事では、FirewallDとIPTablesを使用して、CentOS 7でLinuxファイアウォールを構成します。 FirewallDはCentOS 7のデフォルトのファイアウォールアプリケーションですが、IPTablesも使用できます。 このチュートリアルでは両方の方法について説明しますが、それぞれが同じ結果をもたらすため、最も使い慣れた方法を選択できます。
前提条件
この記事を進める前に、次のことを行う必要があります。
-
少なくとも1つのSwarm Managerと1つのSwarm Workerを含む、クラスターを構成するホストをセットアップします。 チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-provision-and-manage-remote-docker-hosts-with-docker-machine-on-centos-7 [プロビジョニング方法CentOSのDocker MachineでリモートDockerホストを管理する7))これらを設定します。
方法1-FirewallDを使用してDocker Swarmポートを開く
FirewallDは、CentOS 7のデフォルトのファイアウォールアプリケーションですが、新しいCentOS 7サーバーでは、デフォルトで無効になっています。 それを有効にして、Docker Swarmが機能するために必要なネットワークポートを追加しましょう。
開始する前に、そのステータスを確認します。
systemctl status firewalld
実行してはいけないので、起動してください:
systemctl start firewalld
次に、起動時に起動するように有効にします。
systemctl enable firewalld
Swarmマネージャーとなるノードで、次のコマンドを使用して必要なポートを開きます。
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
その後、ファイアウォールをリロードします。
firewall-cmd --reload
次に、Dockerを再起動します。
systemctl restart docker
次に、Swarmワーカーとして機能する各ノードで、次のコマンドを実行します。
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
その後、ファイアウォールをリロードします。
firewall-cmd --reload
次に、Dockerを再起動します。
systemctl restart docker
FirewallDを使用して、Docker Swarmに必要なポートを開くことに成功しました。
方法2-IPTablesを使用してDocker Swarmポートを開く
LinuxディストリビューションでIPTablesを使用するには、まず他のファイアウォールユーティリティをアンインストールする必要があります。 FirewallDからIPTablesに切り替えるには、最初にFirewallDを停止します。
systemctl stop firewalld
それを無効にします
systemctl disable firewalld
次に、IPTablesルールの自動読み込みを管理する `+ iptables-services`パッケージをインストールします。
yum install iptables-services
次に、IPTablesを開始します。
systemctl start iptables
次に、起動時に自動的に起動するように有効にします。
systemctl enable iptables
Docker Swarm固有のルールをINPUTチェーンに追加する前に、そのチェーンのデフォルトルールを見てみましょう。
iptables -L INPUT --line-numbers
出力は次のようになります。
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
まとめると、デフォルトのルールはサーバーにステートフルな保護を提供し、すでに確立されているトラフィックを除くすべての入力トラフィックを拒否します。 SSHトラフィックは許可されています。 これはキャッチオール拒否ルールであるため、上で強調表示されているルール番号5に注意してください。 Docker Swarmが適切に機能するには、追加するルールをこのルールの上に追加する必要があります。 つまり、INPUTチェーンに追加するのではなく、新しいルールを挿入する必要があります。
何をすべきかがわかったので、 `+ iptables +`ユーティリティを使用して必要なルールを追加できます。 この最初のコマンドセットは、Swarmマネージャーとして機能するノードで実行する必要があります。
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
これらのルールはランタイムルールであり、システムを再起動すると失われます。 現在のランタイムルールをファイルに保存して、再起動後も保持するには、次のように入力します。
/usr/libexec/iptables/iptables.init save
これで、ルールは `+ / etc / sysconfig `ディレクトリの ` iptables `というファイルに保存されます。 また、 ` iptables -L --line-numbers +`を使用してルールを表示すると、すべてのルールがキャッチオール拒否ルールの上に挿入されていることがわかります。
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 -- anywhere 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
次に、Dockerを再起動します。
Outputsystemctl restart docker
Swarmワーカーとして機能するノードで、次のコマンドを実行します。
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
ルールをディスクに保存します。
/usr/libexec/iptables/iptables.init save
次に、Dockerを再起動します。
systemctl restart docker
IPTablesを使用してDocker Swarmに必要なポートを開くのに必要なことはそれだけです。 これらのルールがどのように機能するかについては、チュートリアルhttps://www.digitalocean.com/community/tutorials/how-the-iptables-firewall-works[IPTables Firewallの仕組み]をご覧ください。
結論
FirewallDとIPTablesは、Linuxの世界で最も人気のある2つのファイアウォール管理アプリケーションです。 これらを使用してDocker Swarmのセットアップに必要なネットワークポートを開く方法を読んだだけです。 使用する方法は個人的な好みの問題です。すべて同じように機能するからです。