序章

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が機能するために必要なネットワークポートを追加しましょう。

開始する前に、そのステータスを確認してください。

  1. systemctl status firewalld

実行されていないはずなので、開始します。

  1. systemctl start firewalld

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

  1. systemctl enable firewalld

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

  1. firewall-cmd --add-port=2376/tcp --permanent
  2. firewall-cmd --add-port=2377/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

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

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

  1. firewall-cmd --reload

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

  1. systemctl restart docker

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

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

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

  1. firewall-cmd --reload

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

  1. systemctl restart docker

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

:外部ネットワークアクセスを必要とするクラスター上のアプリケーションをテストする場合は、必ず必要なポートを開いてください。 たとえば、ポート80でのアクセスが必要なWebアプリケーションをテストする場合は、クラスター内のすべてのノード(マネージャーとワーカー)で次のコマンドを使用して、そのポートへのアクセスを許可するルールを追加します。

  1. firewall-cmd --add-port=80/tcp --permanent

この変更を行うときは、ファイアウォールをリロードすることを忘れないでください。

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

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

  1. systemctl stop firewalld

次にそれを無効にします

  1. systemctl disable firewalld

次に、iptables-servicesパッケージをインストールします。これは、IPTablesルールの自動読み込みを管理します。

  1. yum install iptables-services

次に、IPTablesを起動します。

  1. systemctl start iptables

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

  1. systemctl enable iptables

Docker Swarm固有のルールをINPUTチェーンに追加する前に、そのチェーンのデフォルトのルールを見てみましょう。

  1. iptables -L INPUT --line-numbers

出力は次のようになります。

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

まとめると、デフォルトのルールはサーバーにステートフル保護を提供し、すでに確立されているものを除くすべての入力トラフィックを拒否します。 SSHトラフィックはで許可されています。 上記で強調表示されているルール番号5は、キャッチオール拒否ルールであるため、注意してください。 Docker Swarmが正しく機能するには、追加するルールをこのルールのに追加する必要があります。 つまり、INPUTチェーンに追加するのではなく、新しいルールを挿入する必要があります。

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

  1. iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT
  2. iptables -I INPUT 6 -p tcp --dport 2377 -j ACCEPT
  3. iptables -I INPUT 7 -p tcp --dport 7946 -j ACCEPT
  4. iptables -I INPUT 8 -p udp --dport 7946 -j ACCEPT
  5. iptables -I INPUT 9 -p udp --dport 4789 -j ACCEPT

これらのルールはランタイムルールであり、システムを再起動すると失われます。 現在のランタイムルールをファイルに保存して、再起動後も保持されるようにするには、次のように入力します。

  1. /usr/libexec/iptables/iptables.init save

これで、ルールが/etc/sysconfigディレクトリのiptablesというファイルに保存されます。 また、iptables -L --line-numbersを使用してルールを表示すると、すべてのルールがキャッチオールリジェクトルールの上に挿入されていることがわかります。

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 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を再起動します。

  1. Output
    systemctl restart docker

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

  1. iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT
  2. iptables -I INPUT 6 -p tcp --dport 7946 -j ACCEPT
  3. iptables -I INPUT 7 -p udp --dport 7946 -j ACCEPT
  4. iptables -I INPUT 8 -p udp --dport 4789 -j ACCEPT

ルールをディスクに保存します。

  1. /usr/libexec/iptables/iptables.init save

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

  1. systemctl restart docker

IPTablesを使用してDockerSwarmに必要なポートを開くのに必要なのはこれだけです。 これらのルールの仕組みについて詳しくは、チュートリアルIPTablesFirewallの仕組みをご覧ください。

:外部ネットワークアクセスを必要とするクラスターでアプリケーションをテストする場合は、必ず必要なポートを開いてください。 たとえば、ポート80でのアクセスが必要なWebアプリケーションをテストする場合は、クラスター内のすべてのノード(マネージャーとワーカー)で次のコマンドを使用して、そのポートへのアクセスを許可するルールを追加します。

  1. iptables -I INPUT rule-number -p tcp --dport 80 -j ACCEPT

必ずキャッチオール拒否ルールの上にルールを挿入してください。

結論

FirewallDとIPTablesは、Linuxの世界で最も人気のあるファイアウォール管理アプリケーションの2つです。 これらを使用して、DockerSwarmのセットアップに必要なネットワークポートを開く方法を読んだだけです。 使用する方法は、すべて同じように機能するため、個人的な好みの問題です。