複数のノードを持つドッカーの群れがあります。これらはwireguardインターフェイスを介して接続されています。すべてのドッカースワーム通信は、wireguardが提供する内部ネットワーク内で行われます。次の例では、インターネット接続インターフェイスは、eth0
wireguardインターフェイスはですintr
。
スタックにocks5プロキシを追加しましたが、作成ファイルには次のようになります。
services:
proxy:
hostname: proxy
image: httptoolkit/docker-socks-tunnel
ports:
- 1080:1080/tcp
私の目標は、このサービスへのアクセスを制限して、intrネットワーク上のクライアント(wireguardインターフェイスの起動など)のみを使用できるようにすることです。
私が使用する最小限のコマンドセットは次のとおりです。
# replace ufw with firewalld
systemctl stop docker
systemctl stop ufw
apt remove --purge ufw
apt install -y firewalld
systemctl enable firewalld
systemctl start firewalld
systemctl start docker
# add eth0 to public zone, this will prevent all incoming connections, except ssh and ipv6-dhcp
firewall-cmd --zone=public --add-interface=eth0
# allow 51830/udp (wireguard) so that the internal wireguard interfaces can connect on the nodes
firewall-cmd --zone=public --add-port=51820/udp --permanent
# create a new zone for intr, add the intr interface to it
firewall-cmd --new-zone=intr --permanent
firewall-cmd --zone=intr --add-interface=intr --permanent
# allow docker swarm ports on it
firewall-cmd --permanent --zone=intr --add-service=docker-swarm --permanent
# create a policy that allows traffic between docker and intr interfaces
firewall-cmd --permanent --new-policy docker-intr --set-target=ACCEPT
firewall-cmd --permanent --policy docker-intr --add-ingress-zone intr
firewall-cmd --permanent --policy docker-intr --add-egress-zone docker
# change default policy of "docker" zone to drop
firewall-cmd --permanent --zone=docker --set-target=DROP
# for this example, allow socks5 on intr zone
firewall-cmd --permanent --zone=intr --add-port=1080/tcp --permanent
firewall-cmd --reload
上記のコマンドを実行した後、正常に動作しているようです。 Wireguard経由でアクセスしようとすると、ポートが開いています。
nc -vz -w1 10.1.2.1 1080`
Connection to 10.1.2.1 1080 port [tcp/socks] succeeded!
公開アドレスからアクセスしようとすると削除されます。
nc -vz -w1 my.server.com 1080`
Connection to my.server.com (1.2.3.4) port 1080 (tcp) timed out: Operation now in progress
ポート2377/tcp(swarm)も同様です。内部インターフェイスアドレスでは開いているように見えますが、パブリックアドレスでは拒否されます。
ただし、OSを再起動すると、次のことが発生します。
- 2377/tcp (docker swarm) は、docker の起動後も閉じたままです。
- 1080/tcp(ソックス)は、eth0を含むすべてのインターフェイスで開かれています(ソックスサービスコンテナの起動後)。
- ただし、
firewall-cmd --reload
1分後に実行すると、eth0で1080 / tcpが再びダウンします。
まだテストしていませんが、dockerスタックを終了して再起動すると、同じ問題が発生すると疑われます。
永久ファイアウォールの設定に応じて 1080/tcp をオフにする必要がありますが、docker によって動的にオーバーライドされます。これはどのように可能ですか?公式文書によると(https://docs.docker.com/network/packet-filtering-firewalls/#integration-with-firewalld)、dockerはファイアウォールと完全に統合されています。
私は何が間違っていましたか?