ちょっと話題の記事

目指せ脱オフィス! Apache HTTPDで社内フォワードプロキシを立ててみた

2014.04.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは植木和樹です。本日は社内フォワードプロキシサーバー構築手順の備忘録になります。

お客様と案件のやりとりをする際にクラスメソッドではredmineやBacklogなどチケット管理システムを使うことが多いです。redmineを使う際には弊社グローバルIPからしか繋がらないようIP制限をかけています。redmine以外にも開発中・検証中のサーバー環境にはIP制限をかけてクローリングや第三者からの閲覧を防ぐことも多いです。

社内LANからこのredmineにコメントを書き込む際には問題ないのですが、出先や在宅勤務中はコメントが書き込めず困ってしまいます。そのためクラスメソッドにはVPN環境が用意され、社内LANに接続して作業ができるようになっています。

しかしVPN経由でIP制限のかかったサイトに繋ぐには下記のような手順をふむ必要があります。

  1. Macbookに入っているVMware FusionでWindowsを起動する。
  2. Windows版のVPNクライアントを起動し、社内LANに接続する。
  3. リモートデスクトップで社内にある踏み台Windows端末にログインする。
  4. 踏み台Windowsでブラウザを起動しIP制限のかかったページを開く。

少々、いやかなり面倒です。そこで社内プロキシサーバーを用意することで、この手間を改善してみたいと思います。

プロキシ構築手順

環境

OS
CentOS release 6.5 (Final)
Apache
httpd-2.2.15

設定

プロキシは8080番ポートで起動します。

Apacheにはmod_proxyというモジュールがあるのでこれを有効にします。またHTTPのプロキシなのでmod_proxy_httpを、さらにHTTPSで接続先のサイトに繋ぐことがあるためmod_proxy_connectも必要です。社内サーバーなので接続元ホストによる制御は本来不要ですが、慣習として残しています。

下記のファイルを作成し /etc/httpd/conf.d に保存します。CentOSのhttpdは /etc/httpd/conf.d/*.conf を起動時自動的に読み込んでくれます。

/etc/httpd/conf.d/forward_proxy.conf

Listen 8080
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so

<IfModule proxy_module>
    ProxyRequests On
    ProxyVia On

    CustomLog logs/proxy_log combined
    <Proxy *>
        Order deny,allow
        Deny from all
        Allow from 192.168.
    </Proxy>
    NoProxy 192.168.0.0
</IfModule>

iptablesの変更

CentOSではiptablesによるアクセス制御が有効になっているので、次の設定を /etc/sysconfig/iptables に追記して、設定を再読み込みします。(後述する自動プロキシ構成スクリプト配布のため80番ポートも有効にしています。

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

プロキシ自動構成スクリプトの作成

通常はこの後ブラウザでプロキシサーバーのホスト名(IPアドレス)とポート番号を指定すればプロキシを経由して外部サイトと繋がるのですが、このままだとすべてのHTTP/HTTPSリクエストがプロキシを通ってしまい速度が遅くなってしまいます。そこで冒頭で説明したような弊社のグローバルIPアドレスで制限をかけているサイトだけプロキシを使うよう「プロキシ自動構成スクリプト(通称pacファイル)」を用意しましょう。

pacファイルはJavaScriptで書きます。記述例を下記に掲載します。とても簡単なので、なにをやっているかはだいたい分かるのではないでしょうか。例ではrestrict.example.com203.0.113.1がIP制限のかかったサイトなのでプロキシを経由するようブラウザに指示してします。これ以外のサイトはDIRECTということでプロキシを経由させないようにします。サイトが増えた場合にはこの行を増やせばいいわけですね。

/var/www/html/proxy.pac

function FindProxyForURL(url, host) {
    //alert(url);
    var proxy = "PROXY proxy.example.com:8080";
    if (
        shExpMatch(url, "https://restrict.example.com/*")
     || shExpMatch(url, "https://203.0.113.1/*")
    ) {
        //alert("Proxy Access");
        return proxy;
    }
    return "DIRECT";
}

ちなみにalert()はデバッグ用です。このalertを有効にしておくとページをリエストするたびにそのURLを、さらにプロキシ経由と判定された場合は"Proxy Access"というメッセージをポップアップで表示します。

ブラウザでの設定

Windowsでは「コントロールパネル」の「インターネットオプション」、Macの場合は「システム環境設定」-「ネットワーク」からプロキシの設定ができます。参考までにWindows、Macそれぞれの設定画面を掲載しておきます。自動構成スクリプトのアドレスにはpacファイルを置いたサーバー(今回はプロキシサーバー自身)のパスを入力してください。

Windowsの場合

proxy_002

Macの場合

proxy_001

まとめ

社内プロキシサーバーを用意することで、これまで4つだったアクセス手順が2つに減り作業効率がグッとアップしました。

  1. Macbookに入っているVMware FusionでWindowsを起動する。
  2. Windowsでブラウザを起動しIP制限のかかったページを開く。

手順が減っただけでなく、redmineにファイルをアップロードする際にも一々踏み台にファイルをコピーする必要がなくなったのがうれしいですね。(これでようやく踏み台に使っていたWindows XPを引退させてあげられそうです)

VPNと社内プロキシがあれば、ノマドワークや在宅作業をする際にも事務所にいるのと変わりなく仕事ができそうですね!