AWS 上に Proxy 環境を構築するメモ


これは何?

  • AWS 上に HTTP Proxy を構築して検証する機会があったので、構築手順をメモしておく

大まかな流れ

  • [事前準備] VPC と public subnet, private subnet を用意しておく
    • public subnet は Internet Gateway を使ってインターネット接続できるようにしておく
    • private subnet は public subnet に構築する proxy を経由してインターネット接続するので NAT Gateway, NAT インスタンスは不要
  • public subnet に EC2 インスタンスを作成して Squid をインストールして動かす
  • private subnet に EC2 インスタンスを作成して Proxy 設定を行い、動作を確認する
  • 各 EC2 インスタンスでは OS として Amazon Linux 2 を使用する

各 subnet に EC2 インスタンスを構築して SSH 接続

ssh コマンドを使った接続例

# シェル変数のセットアップ
PUBLIC_HOST=ec2-x-x-x-x.ap-northeast-1.compute.amazonaws.com
PUBLIC_HOST_USER=ec2-user
PROVATE_HOST=ip-172-31-200-153.ap-northeast-1.compute.internal
PROVATE_HOST_USER=ec2-user

# public subnet host への接続
ssh $PUBLIC_HOST_USER@$PUBLIC_HOST

# private subnet host への接続
ssh -o ProxyCommand="ssh -W %h:%p $PUBLIC_HOST_USER@$PUBLIC_HOST" $PROVATE_HOST_USER@$PROVATE_HOST

public subnet に Squid を構築

sudo yum update
sudo yum install squid
squid -v
sudo systemctl enable squid
sudo systemctl restart squid
sudo lsof -i:3128
  • これで Squid をインストールして 3128 ポートで動作することが確認できる
  • ログを確認したい場合、以下のようにして確認できる

    • プロキシを経由したアクセスを行っていない状態ではログが出力されないためログファイル自体が存在しない場合があるので注意

      sudo -s
      less /var/log/squid/access.log
      less /var/log/squid/cache.log

private subnet で Proxy 設定を行い接続を試す

AWS CLI

  • HTTP_PROXY, HTTPS_PROXY 環境変数を設定すれば良い

    • https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-proxy.html
    • EC2 インスタンスで IAM Role を使用する場合、インスタンスメタデータにアクセスが行われるため NO_PROXY=169.254.169.254 が必要と記載があるが、 NOPROXY を設定しなくても動作が確認できたのでスキップしている

      # Squid を設定した EC2 インスタンスのプライベート IP アドレスが 172.31.28.104 だとする
      export HTTP_PROXY=http://172.31.28.104:3128
      export HTTPS_PROXY=http://172.31.28.104:3128

動作検証

aws sts get-caller-identity

HTTP Proxy 設定を消す場合

export -n HTTP_PROXY
export -n HTTPS_PROXY

curl

curl コマンドの動作確認

curl --proxy http://172.31.28.104:3128 -I http://example.com
curl --proxy http://172.31.28.104:3128 -I https://example.com

wget

  • /etc/wgetrc にプロキシ設定を記述する or http_proxy, https_proxy 環境変数を設定する
  • 環境変数使う方法のほうがファイル操作が不要なので個人的にセットアップが楽

    export http_proxy=http://172.31.28.104:3128
    export https_proxy=http://172.31.28.104:3128

動作確認

wget http://example.com
wget https://example.com

HTTP Proxy 設定を消す場合

export -n http_proxy
export -n https_proxy

yum

/etc/yum.conf 設定例

proxy=http://172.31.28.104:3128

動作確認

sudo yum update

参考

Squidで検証用のプロキシを作ってみた | Developers.IO
https://dev.classmethod.jp/articles/squid-proxy-setup/

この記事を試した環境

クライアント

% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H114
% ssh -V
OpenSSH_8.1p1, LibreSSL 2.7.3

EC2 インスタンスとして使用した Amazon Linux 2

[ec2-user@ip-172-31-28-104 ~]$ uname -a
Linux ip-172-31-28-104.ap-northeast-1.compute.internal 4.14.214-160.339.amzn2.x86_64 #1 SMP Sun Jan 10 05:53:05 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
[ec2-user@ip-172-31-28-104 ~]$ cat /etc/os-release 
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o\:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
[ec2-user@ip-172-31-28-104 ~]$ ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
[ec2-user@ip-172-31-28-104 ~]$ squid -v | head -n 2
Squid Cache: Version 3.5.20
Service Name: squid
[ec2-user@ip-172-31-28-104 ~]$ aws --version
aws-cli/1.18.147 Python/2.7.18 Linux/4.14.214-160.339.amzn2.x86_64 botocore/1.18.6
[ec2-user@ip-172-31-28-104 ~]$ curl --version
curl 7.61.1 (x86_64-koji-linux-gnu) libcurl/7.61.1 OpenSSL/1.0.2k zlib/1.2.7 libidn2/2.3.0 libssh2/1.4.3 nghttp2/1.41.0
Release-Date: 2018-09-05
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz HTTP2 UnixSockets HTTPS-proxy Metalink
[ec2-user@ip-172-31-28-104 ~]$ wget --version | head -n 1
GNU Wget 1.14 built on linux-gnu.
[ec2-user@ip-172-31-28-104 ~]$ yum --version | head -n 1
3.4.3