Home » Featured, Headline, 設定

ServersMan@VPSエントリープランでWEBプロキシサーバ構築

2012 / 5 / 15 コメント募集

無駄にリファラやプロバイダ情報などを送信したくないので、490円の格安VPS、DTIのServersMan@VPSを利用してsquidによるプロキシサーバを構築してみました。

※2012年8月現在、ServersMan@VPSはあまりにもメンテナンスが多いため解約しました。
結局、遊びにも使えない品質でした。。。

ServersMan@VPSについて

DTIのServersMan@VPSは、勝手に後からroot権限でソフトウェアをインストールされたり、sshのポート番号を変えられたりと、今のところ色々とトラブルの多い商品です。
現状では、sshのポート番号については最初から3843ポートに変更されているのでこれについては問題無いと思いますが、今後ソフトウェアが自動的にインストールされてしまう可能性は捨て切れません。
しかし月額490円はやはり魅力的です。
squidのみを動かせば、いざサーバ側に問題が起きた場合でもクライアント上ではプロキシサーバの設定を外すだけで普通にブラウズ出来ますし、VPS内にあるデータといえばキャッシュのみなので比較的安全です。要は使いようですね。
あまりリソースを食わず、限定した利用に特化したサーバを構築する場合ならエントリープランでも十分遊べます。
その反面、エントリープラン以外は魅力的には思えません。もっとスペックを求めるならさくらインターネットのVPSが安くてお勧めです。

今回はエントリープラン、CentOS5.4の64ビットを選択しました。
保証メモリの256MBを超える分に関してはどのような扱いになるのか不明なので、256MBで動作するようにややスパルタンな設定にします。

セットアップ

まずはyum関係をアップデート。


sed -i -e "s/enabled=1/enabled=0/g" /etc/yum/pluginconf.d/fastestmirror.conf
rpm --import http://ftp.iij.ad.jp/pub/linux/fedora/epel/RPM-GPG-KEY-EPEL-5
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
yum --enablerepo=remi -y update

#通常のレポジトリとsquidのバージョンが同じならepelやremiのレポジトリはいらないのかも

ユーザ作成、ssh設定等

適当なユーザを作成して、sshの設定をします。


useradd admin
passwd admin
適当なパスワード入力

ファイル:/etc/sshd_config

permitrootlogin no #ルートログイン不可
authentificationpassword no #パスワードログイン不可

service sshd restart

#安全のためクライアント-ホスト間を公開鍵認証でログインをする
公開鍵認証については端折りますので適当にググってください

ホストネーム設定

下記のファイルのホストネームを適当に設定します。
ファイル:/etc/hosts
ファイル:/etc/sysconfig/network
例:proxy.localdomainなど

要らないサービスを停止、自動起動停止、ソフトウェア削除

今回はsquidしか利用しないので、関係のないサービスは停止します。

service serversman stop
service httpd stop
service ajaxterm stop
service smadmd stop
service saslauthd stop
service xinetd stop

自動起動も停止

chkconfig serversman off
chkconfig httpd off
chkconfig ajaxterm off
chkconfig smadmd off
chkconfig saslauthd off
chkconfig xinetd off
chkconfig iscsi off
chkconfig iscsid off

ソフトウェアも削除

yum remove httpd
yum remove serversman
yum remove samba
yum remove ftp
yum remove cyrus-sasl
yum remove smadmin

◯ajaxtermの削除
ブラウザ上でターミナルエミュレーションを行うソフトウェアですが、独自にインストールされているようなので手動で削除します。
うーたんの小部屋:勝手にAjaxtermをインストールされた


chkconfig --del ajaxterm
rm -rf /etc/init.d/ajaxterm
rm -rf /usr/local/bin/ajaxterm
rm -rf /usr/local/share/ajaxterm/
rm -rf /usr/local/share/man/man1/ajaxterm.1.gz
rm -rf /etc/httpd/conf.d/proxy_ajaxterm.conf

#yumのアップデートを行う前に上記を削除すればスマートかも

iptables設定

アウトバウンドは許可、インバウンドは基本全DROPして、最低限の部分のみ許可設定。ログも吐かせます。

あまりiptablesの設定に詳しくなかったので下記のサイトを参考にしました。

誰得UNIX-BLOG:ServersMan@VPSでのiptables設定(state版)
せりかログ:proxy

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-N MYCHAIN
-A MYCHAIN -m state --state ESTABLISHED,RELATED -j ACCEPT
-A MYCHAIN -p icmp -j ACCEPT
-A MYCHAIN -i lo -j ACCEPT
-A MYCHAIN -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT
-A MYCHAIN -m state --state NEW -m tcp -p tcp --dport 3843 -j ACCEPT
-A MYCHAIN -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A MYCHAIN -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A MYCHAIN -m state --state NEW -m tcp -p tcp --dport 50000 -j ACCEPT
-A MYCHAIN -m tcp -p tcp --dport 113 -j REJECT --reject-with tcp-reset
-A MYCHAIN -j LOG --log-prefix "IPTABLES_INPUT_LOG : " --log-level=info
-A MYCHAIN -j DROP
-A INPUT -j MYCHAIN
COMMIT

