MySQLとSSH/SFTPを提供するDockerを備えたUbuntuサーバーがあり、06と22を除くすべてのポートをファイアウォールで保護する必要があります。かなり標準的で簡単な要件ですよね?
今、私は ソリューションの種類 を見つけることができましたが、それを適用した後のように、それは私にとって完全に機能しません:
iptables: false
in Docker'sdaemon.jsonconfig file)他の多くの検索結果を試しましたが、ほとんどが非常に複雑であるため、彼らが何をしているのか理解できません。
提案されたソリューションはかなりシンプルで理解しやすいように見えますが、Dockerネットワーキング全体の複雑さがデバッグをはるかに困難にしています。
誰かがDockerホストの実際のiptablesルールを共有したり、少なくとも正しい方向に導いてくれますか?
私はdocker-composeを使用してサービスを起動し、これが私のyamlです。
version: '3.7'
services:
mysql:
container_name: 'mysql'
image: mysql:8.0.13
command: --default-authentication-plugin=mysql_native_password
user: 1000:1000
ports:
- "3306:3306"
volumes:
- ./data:/var/lib/mysql
- ./config/custom.cnf:/etc/mysql/conf.d/custom.cnf
networks:
- database
restart: always
networks:
database:
driver: bridge
編集:私が見つけたのは、Dockerがiptablesルールを管理できるようにすることをお勧めします。少なくとも長期的にはそれほど要求が厳しくなく、Dockerで実行していなくても、Dockerに必要なポートを開かせることができます。私が好む方法、それはまだ有効です。この時点で私が知りたいのは、Doctableによって開かれたポートをブロックするためにiptablesを使用することが可能かどうか、そしてどのように(おそらくマングルプレルーティングを介して?)助言がありますか?トンありがとう!
コンテナー内からインターネットにアクセスできません(Dockerのdaemon.json構成ファイルにiptables:falseを指定した場合)
Dockerは、iptablesを使用してネットワークを構成します。これには、NAT外部ネットワークへのアクセスおよび外部ネットワークからのアクセスを処理するためのルール、Dockerネットワーク上で相互にコンテナーアクセスを構成するための他の多くのルールが含まれます。デフォルトでは、このアクセスはオープンですが、外部アクセスとコンテナー間通信を制限するネットワークを作成するときのオプションです。したがって、Dockerでiptables
オプションをfalseに設定することはお勧めしません。
ホスト上のポートを公開すると、外部からのアクセスが暗黙的に許可されます。したがって、外部アクセスを回避する最も簡単なオプションは、ポートを公開しないことです。ポートを特定のインターフェースに公開できます。 127.0.0.1:8080:80
これは、ホストのループバックインターフェイスでポート8080を公開します(127.0.0.1
)をコンテナのポート80に接続し、そのループバックインターフェイスには外部からアクセスできません。ただし、ポートを非公開のままにすることができない場合は、iptablesを使用してこれを行うことができます。
この時点で私が知りたいのは、iptablesを使用してDockerによって開かれたポートをブロックできることと、
これは、DOCKER-USER
フィルターチェーン。次のような例があります。
$ iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.0/24 -j DROP
次のドキュメントから: https://docs.docker.com/network/iptables/
フィルタールールの前に実行されるいくつかのマングリングルールによってポートが変更されることに注意してください。ポートでフィルタリングしたい場合は、conntrackを使用して元の宛先ポートを取得する必要があります。
$ iptables -A DOCKER-USER -i eth0 -s 10.0.0.0/24 -p tcp \
-m conntrack --ctorigdstport 8080 -j ACCEPT
$ iptables -A DOCKER-USER -i eth0 -p tcp \
-m conntrack --ctorigdstport 8080 -j DROP