質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

dockerコンテナのポートを閉じるにはどのようにしたら良いでしょうか?

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 545

bws

score 52

誰かがmysqlのrootユーザーでログインしようとして失敗しています。

上の質問でmysqlのポートが空いているのが原因だということがわかりました。

ss -ltupnでポートの状態を確認したところ以下のようになっていました。

$ ss -ltupn

Netid State      Recv-Q Send-Q                         Local Address:Port                                        Peer Address:Port
udp   UNCONN     0      0                                  127.0.0.1:323                                                    *:*
udp   UNCONN     0      0                                        ::1:323                                                   :::*
tcp   LISTEN     0      128                                        *:10022                                                  *:*
tcp   LISTEN     0      100                                127.0.0.1:25                                                     *:*
tcp   LISTEN     0      128                                       :::443                                                   :::*
tcp   LISTEN     0      128                                       :::10022                                                 :::*
tcp   LISTEN     0      128                                       :::3306                                                  :::*
tcp   LISTEN     0      128                                       :::80                                                    :::*
tcp   LISTEN     0      100                                      ::1:25                                                    :::*

仮想サーバーのポートが利用されているということらしいので、調べてみたところdockerのmariadbのコンテナだということがわかりました。(コンテナを停止するとポートも閉じます)

以下のように3306ポートを閉じてみたのですが、変わらずアクセスできてしまいます。

dockerコンテナのポートを閉じるにはどのようにしたら良いでしょうか?

$ sudo firewall-cmd --add-port=3306/tcp --zone=public

$ ss -tlpn
State       Recv-Q Send-Q                                 Local Address:Port                                                Peer Address:Port
LISTEN      0      128                                                *:10022                                                          *:*
LISTEN      0      100                                        127.0.0.1:25                                                             *:*
LISTEN      0      128                                               :::443                                                           :::*
LISTEN      0      128                                               :::10022                                                         :::*
LISTEN      0      128                                               :::3306                                                          :::*
LISTEN      0      128                                               :::80                                                            :::*
LISTEN      0      100                                              ::1:25                                                            :::*

コード

// docker-compose.yml

version: "2"
services:
  proxy:
    image: jwilder/nginx-proxy
    container_name: proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs:ro
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
    restart: always

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt
    volumes:
      - ./certs:/etc/nginx/certs
      - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
      - proxy
    restart: always

  mysql:
    image: mariadb
    container_name: mysql
    command: >
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --max-allowed-packet=128M
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: database
    volumes:
      - ./mysql:/var/lib/mysql
    restart: always

networks:
  default:
    external:
      name: shared

追記

sudo  tail -f /var/log/messagesでアクセスログを確認しました。
誰かがrootでログインしようとしている為、アクセスできてしまうと判断していました。

Mar 21 12:47:09 tk2-401-41635 journal: 2019-03-21  3:47:09 1993 [Warning] Access denied for user 'root'@'138.197.72.201' (using password: YES)
Mar 21 12:47:11 tk2-401-41635 journal: 2019-03-21  3:47:11 1994 [Warning] Access denied for user 'root'@'185.41.250.46' (using password: YES)
Mar 21 12:47:12 tk2-401-41635 journal: 2019-03-21  3:47:12 1995 [Warning] Access denied for user 'root'@'185.41.250.49' (using password: YES)
Mar 21 12:47:17 tk2-401-41635 journal: 2019-03-21  3:47:17 1996 [Warning] Access denied for user 'root'@'149.210.179.131' (using password: YES)
Mar 21 12:47:25 tk2-401-41635 journal: 2019-03-21  3:47:25 1997 [Warning] Access denied for user 'root'@'68.183.78.175' (using password: YES)
Mar 21 12:47:39 tk2-401-41635 journal: 2019-03-21  3:47:39 1998 [Warning] Access denied for user 'root'@'91.223.68.140' (using password: YES)
Mar 21 12:47:46 tk2-401-41635 journal: 2019-03-21  3:47:46 1999 [Warning] Access denied for user 'root'@'157.230.16.196' (using password: YES)
・
・
・
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dyoshikawa

    2019/03/21 21:46

    portsとexposeは別機能ですよ。

    キャンセル

  • TaichiYanagiya

    2019/03/21 22:50

    Dockerfile の EXPOSE の意味です。
    外部に公開する必要がなければ ports は不要では?という意図です。

    キャンセル

  • bws

    2019/03/22 11:05

    portsが不要という点がとてもヒントになりました、ありがとうございます!

    キャンセル

回答 2

check解決した方法

0

Dockerでマストドンやってたら、遮断したはずのポートが丸見えだった件

リンクの方法でアクセスできないようにすることができました。

コード

// docker-compose.yml
.
.
.
ports:
 - "127.0.0.1:3306:3306"

Dockerコンテナは、独自にIPが振られている。
その独自のIPというのは、仮想ブリッジを使って実現している。
Dockerコンテナが開いている3000ポートなどは、
アプリがLISTENしているようなものではなく、
ルーティングによってフォワーディングされている。
iptablesでは、PREROUTINGチェーンでFORWARDかINPUTかを判別してる。
3000宛に来た通信は、INPUTじゃない
iptables的にはFORWARDで、仮想のIP当てに転送する通信なんだ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

firewall-cmdコマンドの使い方

ランタイムルールをパーマネントルールに保存、という項目がありますがこれでどうでしょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/21 19:03

    ありがとうございます!
    3.2 ランタイムルールをパーマネントルールに保存の手順通り行ったのですが、追記1のようにかわらずアクセスされてしまっていました。

    キャンセル

  • 2019/03/21 19:09

    アクセスされる、って自体は止めようがないので、
    実際にそれでログインができるのかどうかを見てみよう

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる