Ubuntu 16.04でDocker SwarmのLinuxファイアウォールを構成する方法

前書き

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つの方法を扱いますが、それぞれが同じ結果をもたらすため、最もよく知っている方法を選択できます。

前提条件

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

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のセットアップに必要なネットワークポートを開くためにそれぞれを使用する方法を学習しました。 どの方法を使用するかは、個人の好みの問題です。すべて同じように機能します。

Related