アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

Dockerとufwでポートのアクセス制御をする方法

docker-composeでサーバーでMariaDBを立ち上げて、外部からアクセスされたくないが、サーバー内ではアクセスさせたいといった事がしたかった。

問題のある設定

以下のように設定しました。

version: "3"
services:
  db:
    image: mariadb:10.7
    volumes:
      - ./data/db:/var/lib/mysql
    environment:
      MARIADB_ROOT_PASSWORD: hoge
    ports:
      - 3306:3306

ufw でdefault denyにしていたので、これだけで外部からのアクセスができないと思いましたが、アクセスできてしまいました。
dockerはiptablesを見るため、ufwでの設定は関係有りませんでした。

解決策

以下のリポジトリを参考に設定しました。
https://github.com/chaifeng/ufw-docker

/etc/ufw/after.rules の末尾に以下を追加しました。

# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP

COMMIT
# END UFW AND DOCKER

コンテナ内からlocalhostへのアクセスを許可する

ローカルに別のコンテナでDBを立てていて、上記の設定だけではアクセスがブロックされるので、以下のコマンドで設定を追加します。

ufw allow from 172.0.0.0/8

docker-compose.yml でサブネットも指定してあげましょう。

networks:
  default:
    ipam:
      config:
        - subnet: 172.50.0.0/24