🌊

GCEでSquidを使ったProxyServerの立て方

2022/01/17に公開

特定のサイトへのアクセスに特定のIPアドレスでのアクセスじゃないとブロックされてしまうことがあり、IPアドレスは予約済みだったのでProxy Serverを立てて解決しようと今回GCE上にSquidというProxyServer立てるのに楽なソフトウェアがあったのでこちらを使って立ち上げました。その際の手順を紹介します。

Squidとは

Squidは、HTTP、HTTPS、FTPなどに対応したcaching proxyです。キャッシュと、よく閲覧されるサイトの再利用により、帯域幅を減らし、レスポンス時間を向上させます。Squidには広範囲なアクセス制御機能があり、 サーバの機能を高度に向上させます。UNIXとWindowsで動作し、GNU GPL下においてライセンス許可されます。

VMインスタンス作成

※記載されていなところは特に変更がないです。

  • 名前
  • リージョン
    • asia-northeast1(東京)
  • ゾーン
    • asia-northeast1-b
  • マシンの構成
    • マシンファミリー
      • 凡用
    • シリーズ
      • E2
    • マシンタイプ
      • e2-micro (2vCPU、1GBメモリ)
  • ブートディスク
    • OS
      • Ubuntu
    • バージョン
      • Ubuntu 20.04 LTS
    • ブートディスクの種類
      • バランス永続ディスク
    • サイズ
      • 10
  • アクセススコープ
    • デフォルトのアクセス権を許可
  • ファイアウォール
    • HTTPトラフィックを許可
    • HTTPSトラフィックを許可する

外部IPの予約と適用

アクセス先などでIP制限などが設けられていて特定のIPアドレスをプロキシサーバーに適用させたい場合はVPCネットワーク→外部IPアドレスで静的アドレスを予約後適用先のVMインスタンスを選択して対応しましょう。

VMインスタンスへSSH接続

作成したVMインスタンスのSSHボタンからgcloudコマンドを取得して実行してインスタンス内へ接続してください

Squidセットアップ

Squidインストール

sudo apt install squid

インストールが完了したらバージョン確認を行う

sudo squid -v

squid.conf設定

初期の設定が見たい場合は以下のコマンドで見れます。

$ grep -v '^#' /etc/squid/squid.conf | grep -v '^$'
acl localnet src 0.0.0.1-0.255.255.255	# RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8		# RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10		# RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 	# RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12		# RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16		# RFC 1918 local private network (LAN)
acl localnet src fc00::/7       	# RFC 4193 local private network range
acl localnet src fe80::/10      	# RFC 4291 link-local (directly plugged) machines
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 deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
include /etc/squid/conf.d/*
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern \/Release(|\.gpg)$ 0 0% 0 refresh-ims
refresh_pattern \/InRelease$ 0 0% 0 refresh-ims
refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern .		0	20%	4320

以下でvimを開きます

sudo vim /etc/squid/squid.conf

1907行目にポート8080でリッスンし、192.168.0.2のクライアントからアクセスすることができるプロキシサーバーとして設定します。

http_port 8080

1193行目にクライアントからのリクエスト許可がされています。

acl localnet src 192.168.0.0/16         # RFC 1918 local private network (LAN)

1196行目に送信元IPとしてクライアントIPを設定してください。
※クライアントIP取得できるサイト(https://www.cman.jp/network/support/go_access.cgi)

acl src allowaddress <client ip>/255.255.255.255

1392~1394行目に先ほど追加したallowaddressを追加します

http_access allow localhost manager allowaddress
http_access deny manager
http_access allow allowaddress

最終的に以下のようになります

$ grep -v '^#' /etc/squid/squid.conf | grep -v '^$'
acl localnet src 0.0.0.1-0.255.255.255	# RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8		# RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10		# RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 	# RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12		# RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16		# RFC 1918 local private network (LAN)
acl localnet src fc00::/7       	# RFC 4193 local private network range
acl localnet src fe80::/10      	# RFC 4291 link-local (directly plugged) machines
acl allowaddress src <client ip>/255.255.255.255
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 deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager allowaddress
http_access deny manager
http_access allow allowaddress
include /etc/squid/conf.d/*
http_access allow localhost
http_access deny all
http_port 8080
coredump_dir /var/spool/squid
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern \/Release(|\.gpg)$ 0 0% 0 refresh-ims
refresh_pattern \/InRelease$ 0 0% 0 refresh-ims
refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern .		0	20%	4320

squid.confの設定は以上です。設定を反映させるためにsquidをリロードします。

$ sudo systemctl reload squid

リロード後にsquid.confに誤りなどがあるとsquidが起動しないので正常起動したか確認
Activeがactiveになっていれば問題ありません。もし問題が生じていたらさらに下にエラーログなどが流れているのでその問題を解決してください。

$ sudo systemctl status squid

ポート解放(ファイアフォールルールの作成)

portへのアクセスができるようにします。

  • 名前(default-allow-8080)
  • ログ
    • オフ
  • ネットワーク
    • default
  • トラフィックの方向
    • 上り
  • 一致したときのアクション
    • 許可
  • ターゲット
    • 指定されたターゲットタグ
  • ターゲットタグ
    • use-8080
  • ソースフィルタ
    • IPv4範囲
  • 送信元IPv4範囲
  • プロトコルとポート
    • 指定したプロトコルとポート
      • tcp
        • 8080

VMインスタンスへ適用

ネットワークタグに既にhttp-server https-serverがあると思います、そこに先ほど作成したuse-8080を追加してください。

クライアントからポートが空いているかSSHリクエスト

VMインスタンス作成時に設定したsshの公開鍵でポートを確認します

ssh -i ~/.ssh/<file_name> -v -p 8080 <vmインスタンス外部ip>

解放前

$ ssh -i ~/.ssh/<file_name> -v -p 8080 <vmインスタンス外部ip>
...
ssh: connect to host <VMインスタンスIP> port 8080: Operation timed out

解放後

$ ssh -i ~/.ssh/<file_name> -v -p 8080 <vmインスタンス外部ip>
...
debug1: Connection established.
...
ssh_exchange_identification: Connection closed by remote host

Curlでプロキシサーバー疎通を確認する

200 OKであればリクエストが正常に通りましたので疎通確認完了です!

http_proxy=http://<VMインスタンス外部IP>:8080 curl -I http://www.google.com

プロキシサーバーを利用する

プロキシサーバーが立ち上がりましたのでChrome拡張機能のProxy Helperを利用して楽にクライアントIPとプロキシサーバー経由の切り替えをしましょう!

  • Proxy Servers
    • HTTP Proxy
      • VMインスタンス外部IP
    • PORT
      • 8080

https://chrome.google.com/webstore/detail/proxy-helper/mnloefcpaepkpmhaoipjkpikbnkmbnic?hl=ja

Discussion