![はじめに](https://rvso.com/image/1642392/%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB.png)
はじめに
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 であるのですか? これは問題ですか?