この記事はConoHa Advent Calendar 13日目の記事になります。昨日はhironobu_sさんで、「conohasayで楽しいターミナル生活を」でした。さて、今日はConoHaちゃんを使って爆速プロキシサーバーを立ててみたいと思います。出来るだけ初心者にも分かりやすいように書きたいと思います。(※自分が初心者)
参考にした主なサイト
5分で作るPROXYサーバー on @Qiita
proxyサーバ squidでアクセス時に認証を要求する設定 パソコン鳥のブログ/ウェブリブログ
プロキシサーバ(Squid)にDigest認証を実装する - フルスタックエンジニアを目指して
【準備1】サーバーの作成
基本の1GBプランでサーバー(インスタンス)を作成します。OSはUbuntu 16.04 (64bit版)を選択しました。
SSH鍵は、以前作成したものがあったので、今回はそれを使いましたが、なければ新規キー登録を選んでください。(画面左にあるセキュリティ→SSH Key
から作成することもできます。)
少し待つと、サーバーが作成されます。
【補足】もしもSSHの設定の途中で間違えてサーバーにアクセスできなくなってしまったら
もし設定の途中で間違えて、SSH接続できなくなった場合があるかもしれません。
# ↓ConoHaちゃんをいぢめる
yuinore@114-514-810-893:~$ sudo ifdown ens3
その場合は、ConoHaコントロールパネルのサーバー
から、コンソール
を選択すると、コンソールログインができますので、ユーザー名であるroot
と、最初の登録時に入力したroot パスワードを入力すると、コンソールログインすることができますので、なんとかすることができます。
# ↓なんとかする
root@114-514-810-893:~# ifup ens3
【準備2】ユーザーの作成とSSHの設定
作成したSSH鍵と、作成されたサーバーのIPアドレスを使用して、BashからSSH接続します。ユーザー名にはrootを使用します。
kuro@ubuntu:~$ ssh root@114.514.810.893 -i ~/20170832000000.pem -p 22
rootへログインできると危ない(らしい)ので、adduserコマンドでユーザーを追加します。adduserの後に続けて好きなあなたのユーザー名を入力します。また、Enter new UNIX password
の後に続けてパスワードを入力します。画面には何も表示されませんが、そのまま続けてください。その後に名前などを聞かれますが、何も入力せずにエンターキーを押して問題ありません。
root@114-514-810-893:~# adduser yuinore
.ssh
ディレクトリとSSH鍵をコピーして、sshログインできるようにします。yuinore
の部分をあなたのユーザー名に変えて入力してください。また、(パーミッションと)所有者を設定します。
root@114-514-810-893:~# cp -r /root/.ssh/ /home/yuinore
root@114-514-810-893:~# chmod 700 /home/yuinore/.ssh
root@114-514-810-893:~# chmod 600 /home/yuinore/.ssh/authorized_keys
root@114-514-810-893:~# chown yuinore:yuinore /home/yuinore/.ssh
root@114-514-810-893:~# chown yuinore:yuinore /home/yuinore/.ssh/authorized_keys
この設定ができたら、正しくSSH接続できることを確認します。
root@114-514-810-893:~# exit
kuro@ubuntu:~$ ssh yuinore@114.514.810.893 -i ~/20170832000000.pem -p 22
【準備3】sudoersへの追加
もう一度rootでログインし直します。gpasswdコマンドでsudoグループに自分を追加します。
root@114-514-810-893:~# gpasswd -a yuinore sudo
Adding user yuinore to group sudo
root@114-514-810-893:~# getent group | grep sudo # 確認
sudo\:x:27:yuinore
あなたのユーザー名でSSH接続して、sudoが使えることを確認します。
root@114-514-810-893:~# exit
kuro@ubuntu:~$ ssh yuinore@114.514.810.893 -i ~/20170832000000.pem -p 22
yuinore@114-514-810-893:~$ sudo echo Hello World!
Hello World! と表示されたら実験は成功です。
【準備4】rootログインの禁止とポート番号の変更
sudo vim /etc/ssh/sshd_config
以下に示す該当行を変更します。PermitRootLogin
をno
にすることで、rootログインを禁止します。
Port 【ポート番号】
PermitRootLogin no
ChallengeResponseAuthentication no
PasswordAuthentication no
【ポート番号】の部分には、1024~49151の範囲の適当な数字を入れてください。変更が終わったら、sshdを再起動します。
sudo /etc/init.d/ssh restart
パスワードを用いたログインとrootログインができないことを確認します。
kuro@ubuntu:~$ ssh root@114.514.810.893 -p 364364
Permission denied (publickey).
kuro@ubuntu:~$ ssh yuinore@114.514.810.893 -p 364364
Permission denied (publickey).
kuro@ubuntu:~$ ssh root@114.514.810.893 -i ~/20170832000000.pem -p 364364
Permission denied (publickey).
kuro@ubuntu:~$ ssh yuinore@114.514.810.893 -i ~/20170832000000.pem -p 364364
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-57-generic x86_64)
squidのインストール
さて、本題のsquidをインストールします。
sudo apt-get install squid
インストールが終わったら、digest認証用のパスワードファイルを作成します。digest認証とbasic認証のどちらが良いかについては諸説ありそうですが、今回はdigest認証を選択しました。
sudo apt-get install apache2-utils
sudo htpasswd -cp /etc/squid/passwd yuinore
その後、squidの設定ファイルを編集します。
sudo vim /etc/squid/squid.conf
以下の2行をコメントアウトしてください。他の行はコメントアウトしないでください。
# http_access deny all
# http_port 3128
次に、squid.confの末尾に以下の設定を追記します。【ポート番号】の部分には先ほどとは異なる1024~49151の範囲の適当な数字を入れてください。また、タイプミスには十分気をつけてください。
ちなみに、**Ubuntuではdigest_pw_authの場所が変更になっている**ようなので注意してください。これで1時間くらいハマりました。ファイルが存在するかどうか、一応確認しておいた方が良さそうです。
http_port 【ポート番号】
auth_param digest program /usr/lib/squid3/digest_file_auth /etc/squid/passwd
auth_param digest children 20 startup=0 idle=1
auth_param digest realm Squid is ika. (gyokai)
auth_param digest nonce_garbage_interval 5 minutes
auth_param digest nonce_max_duration 30 minutes
auth_param digest nonce_max_count 50
visible_hostname yuinore.moe
acl myacl1 proxy_auth REQUIRED
http_access allow myacl1
http_access deny all
forwarded_for off
header_access X-Forwarded-For deny all
header_access Via deny all
header_access Cache-Control deny all
squidを再起動します。
sudo /etc/init.d/squid restart
ローカルから接続テストをします。それっぽいものが出ていれば成功です。
# HTTP接続
curl --proxy-digest -U yuinore:YOURPASSWORD -x 114.514.810.893:810931 -L http://example.com | tail
# HTTPS接続
curl --proxy-digest -U yuinore:YOURPASSWORD -x 114.514.810.893:810931 -L https://www.yahoo.co.jp | tail
【補足】IPアドレスでアクセスを制御する
もし、パスワードによる認証ではなくIPアドレスによってアクセスを制御したい場合は、次のようにするといいそうです。パスワードを入力する必要がない代わりに、そのIPアドレスが変更されると設定も修正する必要があります。下の設定の123.456.654.321には接続元のIPアドレスを入れてください。
http_port 【ポート番号】
visible_hostname yuinore.moe
acl myacl1 src 123.456.654.321/255.255.255.255
http_access allow myacl1
http_access deny all
forwarded_for off
header_access X-Forwarded-For deny all
header_access Via deny all
header_access Cache-Control deny all
測定
お待ちかねのスピード測定ですが、どんな結果になったでしょうか。444kBのファイルと8.63MBのファイルに対して、それぞれ約3時間/約6時間ごとにプロキシ経由と直接接続で特定のファイルを各国の24のサーバーからダウンロードするのを、11月の中頃から約7日間ずつ続けました。(勝手に)サーバーを使わせて頂きありがとうございました。サーバーのリストとソースコードは下の方に置いてあります。
結果
N はデータの件数で、ratioは直接接続とプロキシ経由の速度の比です。
444kBのファイルの場合
-------- Overseas --------
ratio = 2.672861196130555
direct : 91.11 kB/s (N = 1227)
proxy : 243.53 kB/s (N = 1227)
proxy_to_remote : 368.44 kB/s (N = 1227)
local_to_proxy : 2109.98 kB/s (N = 1227)
-------- Japan --------
ratio = 1.1864754754007445
direct : 353.36 kB/s (N = 177)
proxy : 419.26 kB/s (N = 177)
proxy_to_remote : 708.11 kB/s (N = 177)
local_to_proxy : 2526.98 kB/s (N = 177)
8.63MBのファイルの場合
-------- Overseas --------
ratio = 12.187210141108308
direct : 81.87 kB/s (N = 683)
proxy : 997.71 kB/s (N = 683)
proxy_to_remote : 2304.21 kB/s (N = 683)
local_to_proxy : 2629.74 kB/s (N = 683)
-------- Japan --------
ratio = 2.0042917665918734
direct : 405.48 kB/s (N = 100)
proxy : 812.7 kB/s (N = 100)
proxy_to_remote : 1195.03 kB/s (N = 100)
local_to_proxy : 1722.49 kB/s (N = 100)
海外サーバーへの接続においては、プロキシを使用すると速度が平均で12倍になりました! また、サーバーによっては最大で平均31倍の差がありました。 速い!! やったねたえちゃん!!
・・・
・・・・・・
・・・・・・・・・プロキシの方が速いというのはとても疑惑の結果な気がするのですが、誰か理由がわかりますかね・・・?
ソースコードと生出力
speedtest.sh
centos_mirror_pickup.txt (サーバーリスト)
analyze_statistics.html
statistics_444kb.csv
statistics_9mb.csv
さいごに
色々詰め込んだら収拾がつかなくなってしまいましたが、なんとか書き終えることができました。もし間違いなどありましたら教えて頂けたら嬉しいです。明日はkazswさんで、「ObjectStorage」の予定です。お楽しみに。