Windows 8.1でプロキシサーバーを構築する

動機

  • プロキシサーバというものはどのようにして構築するのか試したかった。
  • LinuxはよくわからないのでWindows。
  • インターネット閲覧でブラックリスト、ホワイトリスト方式のフィルタリングをどのように実現するのかを試してみたかった。
  • アクセスログを取集してみたかった。

 

プロキシサーバソフト

Squidを使用する。Delegateという日本人が開発した方を使いたかったが、解説サイトがあまりないので、Squidにした。

 

 

プロキシサーバ構築

 

Squid for Windows をダウンロード

Squid for Windows
http://squid.acmeconsulting.it/index.html の Squid Downloads  → mirror 1 → 2.7STABLE8 の Standard をダウンロード

01

02

03

 

ダウンロードしたファイルを展開

squid-2.7.STABLE8-bin.zip を 解凍し、フォルダ squid を c:\ にコピーする。ここでは c:\ にしたが、任意の場所で構わない。
04

設定ファイルのファイル名を変更する

C:\squid\etc にある

  • mime.conf.default → mime.conf
  • squid.conf.default → squid.conf
  • cachemgr.conf → cachemgr.conf

 

 

設定ファイルを編集

squid.conf をメモ帳などで開く

※#はコメント行
※検索では複数検索されるが、図の部分を検索

LAN環境のサブネットを登録

Ctrl + F で acl localnet を検索する。LAN環境のサブネットを「localnet」という定義名で登録する。
うちのLAN環境は 192.168.11.xx/24 なので
acl localnet src 192.168.0.0/16 → acl localnet src 192.168.11.0/24 に修正する。
多分その上の
acl localnet src 10.0.0.0/8    # RFC1918 possible internal network
acl localnet src 172.16.0.0/12    # RFC1918 possible internal network
は不要だけど残しておく。同じ定義名を複数記述すると、どれも登録されるということみたい。
09 → 10

Squidのポートを設定する

http_port を検索する。ここではデフォルトの3128のままにした。
06

このポートはブラウザのプロキシ設定で指定するポート番号になる。
IE設定3

ログファイルのローテーション周期を指定する

logfile_rotate  を検索する。ここではデフォルトの10にするが、時間的なローテーション周期は不明。なお、コメントアウトされているので、# をとるだけ。
07 → 08

visible_hostname を検索する

unknown にすると、ホスト名が相手方に unknown と通知される。任意の名前でOK。
11 → 12

 

Squidに必要なフォルダを生成する

コマンドプロンプトを起動し

C:\squid\sbin>squid -z

必要なフォルダが生成される。

 

Squidをサービスに登録する

コマンドプロンプトを管理者モードで起動し

C:\squid\sbin>squid -i

サービスから削除するには

C:\squid\sbin>squid -r

 

Squidのサービスを開始する

コマンドプロンプトを管理者モードで起動し

net start squid

サービスを停止する場合は net stop squid
設定ファイルを修正した場合は、Squidを再起動する必要がある。

これでプロキシサーバーの Squid が起動した状態。

なお、Squidを稼働させているパソコンのIPアドレスは 192.168.11.8 。

 

別のパソコンからSquidを経由してネットにアクセス

 

IEにプロキシ接続を設定

IEのインターネットオプション
IE設定

接続タブ → LANの設定
IE設定2

下図のようにSquidを起動しているパソコンのIPアドレスとポートを指定する。「ローカルアドレスにはプロキシサーバを使用しない」にチェックすると、イントラネット上のWebサービスにアクセスする場合、プロキシを経由しない。
IE設定3

ローカルイントラネット上のWebサイトはプロキシの対象外。ちなみにこれは自作のWebアプリ。
ローカル01ローカル02

インターネットにアクセス

プロキシサーバーは応答していないとでる。
FireWall0

プロキシサーバ(Squid)を起動しているパソコンのWindowsファイアーウォールでTCPポート3128受信を許可していないからである。

