はじめに

はじめに

はじめに

Docker コンテナ内でマイクロサービスが実行されており、Debian 10 OS を搭載した VM にデプロイされています。サーバーの IP アドレスは 141.45.146.55 です。

マイクロサービスは次の API を公開します。

GET https://<host>:8636/?username=<username>&password=<password>

これは、別のノード上の LDAP サーバーに対して LDAP 認証要求を実行します (例: ldaps://example.com:636)。example.com の IP アドレスは 141.45.11.192 です (これはサーバー上の nslookup example.com の出力です)。

マイクロサービスが実行されているサーバーのファイアウォールがオフの場合、すべて正常に動作しますが、ファイアウォールをオンにすると、HTTP 要求の実行中にマイクロサービスで次の例外が発生します。

javax.naming.CommunicationException: example.com:636 [Root exception is java.net.UnknownHostException: example.com]

ファイアウォールが、マイクロサービスと、ホスト ldaps://example.com:636 を持つリモート LDAP サーバー間の接続をブロックしているようです。

質問

これを機能させるには、ファイアウォール スクリプトにどのようなファイアウォール ルールを追加 (または削除) する必要がありますか? 完全を期すために、ファイアウォール スクリプトの内容を追加します。

iptables -F
iptables -t nat -F

iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

#
# Allow only 141.45.x.x
#
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 141.45.0.0/16 -j ACCEPT
#
iptables -A INPUT -p tcp -m tcp --dport 8443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8636 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables-save > /etc/firewall.conf
#
echo -n "#"      > /etc/network/if-up.d/iptables
echo -n !       >> /etc/network/if-up.d/iptables
echo /bin/sh    >> /etc/network/if-up.d/iptables
echo "iptables-restore < /etc/firewall.conf" >> /etc/network/if-up.d/iptables
#
chmod +x /etc/network/if-up.d/iptables
#

また、マイクロサービスはDockerコンテナ内で実行されていることにも言及したいと思います。ファイアウォールをオフにして VM を再起動するとすべて正常に動作しますが、ファイアウォールをオンにするとマイクロサービスが java.net.UnknownHostException をスローします。

root:~# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  141.45.0.0/16        anywhere
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:8443 state NEW,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:8636 state NEW,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER-USER (0 references)
target     prot opt source               destination

Chain DOCKER (0 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.18.0.2           tcp dpt:https
ACCEPT     tcp  --  anywhere             172.18.0.3           tcp dpt:postgresql
ACCEPT     tcp  --  anywhere             172.18.0.4           tcp dpt:https
ACCEPT     tcp  --  anywhere             172.18.0.5           tcp dpt:https

Chain DOCKER-ISOLATION-STAGE-1 (0 references)
target     prot opt source               destination

Chain DOCKER-ISOLATION-STAGE-2 (0 references)
target     prot opt source               destination

これまでやってきたこと

の javadoc を読んでみるとjava.net.UnknownHostException、次のように書かれています。

ホストの IP アドレスを特定できなかったことを示すためにスローされます。

そこで、ファイアウォールが DNS をブロックしている可能性があると考え、nslookup example.comマイクロサービスとファイアウォールが稼働しているサーバーで試してみました。残念ながら、ファイアウォールがオンのときは nslookup は機能します。example.com を解決します。

以下のルールも試してみました:

iptables -I INPUT -p tcp --sport 636 -j ACCEPT
iptables -I INPUT -p udp --sport 636 -j ACCEPT
iptables -I INPUT -p tcp --dport 636 -j ACCEPT
iptables -I INPUT -p udp --dport 636 -j ACCEPT

しかし、成功しませんでした。管理者は、ファイアウォールの背後(同じネットワーク内)にいるため、その必要はないと言っていましたが、私はマイクロサービスの開発者であり、管理者は Docker に精通していないため、ファイアウォールをオンにしてマイクロサービスを実行するのは私の責任です。

他に何かアイデアはありますか? 残念ながら Docker と関係があると思いますが、どう思いますか?

docker ps
CONTAINER ID   IMAGE                                     COMMAND                  CREATED      STATUS        PORTS                          
c67630f9118b   dawidlokiec/ldap-authentication-service   "/opt/docker/bin/lda…"   2 days ago   Up 18 hours   0.0.0.0:8636->443/tcp
and three other contains ...

なぜ Docker 固有のチェーンがいくつかあり、宛先アドレスが 172.18.0.X で、!= 141.45.XX であるのですか? これは問題ですか?

関連情報