🌟

【Linux】Squidにてリバースプロキシを構築(Azure)

21 min read

はじめに

Azure環境にてLinux(RHEL)のVMを構築し、Squidにてリバースプロキシ環境を構築する迄の流れを備忘録として残します。
※仕事で使う機会がありそうなので、知識として残しておきます。

今回の環境

前提

  • あくまでもリバースプロキシとして動作を確認することが目的になります。
  • Azure上に必要なリソースは作成済みになります。
  • ターミナルソフトの使用方法については省略をします。(今回はTeraTermを使用します。)

TeraTermの使い方については、こちらの動画をご覧下さい。

https://www.youtube.com/watch?v=5vJhTnk8nBU

環境

リソースグループ

項目 内容
リソースグループ名 proxy-text
場所 東日本

仮想ネットワーク

項目 内容
仮想ネットワーク名 test-netsork
場所 東日本
アドレス空間 10.0.0.0/16

サブネット

  • Public-Subnet

Proxyサーバを格納するサブネットになります。

項目 内容
サブネット名 Public-Subnet
アドレス空間 10.0.1.0/24
  • Private-Subnet

Webサーバを格納するサブネットになります。

項目 内容
サブネット名 Private-Subnet
アドレス空間 10.0.2.0/24

ネットワークセキュリティグループ

受信セキュリティ規則に以下設定を追加。
※デフォルトの設定はそのままの状態になります。

  • proxy-nsg
優先度 名前 ポート プロトコル ソース 宛先 アクション 備考
300 SSH 22 TCP <自分のパブリックIPアドレス> 任意 Allow 追加
310 HTTP 80 TCP 任意 任意 Allow 追加
  • web-nsg
優先度 名前 ポート プロトコル ソース 宛先 アクション 備考
300 SSH 22 TCP 10.0.1.4/32 任意 Allow 追加
310 HTTP 8080 TCP 10.0.1.4/32 任意 Allow 追加

仮想マシン

  • proxy
項目 内容 備考
仮想マシン名 proxy
場所 東日本
OS RHEL7.5
サイズ Standard B1ms vCPU数:1
RAM:2GiB
OSディスク Standard HDD/64GiB
仮想ネットワーク/サブネット test-netsork/Public-Subnet
パブリックIPアドレス proxy-ip 外から接続する必要があるため、パブリックIPアドレスを付与
プライベートIPアドレス 10.0.1.4 VM作成時に自動で割り振られる
ネットワークセキュリティグループ proxy-nsg
ユーザー名 cloudadmin パスワードは任意設定
  • web
項目 内容 備考
仮想マシン名 web
場所 東日本
OS RHEL7.5
サイズ Standard B1ms vCPU数:1
RAM:2GiB
OSディスク Standard HDD/64GiB
仮想ネットワーク/サブネット test-netsork/Private-Subnet
パブリックIPアドレス なし proxy経由で接続
プライベートIPアドレス 10.0.2.4 VM作成時に自動で割り振られる
ネットワークセキュリティグループ web-nsg
ユーザー名 cloudadmin パスワードは任意設定

構築手順

以下の流れで構築を進めていきたいと思います。

①webサーバ構築(nginx)
②proxyサーバ構築(squid)
③接続確認

①webサーバ構築(nginx)

1.ターミナルソフトよりproxyサーバにSSH接続を実施し、以下コマンドを実行する。

コマンド
ssh cloudadmin@10.0.2.4
コマンド実行例
[cloudadmin@proxy ~]$ ssh cloudadmin@10.0.2.4
The authenticity of host '10.0.2.4 (10.0.2.4)' can't be established.
ECDSA key fingerprint is SHA256:K56xIVixnX3ehFC3BhRrgiSAfYyz5hV2v55yU1oxocg.
ECDSA key fingerprint is MD5:44:25:ee:a0:f1:3b:24:3b:2e:25:31:31:24:a0:05:24.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.2.4' (ECDSA) to the list of known hosts.
cloudadmin@10.0.2.4's password:
[cloudadmin@web ~]$

