読者です 読者をやめる 読者になる 読者になる

人生リアルタイムアタック

当面はPython学習帳

CentOS6にsquidでプロキシサーバを立てる

はじめに

海外に居るため、一部国内のコンテンツが見れない。
さくらVPSに外部プロキシサーバを立てて、国内コンテンツを普通に見たい。

PC ---- ルータ ---- プロキシサーバ(さくらVPS) ---- Webサーバ

インストール

$ sudo yum install squid

…

=============================================================================================================
 パッケージ                アーキテクチャ      バージョン                         リポジトリー          容量
=============================================================================================================
インストールしています:
 squid                     x86_64              7:3.1.23-16.el6_8.4                updates              1.8 M
依存性関連でのインストールをします。:
 libtool-ltdl              x86_64              2.2.6-15.5.el6                     base                  44 k

トランザクションの要約
=============================================================================================================
インストール         2 パッケージ

総ダウンロード容量: 1.9 M
インストール済み容量: 6.4 M
これでいいですか? [y/N]y
パッケージをダウンロードしています:
(1/2): libtool-ltdl-2.2.6-15.5.el6.x86_64.rpm                                         |  44 kB     00:00
(2/2): squid-3.1.23-16.el6_8.4.x86_64.rpm                                             | 1.8 MB     00:00
-------------------------------------------------------------------------------------------------------------
合計                                                                         3.7 MB/s | 1.9 MB     00:00

2016/06/02現在、squid : Optimising Web Delivery によると最新は3.5.19とのことなので若干古い。

squid.confの設定

/etc/squid/squid.conf を編集する。

ルータからのアクセスを許可する為、自宅のIPアドレスを調べ許可IPアドレスとして登録する。 確認には先達に従い、 確認くん を使う。

# 元々あるhttp_access deny allの上に追記すること。
acl indoor src xxx.xxx.xxx.xxx/32
http_access allow indoor
http_access deny all

ポート番号はデフォルトから別の番号に変更する。 12345 は例なので適宜お好みで。

# Squid normally listens to port 3128
#http_port 3128
http_port 12345

プロキシサーバ経由であることを隠蔽する為、以下のオプションをファイル末尾に追記する。

# ローカルのIPアドレスを隠蔽
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 start

# 自動起動設定
$ sudo chkconfig squid on

squidのバージョンによっては startコマンド実行時にWarningが出るので適宜修正を行う。3系であれば上記設定でほぼ問題ないハズ。

iptablesの設定

iptablesによるポート制限も変更を行う。

:FWINPUT - [0:0]
-A INPUT -j FWINPUT
-A FORWARD -j FWINPUT
-A FWINPUT -i lo -j ACCEPT
-A FWINPUT -p icmp --icmp-type any -j ACCEPT
-A FWINPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FWINPUT -p tcp -m tcp --dport 12345 -s xxx.xxx.xxx.xxx -j ACCEPT
-A FWINPUT -j REJECT --reject-with icmp-host-prohibited

変更完了したらiptables再読み込み。

$ sudo iptables-restore < /etc/sysconfig/iptables

(任意)アカウントによるログイン制御

第三者の不正利用を防ぐ為にアカウントによるログイン制御を行うこともできる。認証方法は多数用意されているが、Basic認証と同じ仕組みがシンプルそう... と思ったが、nginxしか使ってないのでプロキシ専用のパスワードファイルを用意する。

# パスワード生成
$ sudo htpasswd -c /etc/squid/squid-passwd <user_name>
New password:
Re-type new password:
Adding password for user <user-name>

htpasswd コマンドが利用できない場合には、httpd-toolsをインストールすると良い。

$ sudo yum install httpd-tools

squid-passwdファイルを作成したら、squid.confに設定を追加する。
ただし記述順序に注意。http_accessは上から順に評価される。
先述のIPアドレス指定の後に設定を追加すると、自宅ではパスワードが不要、自宅外ではパスワード認証と使い分けることができる。

if IPアドレスが自宅:
  接続
elif BASIC認証OK:
  接続
else:
  接続不可
$ sudo vi /etc/squid/squid.conf

# 元々の自宅用設定
http_access allow indoor

# ここに自宅外設定を追加。
auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/squid-passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

acl outdoor proxy_auth REQUIRED
http_access allow outdoor

# 元々の deny all 設定
http_access deny all

OS Xのプロキシ設定

システム環境設定 > ネットワーク > 詳細 > プロキシ にて、HTTPとHTTPSの設定を行うだけでよい。

f:id:ShineSpark:20160602195952p:plain

設定が完了したら、ブラウザから改めて 確認くん にアクセスし、IPアドレスがさくらVPSのものに変わっていることを確認する。

もしくは sudo tail -f /var/log/squid/access.log してlogを眺めてみる。

参考