#squidの標準ポート(3128)を50000ポートに変更して利用します

上記をiptables.txtなどにセーブして、

/sbin/iptables-restore < iptables.txt service iptables save service iptables restart

ip6tables設定

ServersMan@VPSではipv6が使えます。が、ipv6は今のところ利用する予定はないので全DROPします。
いちいち設定ファイルとか作るのもダルいのでコマンド入力で。

ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP
service ip6tables save
service ip6tables restart

squid設定

◯squidのインストール

yum --enablerepo=remi -y install squid

#今回squid2系がインストールされました。epelやremiには3系がまだないんでしょうか。3系はサーバのリソース的に厳しいらしいそうなのでServersMan@VPSには2で良いかと

yumのキャシュも消します。

yum clean all

◯squidの設定ファイル
これが一番大変な作業。とにかく設定ファイルが長い!5000行近くありますかね?全部英語で説明や設定サンプルなどが書いてあるので見かけほどではありませんが、設定項目もそれなりに多いです。
英語がスラスラ読める人なら楽勝ですが、項目別にググったり翻訳すれば何とかなります。
変更したところのみ、行数付きで下記にまとめました。
ファイル:/etc/squid/squid.conf

BASIC認証関連
76	auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/passwd
84	auth_param basic children 6
97	auth_param basic realm Squid proxy-caching web server
108	auth_param basic credentialsttl 24 hours
115	auth_param basic casesensitive on
569	acl password proxy_auth REQUIRED

80ポートでのSSL許可
578	acl SSL_ports port 443 80

認証関連
637	http_access allow password

squidのポート変更
922	http_port 50000

メモリ、キャッシュ関連
1580	cache_mem 128 MB
1589	maximum_object_size_in_memory 8192 KB
1787	cache_dir ufs /var/spool/squid 4096 16 256
1826	maximum_object_size 32768 KB

ログ関連
1949	access_log /var/log/squid/access.log auto
2037	emulate_httpd_log on

コード404の待機時間
2510	negative_ttl 60 seconds

情報漏洩防止
2752	header_access Referer deny all
2767	header_access Cache-Control deny all
↓yumで落としたものには	--enable-http-violations付きではなかったため、書き換えても無駄でしたorz
2807	header_replace User-Agent Mozilla/4.0 (compatible; NetPositive/2.2.2; BeeOS)
3008	visible_hostname unknown

ICPは利用停止
3541	 icp_port 0

元IPアドレス漏洩防止
4279	forwarded_for off

◯補足
76行目:64ビットOSの場合、BASIC認証受付用のプログラムは/usr/lib64/squid/ncsa_authにありました。/etc/squid/passwdはBASIC認証のパスワードファイルの場所です。分かる場所ならどこでもいいかと。
578行目:どうやら443ポート使わないサイトもあるようで。。。
922行目:先ほどのiptablesの設定でも説明したとおり、ポートを変更しました。49152〜65535ならどこでもいいかと。
1580行目:32MB、64MBと設定して様子を見、現在は128MBにしています。
1947,2037行目:squidのログを見ても訳が分からなかったため(笑)、apacheと同じ形式に変更しました。
2807行目:設定項目にも書いてありますが、今回yum経由で落としたものにはコンパイルオプションでhttp-violationsが付いてなかったので、この項目は利用できませんでした。大好きだったBeOSのUA使おうと思ってたんですけど。("BeeOS"となっていますがこれはお遊びです)

squidの設定は下記を参考にしました。
Solaris User:Squid(プロキシサーバ、キャッシュサーバ)の設定方法(squid.confの書き方)
コロのLinuxサーバ構築:squidによるプロキシサーバーの構築
Kozupon.com:SquidによるProxyサーバ!
squid.robata.org:squid.conf squid 設定ファイル 日本語 Proxy キャッシュ

BASIC認証

squidを自分用のプロキシにするのでBASIC認証をかけます。


htpasswd -c /etc/squid/passwd 適当なユーザ名
パスワード入力

DIGEST認証も出来ますが、試した時にうまく動かなかったのでとりあえずBASIC認証にしました。

ログ関連

◯カーネルログ、iptablesのログ設定

ServersMan@VPSではなぜかカーネルログが止められているので、ログを吐くように変更します。
うーたんの小部屋:ServersMan@VPS kernelログが取得できない

ファイル:/etc/rc.d/init.d/syslog

41行目付近    daemon klogd $KLOGD_OPTIONS #passed klogd skipped
48行目付近    killproc klogd #passed klogd skipped 

上記のようにコメントと入れ替えます。

iptablesの設定でiptablesだけinfoレベルでカーネルログに吐かせているので、これを別ファイルにします。
ファイル:/etc/syslog.conf

kern.*			/dev/console #コメントアウトされていた