2.nginxをインストールと設定を実施する。

  • nginxのリポジトリを追加
コマンド
sudo vi /etc/yum.repos.d/nginx.repo
記載内容
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

※viコマンドの使い方は、こちらの動画を参照下さい。

https://www.youtube.com/watch?v=HVssHC9z7WU
  • nginxのリポジトリが作成されたことを確認
コマンド
cat /etc/yum.repos.d/nginx.repo
記載内容
[cloudadmin@web yum.repos.d]$ cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
[cloudadmin@web yum.repos.d]$
  • リポジトリの初期化/読み込み
コマンド
yum clean all
yum repolist all
コマンド実行例
(yum repolista allの結果から一部抜粋)
repo id                                                          re status
nginx/x86_64                                                     ng enabled: 244
rhui-microsoft-azure-rhel7-eus                                   Mi enabled:   4
rhui-rhel-7-server-dotnet-rhui-debug-rpms/x86_64                 do disabled

nginx/x86_64enabledであることを確認

  • nginxのパッケージ情報確認
コマンド
yum info nginx

nginxのパッケージ情報が表示されることを確認。

コマンド実行例(一部抜粋)
Available Packages
Name        : nginx
Arch        : x86_64
Epoch       : 1
Version     : 1.20.1
Release     : 1.el7.ngx
Size        : 790 k
Repo        : nginx/x86_64
Summary     : High performance web server
URL         : https://nginx.org/
License     : 2-clause BSD-like license
Description : nginx [engine x] is an HTTP and reverse proxy server, as well as
            : a mail proxy server.
  • nginxのパッケージインストール
コマンド
sudo yum -y install nginx

nginxが正常にインストールされると、以下のように表示される。

コマンド実行例
※コマンド実行結果の下の部分のみ抜粋
  Verifying  : 1:nginx-1.20.1-1.el7.ngx.x86_64                              1/1

Installed:
  nginx.x86_64 1:1.20.1-1.el7.ngx

Complete!
  • nginx設定ファイルのバックアップ
コマンド
sudo cp -p /etc/nginx/conf.d/default.conf /etc/nginx/co
nf.d/default.conf_`date "+%Y%m%d_%H%M%S"`
ll /etc/nginx/conf.d | grep default
コマンド実行例
[cloudadmin@web conf.d]$ sudo cp -p /etc/nginx/conf.d/default.conf /etc/nginx/co
nf.d/default.conf_`date "+%Y%m%d_%H%M%S"`
[cloudadmin@web conf.d]$ ll /etc/nginx/conf.d/default.conf
-rw-r--r--. 1 root root 1072 May 25 13:30 /etc/nginx/conf.d/default.conf
[cloudadmin@web conf.d]$
[cloudadmin@web conf.d]$
[cloudadmin@web conf.d]$ ll /etc/nginx/conf.d | grep default
-rw-r--r--. 1 root root 1072 May 25 13:30 default.conf
-rw-r--r--. 1 root root 1072 May 25 13:30 default.conf_20211110_041512
[cloudadmin@web conf.d]$
  • nginx起動ポートの設定変更
