序章

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トラフィック用)および特定のサービスをクラスターで実行するために必要なその他のポートを開く必要があります。

この記事では、すべてのLinuxディストリビューションで利用可能なさまざまなファイアウォール管理アプリケーションを使用してUbuntu16.04でLinuxファイアウォールを構成する方法を学習します。 これらのファイアウォール管理アプリケーションは、FirewallD、IPTables Tools、およびUFW、UncomplicatedFirewallです。 UFWは、Ubuntu16.04を含むUbuntuディストリビューションのデフォルトのファイアウォールアプリケーションです。 このチュートリアルでは3つの方法について説明しますが、それぞれが同じ結果をもたらすため、最も使い慣れた方法を選択できます。

前提条件

この記事に進む前に、次のことを行う必要があります。

  • 少なくとも1つのスウォームマネージャーと1つのスウォームワーカーを含む、クラスターを構成するホストをセットアップします。 チュートリアルUbuntu16.04でDockerマシンを使用してリモートDockerホストをプロビジョニングおよび管理する方法に従ってこれらを設定できます。

注:コマンド(およびこの記事のすべてのコマンド)の前にsudoが付いていないことに気付くでしょう。 これは、Docker Machineを使用してサーバーをプロビジョニングした後、docker-machine sshコマンドを使用してサーバーにログインしていることを前提としているためです。

方法1—UFWを使用してDockerSwarmポートを開く

Dockerホストをセットアップしたばかりの場合、UFWはすでにインストールされています。 有効にして構成するだけです。 Ubuntu 16.04でUFWを使用する方法の詳細については、このガイドに従ってください。

Swarmマネージャーとして機能するノードで次のコマンドを実行します。

  1. ufw allow 22/tcp
  2. ufw allow 2376/tcp
  3. ufw allow 2377/tcp
  4. ufw allow 7946/tcp
  5. ufw allow 7946/udp
  6. ufw allow 4789/udp

その後、UFWをリロードします。

  1. ufw reload

UFWが有効になっていない場合は、次のコマンドを使用して有効にします。

  1. ufw enable

これは必要ないかもしれませんが、ファイアウォールに変更を加えてファイアウォールを再起動するたびにDockerデーモンを再起動しても問題はありません。

systemctl restart docker

次に、ワーカーとして機能する各ノードで、次のコマンドを実行します。

  1. ufw allow 22/tcp
  2. ufw allow 2376/tcp
  3. ufw allow 7946/tcp
  4. ufw allow 7946/udp
  5. ufw allow 4789/udp

その後、UFWをリロードします。

  1. ufw reload

UFWが有効になっていない場合は、有効にします。

  1. ufw enable

次に、Dockerデーモンを再起動します。

systemctl restart docker

UFWを使用してDockerSwarmに必要なポートを開くために必要なのはこれだけです。

方法2—FirewallDを使用してDockerSwarmポートを開く

FirewallDは、Fedora、CentOS、およびそれらに基づくその他のLinuxディストリビューションのデフォルトのファイアウォールアプリケーションです。 ただし、FirewallDは、Ubuntu16.04を含む他のLinuxディストリビューションでも利用できます。

UFWの代わりにFirewallDを使用する場合は、最初にUFWをアンインストールします。

  1. apt-get purge ufw

次に、FirewallDをインストールします。

  1. apt-get install firewalld

実行されていることを確認します。

  1. systemctl status firewalld

実行されていない場合は、開始します。

  1. systemctl start firewalld

次に、起動時に起動するように有効にします。

  1. systemctl enable firewalld

Swarmマネージャーになるノードで、次のコマンドを使用して必要なポートを開きます。

  1. firewall-cmd --add-port=22/tcp --permanent
  2. firewall-cmd --add-port=2376/tcp --permanent
  3. firewall-cmd --add-port=2377/tcp --permanent
  4. firewall-cmd --add-port=7946/tcp --permanent
  5. firewall-cmd --add-port=7946/udp --permanent
  6. firewall-cmd --add-port=4789/udp --permanent

:間違えてエントリを削除する必要がある場合は、firewall-cmd --remove-port=port-number/tcp —permanentと入力してください。

その後、ファイアウォールをリロードします。

  1. firewall-cmd --reload

次に、Dockerを再起動します。

  1. systemctl restart docker

次に、Swarmワーカーとして機能する各ノードで、次のコマンドを実行します。

  1. firewall-cmd --add-port=22/tcp --permanent
  2. firewall-cmd --add-port=2376/tcp --permanent
  3. firewall-cmd --add-port=7946/tcp --permanent
  4. firewall-cmd --add-port=7946/udp --permanent
  5. firewall-cmd --add-port=4789/udp --permanent

その後、ファイアウォールをリロードします。

  1. firewall-cmd --reload

次に、Dockerを再起動します。

systemctl restart docker

FirewallDを使用して、DockerSwarmに必要なポートを正常に開きました。

方法3—IPTablesを使用してDockerSwarmポートを開く

LinuxディストリビューションでIPtablesを使用するには、最初に他のファイアウォールユーティリティをアンインストールする必要があります。 FirewallDまたはUFWから切り替える場合は、最初にそれらをアンインストールします。

次に、iptables-persistentパッケージをインストールします。これは、IPtablesルールの自動ロードを管理します。

  1. apt-get install iptables-persistent

次に、次のコマンドを使用して既存のルールをフラッシュします。

  1. netfilter-persistent flush

iptablesユーティリティを使用してルールを追加できるようになりました。 この最初のコマンドセットは、Swarmマネージャーとして機能するノードで実行する必要があります。

  1. iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  2. iptables -A INPUT -p tcp --dport 2376 -j ACCEPT
  3. iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
  4. iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
  5. iptables -A INPUT -p udp --dport 7946 -j ACCEPT
  6. iptables -A INPUT -p udp --dport 4789 -j ACCEPT

すべてのコマンドを入力したら、ルールをディスクに保存します。

  1. netfilter-persistent save

次に、Dockerを再起動します。

  1. sudo systemctl restart docker

Swarmワーカーとして機能するノードで、次のコマンドを実行します。

  1. iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  2. iptables -A INPUT -p tcp --dport 2376 -j ACCEPT
  3. iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
  4. iptables -A INPUT -p udp --dport 7946 -j ACCEPT
  5. iptables -A INPUT -p udp --dport 4789 -j ACCEPT

これらの新しいルールをディスクに保存します。

  1. netfilter-persistent save

次に、Dockerを再起動します。

  1. sudo systemctl restart docker

IPTablesを使用してDockerSwarmに必要なポートを開くのに必要なのはこれだけです。 これらのルールがどのように機能するかについては、チュートリアルIptablesFirewallの機能で詳しく知ることができます。

この方法を使用した後にFirewallDまたはUFWに切り替える場合は、最初にファイアウォールを停止するのが適切な方法です。

  1. sudo netfilter-persistent stop

次に、ルールをフラッシュします。

  1. sudo netfilter-persistent flush

最後に、空になったテーブルをディスクに保存します。

  1. sudo netfilter-persistent save

次に、UFWまたはFirewallDに切り替えることができます。

結論

FirewallD、IPTables Tools、UFWは、Linuxの世界における3つのファイアウォール管理アプリケーションです。 それぞれを使用して、DockerSwarmのセットアップに必要なネットワークポートを開く方法を学びました。 どの方法を使用するかは、すべて同じように機能するため、個人的な好みの問題です。