0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

サーバー構築:TerraformとSquidを活用したAWS基盤上のプロキシサーバーの構築とアクセスログ確認

Posted at

はじめに

今回は、AWSのクラウド基盤上に Squid というミドルウェアを使い、プロキシサーバーを構築していきます。

この検証では、主にネットワークの観点から技術的な学びを深めるとともに、自分自身の復習を兼ねて体系的にまとめています。

この記事は個人レベルの検証内容に基づいています。 そのため、内容が実運用環境に適さない場合があることをご了承ください。

この内容が、どなたかの技術的な参考になれば幸いです。

書こうと思ったきっかけ

普段、自宅のローカルエリアネットワーク内では Squid を使ってプロキシサーバーを構築しています。

一部の端末は、このプロキシサーバーを経由してインターネットに接続するようネットワークを設定しています。

しかし、以前から「AWSのパブリッククラウド上に自分専用のプロキシサーバーを構築したい」と考えていました。時間が取れたので、この機会に実際に構築してみることにしました。

実は以前、一度挑戦した際に、Squidの設定ファイルの編集中にエラーが発生し、挫折した経験があります...。

しかし、今回はその問題を解決したため、改めて手順を整理し、備忘録として記事にまとめることにしました。

プロキシサーバーについて

プロキシサーバーは、クライアントとインターネットの間に位置し、通信を中継するサーバーです。

image.png
引用画像:https://www.gate02.ne.jp/media/it/column_107/

これにより、以下のような利点があります:

  • アクセス制御:特定の端末やサイトへのアクセスを制限。
  • 匿名性の確保:クライアントのIPアドレスを隠蔽。
  • 通信監視・ログ記録:ネットワーク利用状況の可視化。
  • キャッシュ機能:データの一時保存により通信速度を向上。

特に企業では、セキュリティの向上やネットワークトラフィックの最適化に広く活用されています。

なお、前回自宅に構築した際の手順は、過去の記事にまとめています。興味のある方は、ぜひ参考にしてみてください!

今回使うコードについて

今回使用するコードは、シンプルなシングル構成で、検証目的に特化して作成しています。

今回は、AWSの基本的なネットワーク構成からEC2インスタンスの構築までを、Terraformを使用して一括で構築します。

ただし、それ以降のOS内部の細かい設定やファイル編集などは手動で行います。この手順については、後ほど詳しく説明します。

また、associate_public_ip_address = true という設定を使用することで、インスタンスにパブリックIPアドレスが自動的に割り当てられるようにしています。

main.tf
provider "aws" {
  region = "ap-northeast-1" # Tokyo region
}

# VPC作成
resource "aws_vpc" "main_vpc" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "terraform-main-vpc"
  }
}

# サブネット作成 (パブリックサブネット)
resource "aws_subnet" "public_subnet" {
  vpc_id                  = aws_vpc.main_vpc.id
  cidr_block              = "10.0.1.0/24"
  map_public_ip_on_launch = true

  tags = {
    Name = "terraform-public-subnet"
  }
}

# インターネットゲートウェイ作成
resource "aws_internet_gateway" "main_igw" {
  vpc_id = aws_vpc.main_vpc.id

  tags = {
    Name = "terraform-main-igw"
  }
}

# ルートテーブル作成
resource "aws_route_table" "public_route_table" {
  vpc_id = aws_vpc.main_vpc.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.main_igw.id
  }

  tags = {
    Name = "terraform-public-route-table"
  }
}

# サブネットとルートテーブルの関連付け
resource "aws_route_table_association" "public_association" {
  subnet_id      = aws_subnet.public_subnet.id
  route_table_id = aws_route_table.public_route_table.id
}

# セキュリティグループ作成
resource "aws_security_group" "public_sg" {
  vpc_id = aws_vpc.main_vpc.id

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"] # HTTPアクセスを許可
  }

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"] # SSHアクセスを許可
  }

  ingress {
    from_port   = 3128
    to_port     = 3128
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"] # カスタムTCP (ポート3128) を許可
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"] # すべてのアウトバウンドを許可
  }

  tags = {
    Name = "terraform-public-sg"
  }
}

# EC2インスタンス作成
resource "aws_instance" "proxy_ec2" {
  ami                         = "ami-08f52b2e87cebadd9" # Amazon Linux 2023 AMI (Tokyo region)
  instance_type               = "t2.micro"
  subnet_id                   = aws_subnet.public_subnet.id
  security_groups             = [aws_security_group.public_sg.id]
  associate_public_ip_address = true # パブリックIPv4アドレスを有効化

  depends_on = [aws_security_group.public_sg] # 修正: セキュリティグループに依存

  tags = {
    Name = "terraform-proxy-ec2"
  }
}

※補足
セキュリティグループの設定で、ingressにカスタムTCPポート3128を追加することで、ポート3128のTCP通信がすべてのIPアドレスから許可されるようになります。

OS内部の設定について

Squidのインストール

EC2インスタンスには、Instance Connectを使用して接続します。接続後、まずパッケージを更新します。

