ドッカーフィルターブロッカー
概要
外部からウェブページへのアクセスを遮断したい 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 するルールを設定する必要があります。