ConoHaでプロキシ,自分用のgyazo鯖立てた話とか

# はじめに
この記事は「[ConoHa Advent Calendar 2018](https://qiita.com/advent-calendar/2018/conoha) 」の第六日目のために書いた記事です。

去年も書かせていただきたのですが、ドヤ顔で書いたら間違っていたという超恥ずかしいことをしました。
悲しいです。

# 本題へ
さて、そろそろ本題に入らせていただきます。

タイトルにも書いている通り、自分用に作ったプロキシサーバーと自分用に作ったgyazo(スクリーンショットをすばやく公開するサービス→[gyazo.com](https://gyazo.com/about?lang=ja))を作った話をさせていただこうかなとおもいます。

## 注意点とか
あくまで自分が使う用ないし、作ったけどあんまり使ってないとかですので、セキュリティーとかガバガバだったりします。
**これを見て実行しようという人はいないかと思いますが、万が一実行する人はそのへんをしっかり対策することをおすすめというかしてください。**
特にプロキシサーバーの場合、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](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7)から)
### 必要なものをインストールする
プロキシサーバー用のパッケージ「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 よく使うコマンド](https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e)

これで構築完了です。
### 動作確認
Win10の場合:設定から「ネットワークとインターネット」から「プロキシ」にある、「手動プロキシ セットアップ」から設定します。

![手動プロキシ セットアップのスクリーンショット](https://cdn.yama2211.biz/public/qiita/qiita-1.PNG)
アドレスはConoHaのコンパネにある、「IPアドレス」を記入します。ポートは、設定で記入したポート番号(http_port)を記入します。

記入したら「保存」をクリックします。

http://www.ugtop.com/spill.shtml に接続してみて、IPアドレスが構築したConoHaサーバーのIPになっていれば成功です。

### プロキシ鯖 参考
[pcnikki](https://qiita.com/pcnikki)さんの [5分で作るPROXYサーバー](https://qiita.com/pcnikki/items/404329f9ad9cb6e235d4)
ほとんど丸パクリしました。すみませんでした。
[kenjjiijjii](https://qiita.com/kenjjiijjii)さんの [CentOS 7 firewalld よく使うコマンド](https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e)
firewalldコマンドを覚えてなかったので、参考にコマンドを打ちました。

# gyazoサーバー編
...とその前に、gyazoとは?
Gyazoは、オープンソースソフトウェア[2]でMicrosoft Windows, OS X、Linuxで動くスクリーンショットソフトウェアである。([Wikipedia](https://ja.wikipedia.org/wiki/Gyazo)より)

### 必要なものを用意する
- Apacheなどのwwwサーバ
- PHP実行環境
- C++ビルド環境 (今回は Visual Studio 2017のCommunity版)
- Gyazo クライアントの[ソースコード](https://github.com/gyazo/Gyazowin)


### クライアント側(PC側)
<code>gyazowin.cpp</code> の794と975行目を、自分のサーバー、ファイル名は<code>upload.php</code>にします。

ビルドが成功すると <code>gyazowin.exe</code>が作成されます。

※私の環境では、「識別子"なんたら"が宣言されてない」など、赤い波線が大量だったので、スクリーンショットはありません。[※追記]

[※追記]:Visual Studio 2015 Communityで起動させると、赤い波線が消えて、普通に編集できました。

### サーバ側
<code>upload.php</code> を作成します。
※このスクリプトはセキュリティ上好ましくないので、BASIC認証などを設定したほうがいいとおもいます。

``` php:upload.php
<?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で処理させたい場合、以下のように設定します。

``` :.htaccess
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鯖構築](https://my.iesaba.com/posts/gyazo-server-setup) my.iesaba.com
[Gyazowin](https://github.com/gyazo/Gyazowin) GitHub.com

# 終わり
これで終わりです。
今年は、まともな記事をかけた気がします。
来年もネタがあれば参加しようかなと思います。
ありがとうございました。

## サンクス
- [ConoHa Advent Calendar 2018](https://qiita.com/advent-calendar/2018/conoha)
- おっさ(ｹﾞﾌﾝｹﾞﾌﾝ)かわいい qiita:[mikumoconoha](https://qiita.com/mikumoconoha) / Twitter:[@mikumoconoha](https://twitter.com/mikumoconoha)
- 私よりも5000兆%有能な他の日付の人。
- 見てくれた人

## 追記 ()
どうやら、参考にした記事をほぼまるまる使ったバチが当たったようで、肺気胸になり、入院しました。
平成最後に大手術(病院にもよるけど、45分以上かかる手術は大手術になるらしい)を受けたので満足です。
こんな追記でも、バチが当たったと思えばいいオチがついたかなって思います。
→退院しました。痛み止めは飲んでますけど。(2018/12/04)
入院は11/29です。