次のコマンドを使用して実行されたdockerインスタンス内でWebサービスが実行されています。
Sudo docker run -d -p 4040:4040 ....
私のUFWルールは次のようになります。
~ Sudo ufw status
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
4040 DENY Anywhere
22 ALLOW Anywhere (v6)
4040 DENY Anywhere (v6)
IP経由で直接ボックスにアクセスすると、ポート4040にアクセスできます。なぜufwルールがブロックしないのですか?
注:Dockerインストールの一環として、私は変更しました
DEFAULT_FORWARD_POLICY = "DROP"からDEFAULT_FORWARD_POLICY = "ACCEPT"
ここのドッカーの指示に従って/ etc/default/ufwにあります( http://docs.docker.io/en/latest/installation/ubuntulinux/#docker-and-ufw )
同じ問題があり、代わりにIPTABLESを使用して解決しました。
ソースIP xxx.xxx.xxx.xxxからのみ3306を許可する例:
FORWARDチェーンの1行目にIPに一致するソースの受け入れを追加します
iptables -I FORWARD 1 -p tcp -i eth0 -s xxx.xxx.xxx.xxx --dport 3306 -j ACCEPT
そのポートのFORWARDチェーン上の他のすべての接続をドロップします
iptables -I FORWARD 2 -p tcp -i eth0 --dport 3306 -j DROP
行番号(1および2)を使用すると、次のような規則がdockerによって作成された規則の上に追加されます。
-A FORWARD -d 0.0.0.0/32! -i docker0 -o docker0 -p tcp -m tcp --dport 3306 -j ACCEPT
これに関連する既知の問題があります。基本的に、DockerはUFWの背後でIptablesを構成しています。
詳しくは:
考えられる短い応答:
Set DEFAULT_FORWARD_POLICY="ACCEPT" in /etc/default/ufw
Set DOCKER_OPTS="--iptables=false" in /etc/default/docker
特定のIPでコンテナを実行してみてください。
docker run -d -p 127.0.0.1:4040:4040 ...