コマンド
sudo vi /etc/nginx/conf.d/default.conf
設定変更
server {
    listen       80; ← 「8080」に変更
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

設定ファイルの内容が変更されていることを確認。

設定ファイル変更確認
※一部抜粋しております。
[cloudadmin@web conf.d]$ cat /etc/nginx/conf.d/default.conf
server {
    listen       8080;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
  • nginx起動/自動起動設定
コマンド
・nginx起動
sudo systemctl start nginx

・nginx自動起動設定
sudo systemctl enable nginx
コマンド実行例
[cloudadmin@web conf.d]$ sudo systemctl start nginx
[cloudadmin@web conf.d]$ sudo systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[cloudadmin@web conf.d]$
  • nginx起動確認/自動起動設定確認
コマンド
・nginx起動確認
systemctl status nginx

・nginx自動起動設定確認
systemctl is-enabled nginx
コマンド実行例
[cloudadmin@web conf.d]$ systemctl status nginx
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2021-11-10 04:24:59 UTC; 1min 15s ago ←ステータスが「active (running)」になっていることを確認。
     Docs: http://nginx.org/en/docs/
 Main PID: 12015 (nginx)
   CGroup: /system.slice/nginx.service
           tq12015 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx....
           mq12016 nginx: worker process

Nov 10 04:24:59 web systemd[1]: Starting nginx - high performance web server...
Nov 10 04:24:59 web systemd[1]: PID file /var/run/nginx.pid not readable (y...t.
Nov 10 04:24:59 web systemd[1]: Started nginx - high performance web server.
Hint: Some lines were ellipsized, use -l to show in full.
[cloudadmin@web conf.d]$ systemctl is-enabled nginx
enabled ←「enabled」であることを確認
[cloudadmin@web conf.d]$
  • 8080ポート開放確認
コマンド
sudo netstat -nap | grep 8080
コマンド実行例
[cloudadmin@web conf.d]$ sudo netstat -nap | grep 8080
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      12015/nginx: master
[cloudadmin@web conf.d]$

→8080ポートがLISTENになっていることを確認。

3.firewalldの停止/自動起動無効設定の実施

  • firewalldの停止/自動起動無効設定
コマンド
・firewalld停止
sudo systemctl stop firewalld

・firewalld自動起動無効設定
sudo systemctl disable firewalld
コマンド実行例
[cloudadmin@web ~]$ sudo systemctl stop firewalld
[cloudadmin@web ~]$ sudo systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[cloudadmin@web ~]$
  • firewalld停止確認/自動起動無効設定確認
コマンド
・firewalld停止確認
systemctl status firewalld

・firewalld自動起動無効設定確認
systemctl is-enabled firewalld
コマンド実行例
[cloudadmin@web ~]$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead) ←ステータスが「inactive (dead)」になっていることを確認。
     Docs: man:firewalld(1)

Nov 10 03:23:30 localhost.localdomain systemd[1]: Starting firewalld - dynami...
Nov 10 03:23:31 localhost.localdomain systemd[1]: Started firewalld - dynamic...
Nov 10 03:41:19 web systemd[1]: Stopping firewalld - dynamic firewall daemon...
Nov 10 03:41:19 web systemd[1]: Stopped firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
[cloudadmin@web ~]$
[cloudadmin@web ~]$ systemctl is-enabled firewalld
disabled ←「disabled」であることを確認
[cloudadmin@web ~]$

4.proxyサーバに戻る

以下コマンドを実行し、proxyサーバへ戻る。

コマンド
exit
コマンド実行例
[cloudadmin@web conf.d]$ exit
logout
Connection to 10.0.2.4 closed.
[cloudadmin@proxy ~]$

②proxyサーバ構築(squid)

1.squidインストール

  • squidのインストールの実施
コマンド
sudo yum install squid -y
コマンド実行例
Dependency Installed:
  libecap.x86_64 0:1.0.0-1.el7
  libtool-ltdl.x86_64 0:2.4.2-22.el7_3
  perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.el7
  perl-Compress-Raw-Zlib.x86_64 1:2.061-4.el7
  perl-DBI.x86_64 0:1.627-4.el7
  perl-Data-Dumper.x86_64 0:2.145-3.el7
  perl-Digest.noarch 0:1.17-245.el7
  perl-Digest-MD5.x86_64 0:2.52-3.el7
  perl-IO-Compress.noarch 0:2.061-2.el7
  perl-Net-Daemon.noarch 0:0.48-5.el7
  perl-PlRPC.noarch 0:0.2020-14.el7
  squid-migration-script.x86_64 7:3.5.20-12.el7

Complete! ← 「Complete!」が表示されることを確認。
[cloudadmin@proxy ~]$

2.squid設定ファイル編集

  • squidの設定ファイルをバックアップ
コマンド
sudo cp -p /etc/squid/squid.conf /etc/squid/squid.conf_`date "+%Y%m%d_%H%M%S"`
ll /etc/squid/ | grep squid.conf
コマンド実行例
[cloudadmin@proxy ~]$ sudo cp -p /etc/squid/squid.conf /etc/squid/squid.conf_`date "+%Y%m%d_%H%M%S"`
[cloudadmin@proxy ~]$
[cloudadmin@proxy ~]$ ll /etc/squid/ | grep squid.conf
-rw-r-----. 1 root squid  2315 Oct  2  2017 squid.conf
-rw-r-----. 1 root squid  2315 Oct  2  2017 squid.conf_20211110_050514
-rw-r--r--. 1 root root   2315 Oct  2  2017 squid.conf.default
[cloudadmin@proxy ~]$
  • squidの設定ファイルを編集
コマンド
sudo vi /etc/squid/squid.conf

HTTPアクセス許可

設定内容
# And finally deny all other access to this proxy
# http_access deny all ← コメントアウト
http_access allow all ← 追加

※55行目あたりになります。

ポート番号の指定(デフォルトでは3128)箇所をコメントアウトする。
転送先の設定を追加する。

設定内容
# Squid normally listens to port 3128
#http_port 3128  ← コメントアウト

# 以下の形式で転送先の設定を追加
# http_port <SquidサーバのプライベートIPアドレス>:<ポート番号> accel defaultsite=<WebサーバのプライベートIPアドレス>
http_port xxx.xxx.xxx.xxx:80 accel defaultsite=xxx.xxx.xxx.xxx

※59行目あたりになります。

編集例
# Squid normally listens to port 3128
# http_port 3128

# 以下の形式で転送先の設定を追加
# http_port <SquidサーバのプライベートIPアドレス>:<ポート番号> accel def        aultsite=<WebサーバのプライベートIPアドレス>
http_port 10.0.1.4:80 accel defaultsite=10.0.2.4

最下行にキャッシュ設定を追加する。

設定内容
# WebサーバのプライベートIPアドレス を設定
cache_peer xxx.xxx.xx.xxx parent 80 0 no-query originserver

# メモリキャッシュサイズを設定
cache_mem 256 MB
編集例
# WebサーバのプライベートIPアドレス を設定
cache_peer 10.0.2.4 parent 8080 0 no-query originserver

# メモリキャッシュサイズを設定
cache_mem 256 MB

※WEBサーバのプライベートIPアドレスは10.0.2.4でポートは8080になります。

最下行にサーバ情報の非表示設定を追加する。

設定内容
# サーバ情報非表示設定
visible_hostname unknown

最下行にバージョン情報の非表示設定を追加する。

設定内容
# バージョン情報非表示設定
httpd_suppress_version_string on

編集後、内容を確認し保存する。

  • squid設定ファイル確認
コマンド
sudo cat /etc/squid/squid.conf

設定した内容が反映されていることを確認。

コマンド実行例
[cloudadmin@proxy ~]$ sudo cat /etc/squid/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 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

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost

# And finally deny all other access to this proxy
# http_access deny all
http_access allow all

# Squid normally listens to port 3128
# http_port 3128

# 以下の形式で転送先の設定を追加
# http_port <SquidサーバのプライベートIPアドレス>:<ポート番号> accel defaultsite=<WebサーバのプライベートIPアドレス>
http_port 10.0.1.4:80 accel defaultsite=10.0.2.4

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

# WebサーバのプライベートIPアドレス を設定
cache_peer 10.0.2.4 parent 8080 0 no-query originserver

# メモリキャッシュサイズを設定
cache_mem 256 MB

# サーバ情報非表示設定
visible_hostname unknown

# バージョン情報非表示設定
httpd_suppress_version_string on
[cloudadmin@proxy ~]$

3.squidの起動/自動起動設定

  • squid起動/自動起動設定
コマンド
・nginx起動
sudo systemctl start squid

・nginx自動起動設定
sudo systemctl enable squid
コマンド実行例
[cloudadmin@proxy ~]$ sudo systemctl start squid
[cloudadmin@proxy ~]$ sudo systemctl enable squid
Created symlink from /etc/systemd/system/multi-user.target.wants/squid.service to /usr/lib/systemd/system/squid.service.
[cloudadmin@proxy ~]$
  • squid起動確認/自動起動設定確認
コマンド
・nginx起動確認
systemctl status squid

・nginx自動起動設定確認
systemctl is-enabled squid
コマンド実行例
[cloudadmin@proxy ~]$ systemctl status squid
● squid.service - Squid caching proxy
   Loaded: loaded (/usr/lib/systemd/system/squid.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2021-11-10 05:25:19 UTC; 23s ago ←ステータスが「active (running)」になっていることを確認。
 Main PID: 6762 (squid)
   CGroup: /system.slice/squid.service
           tq6762 /usr/sbin/squid -f /etc/squid/squid.conf
           tq6764 (squid-1) -f /etc/squid/squid.conf
           mq6765 (logfile-daemon) /var/log/squid/access.log

Nov 10 05:25:19 proxy systemd[1]: Starting Squid caching proxy...
Nov 10 05:25:19 proxy systemd[1]: Started Squid caching proxy.
Nov 10 05:25:20 proxy squid[6762]: Squid Parent: will start 1 kids
Nov 10 05:25:20 proxy squid[6762]: Squid Parent: (squid-1) process 6764 started
Hint: Some lines were ellipsized, use -l to show in full.
[cloudadmin@proxy ~]$
[cloudadmin@proxy ~]$ systemctl is-enabled squid
enabled ←「enabled」であることを確認
[cloudadmin@proxy ~]$

4.firewalldの停止/自動起動無効設定の実施

  • firewalldの停止/自動起動無効設定
コマンド
・firewalld停止
sudo systemctl stop firewalld

・firewalld自動起動無効設定
sudo systemctl disable firewalld
コマンド実行例
[cloudadmin@web ~]$ sudo systemctl stop firewalld
[cloudadmin@web ~]$ sudo systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[cloudadmin@web ~]$
  • firewalld停止確認/自動起動無効設定確認
コマンド
・firewalld停止確認
systemctl status firewalld

・firewalld自動起動無効設定確認
systemctl is-enabled firewalld
コマンド実行例
[cloudadmin@proxy ~]$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead) ←ステータスが「inactive (dead)」になっていることを確認。
     Docs: man:firewalld(1)

Nov 10 03:35:08 proxy systemd[1]: Starting firewalld - dynamic firewall dae.....
Nov 10 03:35:09 proxy systemd[1]: Started firewalld - dynamic firewall daemon.
Nov 10 04:54:10 proxy systemd[1]: Stopping firewalld - dynamic firewall dae.....
Nov 10 04:54:10 proxy systemd[1]: Stopped firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
[cloudadmin@proxy ~]$ systemctl is-enabled firewalld
disabled ←「disabled」であることを確認
[cloudadmin@proxy ~]$

③接続確認

ブラウザのURL欄にproxyサーバのパブリックIPアドレスを入力し、アクセスを実施する。

  • URLの入力項目
URL欄
<パブリックIPアドレス>
URL欄入力例
52.253.112.93
  • 画面表示

proxyサーバにてログを確認する。

コマンド
sudo tail -f /var/log/squid/access.log
コマンド実行例
[cloudadmin@proxy ~]$ sudo tail -f /var/log/squid/access.log
1636522048.840      5 133.200.145.161 TCP_MISS/200 942 GET http://52.253.112.93/ - FIRSTUP_PARENT/10.0.2.4 text/html
1636522049.328      1 133.200.145.161 TCP_MISS/404 802 GET http://52.253.112.93/favicon.ico - FIRSTUP_PARENT/10.0.2.4 text/html

10.0.2.4はwebサーバになります。

※何度かブラウザを更新すると、その都度ログが更新される。

さいごに

今回は、Azure環境にてsquidを用いたリバースプロキシ環境を構築しました。
いずれは、YouTubeでもご紹介する予定です。

参考記事

【AWS メモ⑦】リバースプロキシの設定(Squid3.5)
Nginx を CentOS 7 にインストールする手順
nginx 起動ポートの変更

Discussion

ログインするとコメントできます