概要


前提


プロキシ: クライアントの代理

ネットワーク例

クライアント(ブラウザ等) -- Squid -- インターネット -- サーバ

機能


リバースプロキシ: サーバの代理

ネットワーク例

クライアント(ブラウザ等) -- インターネット -- Squid -- サーバ群

機能


インストール

Dockerfile

FROM alpine:3.11
RUN apk update && apk add squid squid-lang-ja squid-doc man
WORKDIR /etc/squid/
CMD ["squid", "-N"]

ビルド

image=my-squid
docker build --tag $image:latest .

# コンテナシェルを試す
docker run --rm -it $image sh

設定ファイル: /etc/squid/

Dockerホストへコピー

conName=temp-squid  dir=etc-squid

docker run --rm -dit --name $conName $image sh
docker cp $conName:/etc/squid/ ./$dir
docker stop --time 0 $conName

ファイアーウォール

# サービス情報
firewall-cmd --info-service squid
# publicゾーンの場合
firewall-cmd --zone=public --add-service=squid
firewall-cmd --runtime-to-permanent # 恒久化

Dockerコンテナ起動

image=my-squid  dir=etc-squid
conName=temp-squid  logVolume=squid-log

CMD="squid -N"
network="--network host" # ホストモードの場合
network="--publish 3128:3128"

docker run --rm -dit --name $conName \
  --mount type=bind,source="$PWD/$dir",target=/etc/squid \
  --mount type=volume,source=$logVolume,target=/var/log/squid \
  $network $image $CMD

squidコマンド


squid.confのデフォルト動作


ncatで簡易Webサーバ起動の例

port=8080 # 例
# --listen:リッスン, --keep-open:リッスン維持
# --sh-exec 接続時実行コマンド
ncat -lkv -c "echo Hello\!" $port # クライアント側でcurlするとHello!表示
# クライアント
curl --proxy $proxy:$port $url

ブラウザでプロキシ利用の設定: FireFox例


ログ: /var/log/squid/

cache.log

access.log

# access.log例
1584093990.961  0 クライアントIP TCP_MEM_HIT/200 1808 GET http://example.com/ - HIER_NONE/- text/html
  1. タイムスタンプ: UTC
  2. 経過時間(ミリ秒): Squidがリクエスト受けてからレスポンスするまで
  3. クライアントIPアドレス
  4. Squid結果コード/HTTPステータスコード: /区切り
    • 結果コードは_区切り
      • DENIED: アクセスコントロールで拒否
      • MISS: 宛先からのレスポンスでレスポンス
      • MEM_HIT: メモリキャッシュでレスポンス
      • TUNNEL: TLS接続にて
  5. データサイズ合計(バイト)
  6. リクエストメソッド
  7. リクエストURL
  8. 認証などのユーザ
  9. 階層コード
    • NONE: 結果コードでDENIEDNONEのときなど
    • DIRECT: 宛先から直接
  10. HTTPレスポンスヘッダのコンテンツタイプ

ログローテーション


error_default_language: エラーページHTMLの言語

# squid.conf
error_default_language ja

HTTPリクエストヘッダ

squid.confで変更