【Linux】Squidにてリバースプロキシを構築(Azure)
はじめに
Azure環境にてLinux(RHEL)のVMを構築し、Squidにてリバースプロキシ環境を構築する迄の流れを備忘録として残します。
※仕事で使う機会がありそうなので、知識として残しておきます。
今回の環境
前提
- あくまでもリバースプロキシとして動作を確認することが目的になります。
- Azure上に必要なリソースは作成済みになります。
- ターミナルソフトの使用方法については省略をします。(今回はTeraTermを使用します。)
環境
リソースグループ
項目 | 内容 |
---|---|
リソースグループ名 | 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
- 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_64
がenabled
であることを確認
- 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の入力項目
<パブリックIPアドレス>
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サーバになります。
※何度かブラウザを更新すると、その都度ログが更新される。
参考記事
【AWS メモ⑦】リバースプロキシの設定(Squid3.5)
Nginx を CentOS 7 にインストールする手順
nginx 起動ポートの変更
Discussion