ドッカーフィルターブロッカー

概要

外部からウェブページへのアクセスを遮断したい A さんは、iptables の設定をしました。しかし A さんの設定ではウェブページへのアクセスは意図したとおりに遮断できていないようです。A さんに代わってアクセス制御の設定をしてください。

A さんは以下のコマンドで iptables の設定をしたと言っています。

iptables -A INPUT -p tcp --dport 80 -j DROP

また、~/app にウェブページを作成するのに使用したファイルがまとまっています。

前提条件

  • ~/app 以下のファイルを変更しても良いが、ファイルを削除したり移動したりしないこと。

初期状態

prob12-host にて自身の IP アドレスに curl を実行するとウェブページにアクセスできる ( 以下のように結果が出力される )。

user@prob12-host:~$ curl 192.168.12.1:8080
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ICTSC-2021-WINTER</title>
</head>
<body>
<h1>Prob 12</h1>
<p>Please filter this page :)</p>
</body>
</html>

終了状態

  1. prob12-host にて curl を実行するとウェブページへのアクセスが iptables によって遮断される ( 以下のように結果が出力される )。
$ curl 192.168.12.1:8080
curl: (7) Failed to connect to 192.168.12.1 port 8080: Connection refused

この出力と同じようにConnection refusedとアクセスが遮断されていることがわかるようにすること。

  1. localhost を指定してアクセスした場合はアクセスできる。
$ curl localhost:8080
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ICTSC-2021-WINTER</title>
</head>
<body>
<h1>Prob 12</h1>
<p>Please filter this page :)</p>
</body>
</html>

上記 1. 2. の状態が永続化されていること。

解説

初期状態で docker-compose.yaml はこのようになっています。

version: '3'
services:
  ictsc-web-app:
    image: ictsc-web-app:latest
    container_name: ictsc-web-app
    restart: always
    ports:
      - "8080:80"

8行目の ports ディレクティブでは IP アドレスを指定しない場合に 0.0.0.0 にポートがバインドされます。

よって以下のように ports ディレクティブを変更することで、iptables のルールを変更することなく問題を解決できます。

ports:
      - "127.0.0.1:8080:80"

別解

この問題では iptables のルール変更を禁止していないので、iptables のルールを変更することでも問題の解決が可能です。

/etc/iptables/rules.v4 に変更を加えます。

# -A INPUT -p tcp -m tcp --dport 80 -j DROP
-A INPUT -p tcp -m tcp --dport 8080 -j REJECT

ただしこの場合には終了条件からパケットを DROP ではなく、REJECT するルールを設定する必要があります。