ユーザ用ツール

サイト用ツール


linux:http-proxy

HTTP PROXY構築

目的

プロキシサーバ構築の目的はいろいろあるが、ここでは外部へのWebアクセスの踏み台の役割を果たすサーバの構築を行う。プロキシサーバ無しのアクセスだと、直接接続しているネットワークからアクセス先にダイレクトにアクセスするため、直接接続したネットワークの管理者にはどこにアクセスしているのかや、httpsが無ければどんなデータが流れているのかを知られてしまう。それを回避するためにプロキシサーバを利用する。

httpsならば問題ないが生のhttpでは、プロキシサーバを経由しても通信内容を読み取られるため、プロキシを経由してどこにアクセスしているかは監視される。そこで、プロキシサーバまでのすべての通信を暗号化し、足元のネットワーク管理者にどこにアクセスしているかを知られないようにする。なぜそのようなことが必要かといえば、とりあえず足元のネットワークが怪しい場合などのセキュリティ対策など。。。

構成

ブラウザはfirefoxを想定する。ブラウザからプロキシサーバまではhttp/2を用いる。http/1.1ではプロキシサーバまでの暗号化が難しいため、http/2を用いる。サーバ側ではnghttpxコマンドでhttp/2のプロキシサーバを立てるが、nghttpxはフロントエンドのみで、実際のフォワードプロキシは別のサーバが担う。ここでは同一サーバ上のapacheで認証付きのフォワードプロキシサーバを構築する。

nghttpx

フロントエンドとなるhttp/2のプロキシサーバを構築する。

nghttp2パッケージをインストールする。「utils」USEフラグを有効にしないと、nghttpxコマンドなどはインストールされない。ちなみに、apache2で「http2」USEフラグを有効にすると、nghttp2が依存関係でインストールされる。apacheのhttp2にはnghttp2が利用されているらしい。

> emerge -av nghttp2

インストール後は、nghttpxコマンドでhttp/2プロキシサーバを起動する。

> nghttpx -D --user=nobody -s -f'FRONT_PROXY_ADDR,PORT' -b'BACKEND_PROXY_ADDR,PORT' privkey.pem fullchain.pem
  • -D
    • サーバモードで起動する。端末から切り離してバックグラウンドプロセスにする。
  • –user=nobody
    • rootユーザではなくnobodyユーザで動かす
  • -s
    • http2のフォワードプロキシ機能を有効化する
  • -f'FRONT_PROXY_ADDR,PORT'
    • 接続を受け付けるIPアドレスとポートを指定する。「*」も利用できるが、その場合はIPv6やUNIXドメインソケットも含めてすべてで待ち受けようとする。当サイトではIPv6はカーネルレベルで無効化しているので、「*」では起動できない。サーバに指定しているIPv4のIPアドレスを設定する。ポートは何でもよいが、iptablesなどでフィルタリングしていないかなどを確認しておく。
  • -b'BACKEND_PROXY_ADDR,PORT'
    • 実際に外部サイトにアクセスするフォワードプロキシを指定する。ここではローカルホストのapacheで構築するが、squid等でもよい。
  • privkey.pem
    • プロキシサーバまでの暗号化のためのssl秘密鍵のパスを指定。
  • fullchain.pem
    • 同じく証明書を指定。認証局の証明書も含めたものを指定した。認証局の証明書が含まれていないものは未検証。

apache

適当なところに以下の設定を記載する。https側の設定ではなくhttpサーバの設定に書く。

<IfModule mod_proxy.c>
    # フォワードプロキシ機能を有効化
    ProxyRequests On
    # プロキシ経由のヘッダをつけない(必要に応じて設定)
    ProxyVia Block
    # プロキシサーバのアクセス制限
    <Proxy "*">
      # フォワードプロキシにアクセスするためにダイジェスト認証をかける
      AuthType        Digest
      AuthName        "RCPS_PROXY"
      AuthUserFile    /etc/apache2/htpasswd_digest
      # 認証されたユーザで、かつローカルホストからのみアクセスを許可
      # ORではなくAND条件にするためにRequireAllが必要:apache2.4から
      <RequireAll>
        Require valid-user
        Require ip 127.0.0.1
      </RequireAll>
    </Proxy>
</IfModule>

ブラウザ(firefox)

firefoxの設定画面からでは、http/2のセキュアプロキシを利用する設定が直接できないのでPACファイルを用意し、「自動プロキシ設定スクリプト」としてい読み込ませる。内容は以下。

function FindProxyForURL(url, host) {
      return "HTTPS PROXY_ADDR:PORT";
}

PROXY_ADDRには、nghttpxが起動しているサーバのFQDNを指定する。IPアドレスではなく、証明書に記載されているホスト名にする必要がある。PORTはnghttpxで指定したポート。

linux/http-proxy.txt · 最終更新: 2018/10/08 23:09 by Wiki Editor