Ubuntu16.04でDockerSwarm用にLinuxファイアウォールを構成する方法
序章
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マネージャーとして機能するノードで次のコマンドを実行します。
- ufw allow 22/tcp
- ufw allow 2376/tcp
- ufw allow 2377/tcp
- ufw allow 7946/tcp
- ufw allow 7946/udp
- ufw allow 4789/udp
その後、UFWをリロードします。
- ufw reload
UFWが有効になっていない場合は、次のコマンドを使用して有効にします。
- ufw enable
これは必要ないかもしれませんが、ファイアウォールに変更を加えてファイアウォールを再起動するたびにDockerデーモンを再起動しても問題はありません。
systemctl restart docker
次に、ワーカーとして機能する各ノードで、次のコマンドを実行します。
- ufw allow 22/tcp
- ufw allow 2376/tcp
- ufw allow 7946/tcp
- ufw allow 7946/udp
- ufw allow 4789/udp
その後、UFWをリロードします。
- ufw reload
UFWが有効になっていない場合は、有効にします。
- ufw enable
次に、Dockerデーモンを再起動します。
systemctl restart docker
UFWを使用してDockerSwarmに必要なポートを開くために必要なのはこれだけです。
方法2—FirewallDを使用してDockerSwarmポートを開く
FirewallDは、Fedora、CentOS、およびそれらに基づくその他のLinuxディストリビューションのデフォルトのファイアウォールアプリケーションです。 ただし、FirewallDは、Ubuntu16.04を含む他のLinuxディストリビューションでも利用できます。
UFWの代わりにFirewallDを使用する場合は、最初にUFWをアンインストールします。
- apt-get purge ufw
次に、FirewallDをインストールします。
- apt-get install firewalld
実行されていることを確認します。
- systemctl status firewalld
実行されていない場合は、開始します。
- systemctl start firewalld
次に、起動時に起動するように有効にします。
- systemctl enable firewalld
Swarmマネージャーになるノードで、次のコマンドを使用して必要なポートを開きます。
- firewall-cmd --add-port=22/tcp --permanent
- 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=22/tcp --permanent
- 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に必要なポートを正常に開きました。
方法3—IPTablesを使用してDockerSwarmポートを開く
LinuxディストリビューションでIPtablesを使用するには、最初に他のファイアウォールユーティリティをアンインストールする必要があります。 FirewallDまたはUFWから切り替える場合は、最初にそれらをアンインストールします。
次に、iptables-persistent
パッケージをインストールします。これは、IPtablesルールの自動ロードを管理します。
- apt-get install iptables-persistent
次に、次のコマンドを使用して既存のルールをフラッシュします。
- netfilter-persistent flush
iptables
ユーティリティを使用してルールを追加できるようになりました。 この最初のコマンドセットは、Swarmマネージャーとして機能するノードで実行する必要があります。
- iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- iptables -A INPUT -p tcp --dport 2376 -j ACCEPT
- iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
- iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
- iptables -A INPUT -p udp --dport 7946 -j ACCEPT
- iptables -A INPUT -p udp --dport 4789 -j ACCEPT
すべてのコマンドを入力したら、ルールをディスクに保存します。
- netfilter-persistent save
次に、Dockerを再起動します。
- sudo systemctl restart docker
Swarmワーカーとして機能するノードで、次のコマンドを実行します。
- iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- iptables -A INPUT -p tcp --dport 2376 -j ACCEPT
- iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
- iptables -A INPUT -p udp --dport 7946 -j ACCEPT
- iptables -A INPUT -p udp --dport 4789 -j ACCEPT
これらの新しいルールをディスクに保存します。
- netfilter-persistent save
次に、Dockerを再起動します。
- sudo systemctl restart docker
IPTablesを使用してDockerSwarmに必要なポートを開くのに必要なのはこれだけです。 これらのルールがどのように機能するかについては、チュートリアルIptablesFirewallの機能で詳しく知ることができます。
この方法を使用した後にFirewallDまたはUFWに切り替える場合は、最初にファイアウォールを停止するのが適切な方法です。
- sudo netfilter-persistent stop
次に、ルールをフラッシュします。
- sudo netfilter-persistent flush
最後に、空になったテーブルをディスクに保存します。
- sudo netfilter-persistent save
次に、UFWまたはFirewallDに切り替えることができます。
結論
FirewallD、IPTables Tools、UFWは、Linuxの世界における3つのファイアウォール管理アプリケーションです。 それぞれを使用して、DockerSwarmのセットアップに必要なネットワークポートを開く方法を学びました。 どの方法を使用するかは、すべて同じように機能するため、個人的な好みの問題です。