小規模LANの構築ノウハウ（２） Squid+SquidGuardで快適コンテンツフィルタ（adblock）環境を作る

# TL;DR

* 不要なコンテンツ（広告など）の取得をブロックするために，SquidとSquidGuardをゲートウェイとなるルータにインストールします
    * Squidでキャッシュもできますが，家庭内での利用であるから，ブラウザのキャッシュで十分だろうと判断し，特段の設定はせず，コンテンツフィルタのみを行います
        * キャッシュを使いたい場合は，/etc/squid/squid.confに必要な設定を追加することで，実現できます
    * 「小規模LANの構築ノウハウ」シリーズの続きですが，この記事だけ読むこともできます

# ネットワーク環境

* 以下のネットワーク構成で，ホストgwでSquid(Proxy)サーバを立てます
    * gwは Debian 9 がインストールされており，```eth1->eth0```のルーティングが行われている状態からスタートします
* プロキシする際，SquidGuardを参照し，登録した禁止ドメイン，禁止URLに対するリクエストは，別のアドレス（ローカルホストのWebサーバ）にリダイレクトすることで，アクセスしないようにします

![nw.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309617/3653a9e6-99b0-7c4f-0f52-4d031f422b2b.jpeg)

# Squid+SquidGuardのインストール

## パッケージマネージャでインストール

* ```aptitude```コマンドで，squid3とsquidguardをインストールします

```bash
aptitude install -y squid3 squidguard

# 設定ファイルのコピー
cp /etc/squid/squid.conf /etc/squid/squid.conf.orig
# squidguardの設定ファイルは新しく作るので，参考のためリネームしておく
mv /etc/squidguard/squidGuard.conf /etc/squidguard/squidGuard.conf.orig
```

## Squidの設定

* 以下のように設定ファイルを編集し，Squidの設定をします

```bash
vi /etc/squid/squid.conf

# TAG位置を検索して，該当する行を変更します
# squidGuardのリストにマッチした場合は，設定ファイルにしたがってURLを書き換えるように指定
url_rewrite_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf

acl CONNECT method CONNECT
# ↑の行の下に，アクセス許可範囲を記述
acl lan src 192.168.100.0/24
http_access allow lan

# 匿名性の向上
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

# 内部IPアドレスを通知しない
forwarded_for off
```

## SquidGuardの設定

### (必要であれば)nginxのインストール

* 禁止ドメインや禁止URLにヒットしたリクエストの転送先に，ローカルで稼働しているnginxを指定します
    * nginxを他の用途に使用しないのであれば，aptでインストールするだけです

```bash
# コンテンツフィルタした場合の表示用
# 特段設定しなくても80番は閉じているので，squid経由以外に外部からのアクセスはされない
aptitude install -y nginx
```

### SquidGuardの設定ファイル

* ```/etc/squidguard/squidGuard.conf```を新規に作成します
    * [ServerWorld Squid + SquidGuard](https://www.server-world.info/query?os=Ubuntu_18.04&p=squid&f=5)を参考にしました

```bash
/etc/squidguard/squidGuard.conf

# データベースの置き場所
dbhome /var/lib/squidguard/db
# ログファイルの置き場所
logdir /var/log/squidguard

dest deny{
  domainlist deny/domains # 禁止ドメインリスト
  urllist deny/urls       # 禁止URLリスト
}

acl {
  default {
    pass !deny all
    redirect http://localhost/index.html
  }
}
```

* 禁止ドメイン，禁止URLの空リストを```touch```コマンドで作ります
    * さらに，ログや設定ファイルの所有者をproxyにします
    * 記事の最後に，アクセス禁止ドメイン/URLの追加，更新方法を記載します

```bash
mkdir -p /var/lib/squidguard/db/deny
touch /var/lib/squidguard/db/deny/domains
touch /var/lib/squidguard/db/deny/urls
squidGuard -C all
chown -R proxy: /var/lib/squidguard /var/log/squidguard
```

# (必要であれば)Squid用のポートを開ける

* ```iptables```コマンドで，proxyポート（変えていないので3128/TCP）へのリクエスト受付を，internalネットワーク内部からのみ許可します

```
# 起動時に実行されるルーティング用スクリプトを編集
vi /usr/local/bin/fw.sh

# 以下の行を追加：internalネットワークからのみ，3128ポートへのアクセスを許可する
${IPTABLES} -A INPUT -s 192.168.100.0/24 -p tcp --dport 3128 -j ACCEPT
```

# Squid+SquidGuardの起動＋動作確認

* Squidサーバを稼働させます

```bash
# squidをいったん止める
/etc/init.d/squid stop
# キャッシュクリア
squid -z
# squidを再稼働する．エラーが出力されなければひとまずOK
/etc/init.d/squid start
```

* internalネットワークに接続されたマシンのプロキシ設定を，以下のように設定します
    * 任意のWebサイトにアクセスできること
    * ```/var/log/squid/access.log```に履歴が出力されることを確認します

| 設定名 | 値 |
|---|---|
| タイプ | HTTP Proxy |
| プロキシアドレス | 192.168.100.1 |
| プロキシポート | 3128 |

# アクセス禁止ドメイン，禁止URLの設定

1. アクセスを拒否したいドメインをdomainsに，拒否URLをurlsに1行ずつ書きます．
1. ```squidGuard``` コマンドで，リストの内容でデータベースを更新します
1. その後，squidをリロードし，データベースの内容でコンテンツフィルタを実施します

```bash
vi /var/lib/squidguard/db/deny/domains

xxx.org
yyy.net
ad.zzz.com

vi /var/lib/squidguard/db/deny/urls

www.foobar.co.jp
www.hogehuga.ne.jp

squidGuard -C all
/etc/init.d/squid reload
```

* 禁止ドメインは，サブドメインを含めて禁止します
    * 以下のように，禁止ドメインに指定した広告部分などが非表示になれば稼働しています
    * <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309617/d70a1eac-91a4-1ff2-e359-f7d7b8b8a517.png">

# 参考

* [ServerWorld Squid + SquidGuard](https://www.server-world.info/query?os=Ubuntu_18.04&p=squid&f=5)