下図の手順でプロキシサーバ(Squid)を起動しているパソコンのWindowsのファイアーウォールでTCPポート3128受信を許可する
FireWall1
FireWall2
FireWall3
FireWall4
FireWall5
FireWall6
FireWall7
FireWall8

プロキシ接続できた。
プロキシ接続01

 

Webフィルタリングする

設定ファイル squid.conf でフィルタリングを設定する。

デフォルト定義

デフォルト定義だとプロキシ経由でインターネット接続できる。

  • acl 定義名 定義種別 種別に応じた値
    (定義種別)
    • src:IPアドレス
    • port:ポート番号
    • dstdomain:ドメイン
    • url_regex:URL
  • http_access allow 定義名:許可
  • http_access deny 定義名:拒否

allowとdenyは記述順に優先される。

デフォルト定義 ※コメントは削除した

acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32

acl localnet src 10.0.0.0/8    # RFC1918 possible internal network
acl localnet src 172.16.0.0/12    # RFC1918 possible internal network
acl localnet src 192.168.11.0/24    # RFC1918 possible internal network

acl SSL_ports port 443
acl Safe_ports port 80        # http
acl Safe_ports port 21        # ftp
acl Safe_ports port 443        # https
acl Safe_ports port 70        # gopher
acl Safe_ports port 210        # wais
acl Safe_ports port 1025-65535    # unregistered ports
acl Safe_ports port 280        # http-mgmt
acl Safe_ports port 488        # gss-http
acl Safe_ports port 591        # filemaker
acl Safe_ports port 777        # multiling http
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

http_access allow localnet

http_access deny all

 

フィルタリングしてみる

クライアントPCのIPアドレスは 192.168.11.5.

http_access allow localnet → #http_access allow localnet コメントアウトする。

localnetは 192.168.11.0/24 なので、クライアントPCは定義名 localnet に含まれる。

http_access allow localnet をコメント化されるので、次の行の http_access deny all が適用される。定義名 all は acl all src all なので、すべてのIPが拒否されるということになる。

なお、定義を修正したらsquidを再起動する。
サービス再起動

この状態でアクセスするとフィルタリングされてアクセスできない。
フィルタリング01

http_access allow localnet を有効化し、acl Safe_ports port 80 をコメントアウトするとアクセスできない。これは http_access deny !Safe_ports で safe_ports でないポートを拒否するようにしているため。「acl Safe_ports port 80        # http」をコメントアウトすると定義名 acl Safe_ports にはポート番号 80 は含まなれなくなるので、インターネットアクセスができなくなる感じ。
フィルタリング01

 

ドメイン指定でフィルタリングする

yahoo.co.jp と bing.com を拒否する

acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32

acl localnet src 10.0.0.0/8    # RFC1918 possible internal network
acl localnet src 172.16.0.0/12    # RFC1918 possible internal network
acl localnet src 192.168.11.0/24    # RFC1918 possible internal network

acl SSL_ports port 443
acl Safe_ports port 80        # http
acl Safe_ports port 21        # ftp
acl Safe_ports port 443        # https
acl Safe_ports port 70        # gopher
acl Safe_ports port 210        # wais
acl Safe_ports port 1025-65535    # unregistered ports
acl Safe_ports port 280        # http-mgmt
acl Safe_ports port 488        # gss-http
acl Safe_ports port 591        # filemaker
acl Safe_ports port 777        # multiling http
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

#bingとyahooを遮断
acl denyDomain dstdomain www.yahoo.co.jp .bing.com
http_access deny denyDomain

http_access allow localnet

http_access deny all

フィルタリング01

ちなみに http_access allow localnet を先に書くとLAN上のPCからのアクセスはすべて許可するので、bing.com と yahoo.co.jp は拒否されない。記述する順番に注意。

・・・・・・

http_access allow localnet

#bingとyahooを遮断
acl denyDomain dstdomain www.yahoo.co.jp .bing.com
http_access deny denyDomain

