前書き
Docker SwarmはDockerの機能であり、Dockerホストとコンテナーを大規模に簡単に実行できます。 Docker Swarm、またはDockerクラスターは、managerノードとして機能する1つ以上のDocker化されたホストと、任意の数のworkerノードで構成されます。 このようなシステムをセットアップするには、Linuxファイアウォールを慎重に操作する必要があります。
Docker Swarmが正しく機能するために必要なネットワークポートは次のとおりです。
-
安全なDockerクライアント通信用のTCPポート
2376
。 このポートは、Docker Machineが機能するために必要です。 Docker Machineは、Dockerホストのオーケストレーションに使用されます。 -
TCPポート
2377
。 このポートは、Docker Swarmまたはクラスターのノード間の通信に使用されます。 マネージャーノードでのみ開く必要があります。 -
ノード間の通信用のTCPおよびUDPポート
7946
(コンテナネットワークの検出)。 -
オーバーレイネットワークトラフィック(コンテナ入力ネットワーク)用のUDPポート
4789
。
Note:これらのポートとは別に、ポート22
(SSHトラフィック用)および特定のサービスをクラスター上で実行するために必要なその他のポートを開く必要があります。
この記事では、すべてのLinuxディストリビューションで利用可能なさまざまなファイアウォール管理アプリケーションを使用して、Ubuntu 16.04でLinuxファイアウォールを構成する方法を学びます。 それらのファイアウォール管理アプリケーションは、FirewallD、IPTables Tools、およびUFW(Uncomplicated Firewall)です。 UFWは、Ubuntu 16.04を含むUbuntuディストリビューションのデフォルトのファイアウォールアプリケーションです。 このチュートリアルでは3つの方法を扱いますが、それぞれが同じ結果をもたらすため、最もよく知っている方法を選択できます。
前提条件
この記事を進める前に、次のことを行う必要があります。
-
少なくとも1つのSwarm Managerと1つのSwarm Workerを含む、クラスターを構成するホストをセットアップします。 チュートリアルHow To Provision and Manage Remote Docker Hosts with Docker Machine on Ubuntu 16.04に従って、これらを設定できます。
Note:コマンド(およびこの記事のすべてのコマンド)の前にsudo
が付いていないことに気付くでしょう。 これは、Docker Machineを使用してサーバーをプロビジョニングした後、docker-machine ssh
コマンドを使用してサーバーにログインしていることを前提としているためです。
[[method-1 -—- opening-docker-swarm-ports-using-ufw]] ==方法1—UFWを使用してDockerSwarmポートを開く
Dockerホストをセットアップしたばかりの場合、UFWはすでにインストールされています。 有効化して設定するだけです。 Ubuntu 16.04でUFWを使用する方法の詳細については、this guideをフォローしてください。
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を使用してDocker Swarmに必要なポートを開くために必要なことはこれだけです。
[[method-2 -—- opening-docker-swarm-ports-using-firewalld]] ==方法2—FirewallDを使用してDockerSwarmポートを開く
FirewallDは、Fedora、CentOS、およびそれらに基づく他のLinuxディストリビューションのデフォルトのファイアウォールアプリケーションです。 ただし、FirewallDは、Ubuntu 16.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
[.note]#Note:間違えてエントリを削除する必要がある場合は、次のように入力します: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を使用して、Docker Swarmに必要なポートを開くことに成功しました。
[[method-3 -—- opening-docker-swarm-ports-using-iptables]] ==方法3—IPTablesを使用してDockerSwarmポートを開く
LinuxディストリビューションでIPtablesを使用するには、まず他のファイアウォールユーティリティをアンインストールする必要があります。 FirewallDまたはUFWから切り替える場合は、まずそれらをアンインストールします。
次に、IPtablesルールの自動ロードを管理するiptables-persistent
パッケージをインストールします。
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を使用してDocker Swarmに必要なポートを開くのに必要なことはそれだけです。 これらのルールがどのように機能するかについては、チュートリアルHow the Iptables Firewall Worksで詳しく知ることができます。
この方法を使用した後にFirewallDまたはUFWに切り替える場合、適切な方法は、最初にファイアウォールを停止することです。
sudo netfilter-persistent stop
次に、ルールをフラッシュします。
sudo netfilter-persistent flush
最後に、空になったテーブルをディスクに保存します。
sudo netfilter-persistent save
その後、UFWまたはFirewallDに切り替えることができます。
結論
FirewallD、IPTables Tools、UFWは、Linuxの世界における3つのファイアウォール管理アプリケーションです。 Docker Swarmのセットアップに必要なネットワークポートを開くためにそれぞれを使用する方法を学習しました。 どの方法を使用するかは、個人の好みの問題です。すべて同じように機能します。