AWS Squid on EC2でプロキシサーバ構築

[AWS VPC環境構築 ピアリング接続](https://qiita.com/tanj/items/1130c0e673f0d5e37f26)でPublic VPC、Private VPCをそれぞれ作成し、接続可能な環境を構築しました。Private VPCのEC2上にクローラを動かして、NATGateway通してインターネット接続しています。
今回はPublic VPC上にプロキシサーバを導入し、より安全なインターネット接続環境を実現したいです。

今回利用するプロキシサーバーソフトは[Squid](https://ja.wikipedia.org/wiki/Squid_%28%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%29)です。SquidはWebプロキシ、キャッシュプロキシ、リバースプロキシとしても利用できます。

##環境構成
EC2はすべてWindows Server 2012を使い、Crawler BotはC#で作られています。

| インスタンス | Private IP | 説明 |
|:-----------|:-----------|:-----------|
|sample-proxy-ec2|10.100.0.19|プロキシサーバ|
|sample-private-ec2|10.100.1.12|CrawlerBotサーバ|

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/191079/f5e4ccf1-57ba-ff63-3c8f-5e36da6b1291.png)

##Squidインストール
SquidはUnixベースのシステムで動作するように設計されいますが、Windows 版のSquid については、[squid-cache wiki](https://wiki.squid-cache.org/KnowledgeBase/Windows#Squid-3.5)から辿ることができるようです。
squid.msiをダウンロードして実行しますと、ウィザードに従いインストールします。
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/191079/e3da6cb4-1be8-e76c-c46a-c2b571c03cda.png)
インストール後起動され、Desktopの右下にアイコンが表示され、右クリックすると設定メニューが表示されます。
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/191079/50186800-b5d7-f7c9-82ca-212561f9bf71.png)
Open Squid Configurationでsquid.confを開き編集できます。

##Squidの設定
Open Squid Configurationでsquid.confを開き、
**1.許可するネットワークを指定します**

```text:squid.conf
#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed

#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.0.0/16# RFC1918 possible internal network
acl localnet src 10.100.0.0/24  # Public VPC
acl localnet src 10.100.1.0/24  # Private VPC
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
...
```
デフォルトのネットワークをコメントアウトして、許可するネットワークを指定します。
**acl localnet src 10.100.0.0/24**
**acl localnet src 10.100.1.0/24**

**2.Squidの待ち受けポート番号設定**

```text:squid.conf
...
# Squid normally listens to port 3128
# http_port 3128
http_port 8080
...
```
ここで8080を利用

##FirewallとSecurityGroupの設定
**1. Firewall**
プロキシサーバにログインし、コントロールパネルから「Windows ファイヤーウォール」をクリック、詳細設定の画面で「受信の規則」に8080のTCPルール「Squid Proxy Port」を新規追加
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/191079/b4045308-f291-82fb-8249-67419e028293.png)
プロトコルおよびポートでローカルポートを3128から8080に修正
![image5.png](https://qiita-image-store.s3.amazonaws.com/0/191079/4c692ce2-be04-eddd-e3b1-99faa1884116.png)

**2. SecurityGroup**
sample-proxy-ec2のSecurityGroupを開き、Inboundルールに8080を追加
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/191079/7d5adbaf-6a68-50a4-6308-fcfd7dda8cb4.png)

##疎通確認
まずIEのインターネットオプション – [接続]タブの、「LAN の設定」をクリックし Squid を経由する設定を行います。
![image7.png](https://qiita-image-store.s3.amazonaws.com/0/191079/5f3374ae-eb17-65a1-d264-9a0acb8ad9ec.png)
無事インターネットアクセスができました。

CrawlerBotのプログラムも特に調整なしに動いた！

```c#:SampleCrawlerBot.cs
using System;
using System.Net;
using System.Windows.Forms;
using System.IO;

namespace SampleCrawlerBot
{
    public partial class CrawlerBot : Form
    {
        private Logger logger;

        public CrawlerBot()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Crawl html from url
        /// </summary>
        public void Crawl()
        {
            logger = new Logger();
            string url = "https://office.yahoo.co.jp/";
            try
            {
                HttpWebRequest req = (HttpWebRequest)System.Net.WebRequest.Create(url);
                req.Method = "GET";

                HttpWebResponse res;
                //サーバーからの応答を受信するためのWebResponseを取得
                res = (HttpWebResponse)req.GetResponse();

                StreamReader reader = new StreamReader(res.GetResponseStream());
                
                logger.Write(reader.ReadToEnd());
                req.Abort();
            }
            catch (Exception ex)
            {
                logger.Write(ex.ToString());
            }
        }
    }
}

```

##参考記事
* [Windows用のSquid](http://squid.robata.org/squid_win.html)
* [Squid で安全なインターネットアクセス環境を構築する方法](http://blog.cybozu.io/entry/2017/02/03/080000)
* [ネットワークエンジニアとして ― Proxy Server](http://www.infraexpert.com/study/security23.html)