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

前書き

Docker SwarmはDockerの機能であり、Dockerホストとコンテナーを大規模に簡単に実行できます。 Docker Swarm、またはDockerクラスターは、_manager_ノードとして機能する1つ以上のDockerizedホストと、任意の数の_worker_ノードで構成されます。 このようなシステムをセットアップするには、Linuxファイアウォールを慎重に操作する必要があります。

Docker Swarmが正しく機能するために必要なネットワークポートは次のとおりです。

  • 安全なDockerクライアント通信用のTCPポート + 2376 +。 このポートは、Docker Machineが機能するために必要です。 Docker Machineは、Dockerホストのオーケストレーションに使用されます。

  • TCPポート + 2377 +。 このポートは、Docker Swarmまたはクラスターのノード間の通信に使用されます。 マネージャーノードでのみ開く必要があります。

  • ノード間の通信用のTCPおよびUDPポート「+7946 +」(コンテナネットワーク検出)。

  • オーバーレイネットワークトラフィック用のUDPポート + 4789 +(コンテナーの入力ネットワーク)。

この記事では、FirewallDとIPTablesを使用して、CentOS 7でLinuxファイアウォールを構成します。 FirewallDはCentOS 7のデフォルトのファイアウォールアプリケーションですが、IPTablesも使用できます。 このチュートリアルでは両方の方法について説明しますが、それぞれが同じ結果をもたらすため、最も使い慣れた方法を選択できます。

前提条件

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

  • 少なくとも1つのSwarm Managerと1つのSwarm Workerを含む、クラスターを構成するホストをセットアップします。 チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-provision-and-manage-remote-docker-hosts-with-docker-machine-on-centos-7 [プロビジョニング方法CentOSのDocker MachineでリモートDockerホストを管理する7))これらを設定します。

方法1-FirewallDを使用してDocker Swarmポートを開く

FirewallDは、CentOS 7のデフォルトのファイアウォールアプリケーションですが、新しいCentOS 7サーバーでは、デフォルトで無効になっています。 それを有効にして、Docker Swarmが機能するために必要なネットワークポートを追加しましょう。

開始する前に、そのステータスを確認します。

systemctl status firewalld

実行してはいけないので、起動してください:

systemctl start firewalld

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

systemctl enable firewalld

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

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 --reload

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

systemctl restart docker

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

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に必要なポートを開くことに成功しました。

方法2-IPTablesを使用してDocker Swarmポートを開く

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

systemctl stop firewalld

それを無効にします

systemctl disable firewalld

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

yum install iptables-services

次に、IPTablesを開始します。

systemctl start iptables

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

systemctl enable iptables

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

iptables -L INPUT --line-numbers

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

OutputChain 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

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

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

iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT
iptables -I INPUT 6 -p tcp --dport 2377 -j ACCEPT
iptables -I INPUT 7 -p tcp --dport 7946 -j ACCEPT
iptables -I INPUT 8 -p udp --dport 7946 -j ACCEPT
iptables -I INPUT 9 -p udp --dport 4789 -j ACCEPT

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

/usr/libexec/iptables/iptables.init save

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

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

Outputsystemctl restart docker

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

iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT
iptables -I INPUT 6 -p tcp --dport 7946 -j ACCEPT
iptables -I INPUT 7 -p udp --dport 7946 -j ACCEPT
iptables -I INPUT 8 -p udp --dport 4789 -j ACCEPT

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

/usr/libexec/iptables/iptables.init save

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

systemctl restart docker

IPTablesを使用してDocker Swarmに必要なポートを開くのに必要なことはそれだけです。 これらのルールがどのように機能するかについては、チュートリアルhttps://www.digitalocean.com/community/tutorials/how-the-iptables-firewall-works[IPTables Firewallの仕組み]をご覧ください。

結論

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