ドッカーフィルターブロッカー
概要
外部からウェブページへのアクセスを遮断したい 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>終了状態
- 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とアクセスが遮断されていることがわかるようにすること。
-  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 するルールを設定する必要があります。