はじめに
この記事は「ConoHa Advent Calendar 2018 」の第六日目のために書いた記事です。
去年も書かせていただきたのですが、ドヤ顔で書いたら間違っていたという超恥ずかしいことをしました。
悲しいです。
本題へ
さて、そろそろ本題に入らせていただきます。
タイトルにも書いている通り、自分用に作ったプロキシサーバーと自分用に作ったgyazo(スクリーンショットをすばやく公開するサービス→gyazo.com)を作った話をさせていただこうかなとおもいます。
注意点とか
あくまで自分が使う用ないし、作ったけどあんまり使ってないとかですので、セキュリティーとかガバガバだったりします。
これを見て実行しようという人はいないかと思いますが、万が一実行する人はそのへんをしっかり対策することをおすすめというかしてください。
特にプロキシサーバーの場合、DOS攻撃とかの踏み台にされかねなかったりします。
今回の環境
- プロキシサーバー: CentOS Linux release 7.3.1611
- Gyazo鯖 : CentOS Linux release 7.5.1804 (Core) / Apache/2.4.6 / PHP 7.1.19
わざわざ、この環境に合わせる必要な無いですが、念のためにおいておきます。
PHPは7.1ですが、PHP5系でもできるとおもいます。
プロキシサーバー編
...とその前に、「プロキシ」とは?
→プロキシとは「代理」の意味である。インターネット関連で用いられる場合は、特に内部ネットワークからインターネット接続を行う際、高速なアクセスや安全な通信などを確保するための中継サーバ「プロキシサーバ」を指す。(Wikipediaから)
必要なものをインストールする
プロキシサーバー用のパッケージ「squid」を使います。
yum -y install squid
squidの設定編集
インストールが終わったら squidの設定ファイルを修正します。
vim /etc/squid/squid.conf
修正する前に次の二行をコメントアウトします。
#http_access deny all
#http_port 3128
# ホストネームは任意のものを。
visible_hostname myproxygogo.info
# ポート8080は一般的すぎるので使いません。
http_port 適当なポート(60088とか)
# xxx.xxx.xxx.xxxはあなたのIPを記述する。
# わからなければ
# http://www.ugtop.com/spill.shtml
# ここの「現在接続している場所(IPv4)」のIPを書きます。
acl myacl src xxx.xxx.xxx.xxx/255.255.255.255
http_access allow myacl
http_access deny all
# プロキシサーバーを使用している端末のローカルIPアドレスを隠蔽化
forwarded_for off
# プロキシ経由でアクセスしていることをアクセス先に知られないようにする
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
ポートは適当に変更することをおすすめします。
ポートスキャンされればバレるんですけどね。
squidの起動
初回キャッシュクリア
squid -z
systemctl start squid
ファイヤーウォールの設定
firewall-cmd --add-port=○○/tcp --zone=public --permanent
(※http_portで指定したポート番号)
自分以外接続出来ないようにっていう設定が見つからなかったので、申し訳ないんですが、各自で探して設定してください。
参考:CentOS 7 firewalld よく使うコマンド
これで構築完了です。
動作確認
Win10の場合:設定から「ネットワークとインターネット」から「プロキシ」にある、「手動プロキシ セットアップ」から設定します。
アドレスはConoHaのコンパネにある、「IPアドレス」を記入します。ポートは、設定で記入したポート番号(http_port)を記入します。
記入したら「保存」をクリックします。
http://www.ugtop.com/spill.shtml に接続してみて、IPアドレスが構築したConoHaサーバーのIPになっていれば成功です。
プロキシ鯖 参考
pcnikkiさんの 5分で作るPROXYサーバー
ほとんど丸パクリしました。すみませんでした。
kenjjiijjiiさんの CentOS 7 firewalld よく使うコマンド
firewalldコマンドを覚えてなかったので、参考にコマンドを打ちました。
gyazoサーバー編
...とその前に、gyazoとは?
Gyazoは、オープンソースソフトウェア[2]でMicrosoft Windows, OS X、Linuxで動くスクリーンショットソフトウェアである。(Wikipediaより)
必要なものを用意する
- Apacheなどのwwwサーバ
- PHP実行環境
- C++ビルド環境 (今回は Visual Studio 2017のCommunity版)
- Gyazo クライアントのソースコード
クライアント側(PC側)
gyazowin.cpp
の794と975行目を、自分のサーバー、ファイル名はupload.php
にします。
ビルドが成功すると gyazowin.exe
が作成されます。
※私の環境では、「識別子"なんたら"が宣言されてない」など、赤い波線が大量だったので、スクリーンショットはありません。[※追記]
[※追記]:Visual Studio 2015 Communityで起動させると、赤い波線が消えて、普通に編集できました。
サーバ側
upload.php
を作成します。
※このスクリプトはセキュリティ上好ましくないので、BASIC認証などを設定したほうがいいとおもいます。
<?php
/*
GyazoModoki Upload.php
This script accepts POST from anyone!!
You should be set .htpasswd
Edit your php.ini or .htaccess
e.g.
upload_max_filesize = 100M
post_max_size = 100M
Edit your .htaccess
image save directory : /foo/var/www/images/
http access sample : http://example.com/foo.png
e.g.
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} ^(.*\.(jpg|png))$ [NC]
RewriteCond %{REQUEST_URI} !^/images/*.*$
RewriteRule ^(.*)$ /images/$1
*/
/*
The MIT License (MIT)
Copyright (c) 2014 k725
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
$path = dirname(__FILE__) . '/images/';
$uri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
$length = 6;
$errimg = 'error.png';
if (!isset($_FILES['imagedata']['error']) || !is_int($_FILES['imagedata']['error']) || $_FILES['imagedata']['size'] < 1) {
echo $uri . $errimg;
exit;
}
for ($i = 0, $str = null; $i < $length; ) {
$num = mt_rand(0x30, 0x7A);
if ((0x30 <= $num && $num <= 0x39) || (0x41 <= $num && $num <= 0x5A) || (0x61 <= $num && $num <= 0x7A)) {
$str .= chr($num);
$i++;
}
}
$filename = $str . '.png';
$filepath = $path . $filename;
if (!isset($filepath) || file_exists($filepath) || !move_uploaded_file($_FILES['imagedata']['tmp_name'], $filepath)) {
echo $uri . $errimg;
} else {
$image = imagecreatefrompng($filepath);
imagealphablending($image, false);
imagesavealpha($image, true);
imagepng($image, $filepath, 9);
imagedestroy($image);
chmod($filepath, 0644);
echo $uri . $filename;
}
編集し終わった phpファイルをサーバにアップロードします。
クライアントで、ちゃんとアップロードできれば成功です。
qiita.com/test.pngのようにアクセスさせ、内部的にはqiita.com/images/test.pngで処理させたい場合、以下のように設定します。
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} ^(.*\.(jpg|png))$ [NC]
RewriteCond %{REQUEST_URI} !^/images/*.*$
RewriteRule ^(.*)$ /images/$1
gyazo鯖 参考
オレオレGyazo鯖構築 my.iesaba.com
Gyazowin GitHub.com
終わり
これで終わりです。
今年は、まともな記事をかけた気がします。
来年もネタがあれば参加しようかなと思います。
ありがとうございました。
サンクス
- ConoHa Advent Calendar 2018
- おっさ(ゲフンゲフン)かわいい qiita:mikumoconoha / Twitter:@mikumoconoha
- 私よりも5000兆%有能な他の日付の人。
- 見てくれた人
追記 ()
どうやら、参考にした記事をほぼまるまる使ったバチが当たったようで、肺気胸になり、入院しました。
平成最後に大手術(病院にもよるけど、45分以上かかる手術は大手術になるらしい)を受けたので満足です。
こんな追記でも、バチが当たったと思えばいいオチがついたかなって思います。
→退院しました。痛み止めは飲んでますけど。(2018/12/04)
入院は11/29です。