sudo dnf update -y

次に、Squidをインストールします。

sudo dnf install squid -y

Squidの設定

まず、Squidの設定ファイルを編集します。

sudo vi /etc/squid/squid.conf

外部ネットワークからのアクセスを許可する設定

デフォルトでは、Squidは localhost からのリクエストのみを許可しています。そのため、外部クライアントからアクセスを許可するためには、http_access セクションに適切なルールを追加する必要があります。

変更箇所 1: 外部ネットワークアクセスを許可

変更前

デフォルト設定では、http_access allow localnet がコメントアウトされています。

/etc/squid/squid.conf
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
# http_access allow localnet

変更後

http_access allow localnet を有効化し、コメントを外します。

/etc/squid/squid.conf
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
http_access allow localnet

変更箇所 2: グローバルIPアドレスを許可

変更前

現在のSquid設定では、接続元のグローバルIPアドレスを許可するACLが記載されていません。

/etc/squid/squid.conf
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
# For example, to allow access from your local networks, you may uncomment the
# following rule (and/or add rules that match your definition of "local"):
http_access allow localnet

変更後

以下のように、特定のグローバルIPアドレスを許可するACLを追加します。

acl allowed_ip src <グローバルIPアドレス> で許可したいIPアドレスを指定し、http_access allow allowed_ip を記述します。

このルールは、http_access allow localnet の前に配置してください。

/etc/squid/squid.conf
# Allow access from a specific global IP address
acl allowed_ip src <グローバルIPアドレス>
http_access allow allowed_ip

# Allow access from local networks
http_access allow localnet

ご自身のクライアント端末のグローバルIPアドレスが分からない場合は、以下のサイトにアクセスすると確認できます。ぜひお試しください!

変更箇所 3: 最後のhttp_access deny allルール

変更前

最後にすべてのアクセスを拒否するルールがあります。この行の位置は変更不要ですが、新しい許可ルールはこの行の前に追加する必要があります。

/etc/squid/squid.conf
http_access deny all

変更後

この行自体はそのままです。ただし、http_access allow localnet をこの行の上に記述します。

/etc/squid/squid.conf
http_access allow localnet
http_access deny all

再起動して設定を反映

設定ファイルを保存した後、Squidを再起動して変更内容を反映させます。

sudo systemctl restart squid

クライアント側での設定

クライアント端末にプロキシ設定(IPアドレスとポート番号)を指定します。

細かい手順については省略しますが、以下の記事で詳しく解説していますので、必要に応じてご参照ください。

ここでは、EC2インスタンスのパブリックIPアドレスと、動作中のポート番号3128を設定します。

Screenshot 2025-01-11 at 18.58.19.png

稼働確認

クライアント端末からインターネットにアクセスし、動作を確認します。アクセスログを確認することで、プロキシが正常に稼働していることを検証できます。

Screenshot 2025-01-11 at 19.12.41.png

Squidアクセスログの確認

以下のコマンドでログをリアルタイムで確認します。

sudo tail -f /var/log/squid/access.log

ログ例:

/var/log/squid/access.log
[ec2-user@ip-10-0-1-17 ~]$ sudo tail -f /var/log/squid/access.log
1736587176.919     80 xxx.xxx.xxx.xxx TCP_TUNNEL/200 39 CONNECT www.google.co.jp:443 - HIER_DIRECT/172.217.31.131 -
1736587176.920    132 xxx.xxx.xxx.xxx TCP_TUNNEL/200 5405 CONNECT www.google.co.jp:443 - HIER_DIRECT/172.217.31.131 -
1736587176.920    179 xxx.xxx.xxx.xxx TCP_TUNNEL/200 5407 CONNECT www.google.co.jp:443 - HIER_DIRECT/172.217.31.131 -
1736587176.920    180 xxx.xxx.xxx.xxx TCP_TUNNEL/200 5405 CONNECT www.google.co.jp:443 - HIER_DIRECT/172.217.31.131 -
1736587176.921     81 xxx.xxx.xxx.xxx TCP_TUNNEL/200 39 CONNECT www.google.co.jp:443 - HIER_DIRECT/172.217.31.131 -

これで、クライアント端末からの接続が正常にプロキシサーバーを通過していることを確認できます!

確認ポイントと注意点

  • HTTPステータスコード
    TCP_TUNNEL/200 は、プロキシサーバーがリクエストを正常に中継したことを示しています。

  • プロキシ設定の確認
    クライアント端末で設定したプロキシ情報に誤りがある場合、インターネットへの接続に失敗することがあります。

まとめ

ここまでお読みいただきありがとうございました。 プロキシサーバーの構築に関しては、以前からローカル環境での経験や実務での取り扱いがあったため、大きくつまずくことはありませんでした。

ただし、Squidの設定ファイルを頻繁に触る機会は少ないため、久しぶりの操作で忘れている部分も多く、良い復習の機会となりました。

今回の技術検証が少しでも参考になり、どなたかの技術の支えになれば幸いです!

関連記事

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?