web-dev-qa-db-ja.com

Dockerホストの適切なiptablesルールとは何ですか?

MySQLとSSH/SFTPを提供するDockerを備えたUbuntuサーバーがあり、0622を除くすべてのポートをファイアウォールで保護する必要があります。かなり標準的で簡単な要件ですよね?

今、私は ソリューションの種類 を見つけることができましたが、それを適用した後のように、それは私にとって完全に機能しません:

  1. 上記のサービスにアクセスできない(デフォルト)
  2. コンテナ内からインターネットにアクセスできません(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を使用することが可能かどうか、そしてどのように(おそらくマングルプレルーティングを介して?)助言がありますか?トンありがとう!

2
dzhi

コンテナー内からインターネットにアクセスできません(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

参照: iptablesを使用してDockerコンテナーへの外部接続を制限する手順?

1
BMitch