#
# Logging for iptables Netwark Filtering.
#
kern.info                      /var/log/iptables.log #追記

◯syslog再起動
service syslog restart

◯squidのログローテート設定

とりあえずデイリーで2週間分のログを圧縮してとっておきます。
ファイル:/etc/logrotate.d/squid

/var/log/squid/access.log {
	daily
	rotate 14
    copytruncate
    compress
    notifempty
    missingok
}
/var/log/squid/cache.log {
	daily
	rotate 14
    copytruncate
    compress
    notifempty
    missingok
}

/var/log/squid/store.log {
	daily
	rotate 14
    copytruncate
    compress
    notifempty
    missingok
# This script asks squid to rotate its logs on its own.
# Restarting squid is a long process and it is not worth
# doing it just to rotate logs
    postrotate
      /usr/sbin/squid -k rotate
    endscript
}

◯iptables用のログローテート設定ファイルを作成
こちらもとりあえずデイリー、2週間、圧縮。
ファイル:/etc/logrotate.d/iptables

/var/log/iptables.log {
	daily
	rotate 14
    copytruncate
    compress
    notifempty
    missingok
}

◯カーネルログその他のログもログローテートでデイリー、2週間、圧縮ありに設定
ファイル:/etc/logrotate.conf

# see "man logrotate" for details
# rotate log files weekly
#weekly
daily

# keep 4 weeks worth of backlogs
rotate 14

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    minsize 1M
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    minsize 1M
    create 0600 root utmp
    rotate 1
}

ログローテートの設定に関してはトラブルがあった時に分かればよいので、実はローテートしなくてもいいのかもしれません。というのも、うまく動かない場合、普通にネットしていれば繋がらなかったりするので分かるはずだからです。でも、まぁ一応。

起動

◯squid起動設定

chkconfig squid on

◯念のためサーバーを一度再起動する
reboot

運用

これでブラウザやOS側からプロキシの設定をすれば動くはずです。
必要な情報は、BASIC認証のユーザ名とパスワード、サーバのIPアドレス、ポート(上記設定の場合は50000)です。

◯使用感、匿名性について
構築して1ヶ月程度立ちますが、動作に不満はなく、やや心配だったネットワークの速度も通常利用ではまったくストレスを感じません。匿名性もそこそこで、診断くんではプロキシと判断されるものの、A+判定でした。UAの偽装が出来なかったのは残念ですが。
IPアドレスが固定されるので匿名性に関してはなんとも言えないのですが、慣れれば1時間程度で設定出来るので飽きたら別のサーバに引っ越すのもありでしょう。

◯メモリに関して
メモリは色々調整して128MBをキャッシュの利用に割いていますが、実際はsquid自体のメモリ消費などもあるので、squid全体で168MB程度利用しているようです。サーバ全体としては物理メモリを196MB程度利用しています。エントリープランの保証メモリは256MBなので、現実的にはこれ以上キャッシュに割り振れないと思います。しかし、たかがプロキシのキャッシュなので消えようがどうでも良く、保証メモリ以上でも動くと思いますので色々調整して増やしてみるのも面白いかも。プロセス切られるかもしれませんが(笑)

◯ディスク消費に関して
エントリープランは10GBとのことですが、ログとキャッシュデータ以外にはほとんど食いません。2週間分のログでも大したことがなかったので、squidキャッシュ用を2GB→4GBに増やしました。
様子を見ながらですが、もう少し増やしても大丈夫かも。

◯その他
実はVPSを借りてプロキシを構築した最初の動機は、iPhoneもプロキシサーバの設定が出来るということでした。しかし、設定後にいろいろ問題が出たので現状では使っていません。
(純正のyoutubeアプリでyoutubeにログインした状態だと動画が再生されない、など)
pacファイル使って指定サイトをプロキシ通さない設定にすれば良いらしいのですが、それこそサイトやアプリなんて無数にあるので面倒だなと思い、現状ではiPhoneにはプロキシは通さないで利用しています。
参考:iPhone, iPod touch & squidまとめ

また、Macの場合OS側の設定でプロキシの設定が出来るのですが、アプリケーションごとに個別にプロキシを設定できたり(例:dropbox)、できなかったり(safariとchromeはOS側のプロキシに依存するため)、不具合がでたり(iTunesやAppstoreでのAppleID認証関連、microsoft skydriveアプリ. 2012/05現在)、などなど、少し様子を見ながら調査中です。

今回はsquidには突っ込んだ設定はしていなかったので、キャッシュの条件などsquidのチューニングでしばらく楽しめそうです。


[24時間365日] サーバ/インフラを支える技術 ‾スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[`evernote` not found]

どうぞこの記事に関するコメントをお寄せ下さい

Add your comment below, or trackback from your own site. You can also subscribe to these comments via RSS.

Be nice. Keep it clean. Stay on topic. No spam.

これらのタグのみ使用出来ます:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

This is a Gravatar-enabled weblog. To get your own globally-recognized-avatar, please register at Gravatar.

*