・・・・・・

フィルタリング02

 

URLフィルタ

http_access allow localnet
http_access deny all

よりも上に下記を追加。

#urlに yahoo があるのを遮断
acl denyRegx url_regex yahoo
http_access deny denyRegx

URLに yahoo が含まれる yahoo.co.jp も yahoo.com も拒否される。
フィルタリング03フィルタリング04

bingで yahoo を検索 を検索してもフィルタリングされる。URLパラメータもフィルタ対象になるようだ。
http://www.bing.com/search?q=yahoo&qs=n&form=QBLH&pq=yahoo&sc=0-4&sp=-1&sk=&cvid=e8a0827c496b42a9ac45930deafe4ff0
フィルタリング05

ただし、Googleだとフィルタされない。Googleで Yahoo を検索。Yahooは検索できるが、検索結果をクリックすると、遮断された。
https://www.google.co.jp/?gws_rd=ssl#q=yahoo
フィルタリング06
フィルタリング03

Squidのログ

1411054269.454 236673 192.168.11.5 TCP_MISS/200 425280 CONNECT www.google.co.jp:443 - DIRECT/74.125.235.111 -
1411054269.454 151626 192.168.11.5 TCP_MISS/200 14090 CONNECT encrypted-tbn1.gstatic.com:443 - DIRECT/173.194.38.68 -
1411054269.454 151594 192.168.11.5 TCP_MISS/200 9344 CONNECT encrypted-tbn2.gstatic.com:443 - DIRECT/173.194.38.70 -
1411054269.454 151391 192.168.11.5 TCP_MISS/200 8903 CONNECT encrypted-tbn0.gstatic.com:443 - DIRECT/173.194.38.65 -
1411054269.454 151391 192.168.11.5 TCP_MISS/200 8536 CONNECT encrypted-tbn3.gstatic.com:443 - DIRECT/173.194.38.71 -
1411054395.782      0 192.168.11.5 TCP_DENIED/403 1391 GET http://www.google.co.jp/url? - NONE/- text/html

Google で Yahoo を検索した時のIEの開発者ルールキャプチャ
開発者01

 

許可リストにあるもののみ許可する

bing.com yahoo.co.jp cman.jp だけ通し、それ以外は遮断。http_access allow localnetをコメントアウトする。
acl whiteList dstdomain .bing.com .yahoo.co.jp .cman.jp
http_access allow whiteList

#http_access allow localnet

Googleは遮断される。
フィルタリング10

Bingには接続できる。
フィルタリング02

cman.jpに接続しているが、cman.jpでないドメインの広告が除外されている。
ホワイトリスト01プロキシ接続01

 

SSL接続を遮断してみる

acl SSL_ports port 443
acl Safe_ports port 80        # http
acl Safe_ports port 21        # ftp
acl Safe_ports port 443        # https
acl Safe_ports port 70        # gopher
acl Safe_ports port 210        # wais
acl Safe_ports port 1025-65535    # unregistered ports
acl Safe_ports port 280        # http-mgmt
acl Safe_ports port 488        # gss-http
acl Safe_ports port 591        # filemaker
acl Safe_ports port 777        # multiling http
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
#http_access deny CONNECT !SSL_ports

http_access deny CONNECT SSL_ports

#urlにyahooがあるのを遮断
acl denyRegx url_regex yahoo
http_access deny denyRegx

http_access allow localnet

GoogleはSSL接続なので遮断される。
フィルタリング07

 

とりあえず、プロキシを稼働させてみた。運用するわけでないので、さらなる追及はまた今度。

このブログの人気の投稿

ダブルクォーテーションで括られたCSVカ​ンマ区切りテキストファイルを SQL Server で Bulk Insert する方法

PowerShellでTSV/CSVの列を絞り込んで抽出し、(先頭/行末)からN行出力する

エアコン室外機のフロンガス銅管を覆うカバーを交換しました