notebook

都内でWEB系エンジニアやってます。

proxyサーバを立ててみる

概念自体は知っていたけど実際にやってみたことがなかったのでとりあえずやってみる

記事上ではIPは適当な値に書き換えています

あらかじめ適当なサーバを立て(52.111.111.111)、nginxを起動させておく

とくにデフォルトのままいじってない状態

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

通常アクセス

rubyからリクエストを送ってみる

  • コード
#/usr/bin/env ruby

require 'net/http'

target_host = '52.111.111.111'

http = Net::HTTP
res = http.get(target_host, '/')
p res

実行するとWelcomeページのhtmlが出力されます

106.181.145.11 - - [23/Oct/2016:05:43:45 +0000] "GET / HTTP/1.1" 200 3770 "-" "Ruby" "-"

アクセスがきたことを確認できました

プロキシサーバの構築

プロキシを立ててみます。squidを使います。今回はAmazon Linuxで立てました

適当にインスタンスを立ち上げインストール作業を行います

yum install squid
  • 設定

本来ならちゃんとACLを設定しないとみんなのプロキシになってしまうので注意が必要

今回はお試しだったのでがばがば設定で起動した

http_port 8080
.....
.....
.....
http_access allow all
  • 起動
sudo /etc/init.d/squid start

インスタンスの8080ポートにアクセスできるFWは設定しておきます

アクセスしてみる

  • proxy経由コード
#/usr/bin/env ruby

require 'net/http'

target_host = '52.111.111.111'
proxy_host  = '52.222.222.222'

proxy = Net::HTTP::Proxy(proxy_host, 8080)
proxy.start(target_host) {|h|
  res = h.get('/')
  p res.body
}
52.222.222.222 - - [23/Oct/2016:05:49:44 +0000] "GET / HTTP/1.1" 200 3770 "-" "Ruby" "106.181.145.11"

はい、アクセスもとのIPがプロキシのIPに変わりました

X-forwarded-Forも入っているようなのでどこ経由かという情報はわかりますね

プロキシ側でのアクセス許可

そもそもプロキシサーバ側の許可が下りない場合は 403 でエラーが返ります

この時点で403ですね、なのでターゲットまで通信が行きません

1477202419.675      0 106.181.145.11 TCP_DENIED/403 3571 GET http://52.111.111.111/ - NONE/- text/html

リクエストヘッダのコントロール

  • X-forwarded-For
    • 大本のIPや経由情報が入っている
  • Via
  • Cache-Control
    • キャッシュに関する内容が記述される

上記の情報を送らないような設定をしてみる

forwarded_for off
request_header_access Via deny all
request_header_access Cache-Control deny all
request_header_access X-Forwarded-For deny all
52.222.222.222 - - [23/Oct/2016:06:21:45 +0000] "GET / HTTP/1.1" 200 3770 "-" "Ruby" "-"

1度目の実行時にはあったX-Forwarded-Forが消えてることを確認

他の情報はログからだと確認できないがリクエストヘッダも隠せることがわかりました

立てるのは簡単なので必要があればすぐ立てれますね

ただ、アクセスコントロールだけしっかり理解して設定する必要がありそうです

勉強になりました。