序章
Docker Swarm は、Dockerのホストとコンテナーを大規模に簡単に実行できるようにするDockerの機能です。 Docker Swarm、またはDockerクラスターは、 manager ノードとして機能する1つ以上のDocker化されたホストと、任意の数のworkerノードで構成されます。 このようなシステムをセットアップするには、Linuxファイアウォールを注意深く操作する必要があります。
DockerSwarmが正しく機能するために必要なネットワークポートは次のとおりです。
- 安全なDockerクライアント通信用のTCPポート
2376
。 このポートは、DockerMachineが機能するために必要です。 Docker Machineは、Dockerホストを調整するために使用されます。 - TCPポート
2377
。 このポートは、DockerSwarmまたはクラスターのノード間の通信に使用されます。 マネージャーノードで開く必要があるだけです。 - ノード間の通信(コンテナネットワーク検出)用のTCPおよびUDPポート
7946
。 - オーバーレイネットワークトラフィック(コンテナ入力ネットワーク)用のUDPポート
4789
。
注:これらのポートとは別に、ポート22
(SSHトラフィック用)および特定のサービスをクラスターで実行するために必要なその他のポートを開く必要があります。
この記事では、FirewallDとIPTablesを使用してCentOS7でLinuxファイアウォールを構成します。 FirewallDはCentOS7のデフォルトのファイアウォールアプリケーションですが、IPTablesも利用できます。 このチュートリアルでは両方の方法について説明しますが、それぞれが同じ結果をもたらすため、最も使い慣れた方法を選択できます。
前提条件
この記事に進む前に、次のことを行う必要があります。
- 少なくとも1つのスウォームマネージャーと1つのスウォームワーカーを含む、クラスターを構成するホストをセットアップします。 チュートリアルCentOS7 上のDockerマシンでリモートDockerホストをプロビジョニングおよび管理する方法)に従って、これらを設定できます。
注:コマンド(およびこの記事のすべてのコマンド)の前にsudo
が付いていないことに気付くでしょう。 これは、Docker Machineを使用してサーバーをプロビジョニングした後、docker-machine ssh
コマンドを使用してサーバーにログインしていることを前提としているためです。
方法1—FirewallDを使用してDockerSwarmポートを開く
FirewallDはCentOS7のデフォルトのファイアウォールアプリケーションですが、新しいCentOS 7サーバーでは、そのままでは無効になっています。 それでは、それを有効にして、DockerSwarmが機能するために必要なネットワークポートを追加しましょう。
開始する前に、そのステータスを確認してください。
- 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 --remove-port=port-number/tcp —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を使用して、DockerSwarmに必要なポートを正常に開きました。
注:外部ネットワークアクセスを必要とするクラスター上のアプリケーションをテストする場合は、必ず必要なポートを開いてください。 たとえば、ポート80でのアクセスが必要なWebアプリケーションをテストする場合は、クラスター内のすべてのノード(マネージャーとワーカー)で次のコマンドを使用して、そのポートへのアクセスを許可するルールを追加します。
- firewall-cmd --add-port=80/tcp --permanent
この変更を行うときは、ファイアウォールをリロードすることを忘れないでください。
方法2—IPTablesを使用してDockerSwarmポートを開く
LinuxディストリビューションでIPTablesを使用するには、最初に他のファイアウォールユーティリティをアンインストールする必要があります。 FirewallDからIPTablesに切り替えるには、最初にFirewallDを停止します。
- systemctl stop firewalld
次にそれを無効にします
- systemctl disable firewalld
次に、iptables-services
パッケージをインストールします。これは、IPTablesルールの自動読み込みを管理します。
- 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
5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
まとめると、デフォルトのルールはサーバーにステートフル保護を提供し、すでに確立されているものを除くすべての入力トラフィックを拒否します。 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を使用してDockerSwarmに必要なポートを開くのに必要なのはこれだけです。 これらのルールの仕組みについて詳しくは、チュートリアルIPTablesFirewallの仕組みをご覧ください。
注:外部ネットワークアクセスを必要とするクラスターでアプリケーションをテストする場合は、必ず必要なポートを開いてください。 たとえば、ポート80でのアクセスが必要なWebアプリケーションをテストする場合は、クラスター内のすべてのノード(マネージャーとワーカー)で次のコマンドを使用して、そのポートへのアクセスを許可するルールを追加します。
- iptables -I INPUT rule-number -p tcp --dport 80 -j ACCEPT
必ずキャッチオール拒否ルールの上にルールを挿入してください。
結論
FirewallDとIPTablesは、Linuxの世界で最も人気のあるファイアウォール管理アプリケーションの2つです。 これらを使用して、DockerSwarmのセットアップに必要なネットワークポートを開く方法を読んだだけです。 使用する方法は、すべて同じように機能するため、個人的な好みの問題です。