目的
謎のライブラリやアプリケーションがどんなサーバーと通信しているのか監視したいなぁ...
と思ってそんな環境を作りました。
システム構成
docker で下記の2つのサービスを立てる
- squid コンテナ
- 通信制御用
- 開発用コンテナ
- ここでプログラムを実行する
ファイル構成
下記のようにファイルを配置
$ tree .
.
├── compose.yml
├── dev
│ └── Dockerfile
└── proxy
├── Dockerfile
├── squid.conf
└── whitelist.txt
compose.yaml
./compose.yaml
services:
squid-container:
build:
context: .
dockerfile: ./proxy/Dockerfile
ports:
- 3128:3128
networks:
- con-network
- iso-network
dev-container:
build:
context: .
dockerfile: ./dev/Dockerfile
networks:
- iso-network
tty: true
environment:
HTTP_PROXY: http://squid-container:3128
HTTPS_PROXY: http://squid-container:3128
http_proxy: http://squid-container:3128
https_proxy: http://squid-container:3128
networks:
iso-network:
name: iso_network
internal: true
con-network:
name: con_network
開発用 Dockerfile
apt install
の中身はネットワーク通信の確認用
./dev/Dockerfile
FROM mcr.microsoft.com/devcontainers/base:jammy
ENV TZ=JST
RUN apt update
RUN apt upgrade -y
RUN apt install -y curl iproute2 dnsutils
Squid 用 Dockerfile
squid の設定ファイルやホワイトリストはあらかじめコピーする
./proxy/Dockerfile
FROM ubuntu/squid
ENV TZ=JST
RUN apt update
RUN apt upgrade -y
RUN apt install -y curl
RUN mkdir /etc/squid/acl
COPY proxy/squid.conf /etc/squid/squid.conf
COPY proxy/whitelist.txt /etc/squid/acl/whitelist.txt
squid.conf
ホワイトリストに記載されたサイトだけを許可し、それ以外の通信は拒否。
./proxy/squid.conf
http_port 3128
acl whitelist dstdomain "/etc/squid/acl/whitelist.txt"
http_access allow whitelist
http_access deny all
whitelist.txt
ホワイトリストのファイルに通信をしてもいいサイトを記述していきます。
.がはじめについてるとサブドメインを許可。なければそのサイトだけ許可。
./proxy/whitelist.txt
.google.com
yahoo.com
実行!
docker compose up -d
通信ができるパターン
$ curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
通信ができないパターン
$ curl www.yahoo.com
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<meta type="copyright" content="Copyright (C) 1996-2021 The Squid Software Foundation and contributors">
(以下略)
通信ログの確認
下記のコマンドを確認すれば、通信状況が確認できます。
docker logs -f squid-container-1
あとは通信を監視したいプログラムを開発コンテナ内で実装をするだけ...かな?