概念自体は知っていたけど実際にやってみたことがなかったのでとりあえずやってみる
記事上では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 でエラーが返ります
- squid側のログ
この時点で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が消えてることを確認
他の情報はログからだと確認できないがリクエストヘッダも隠せることがわかりました
立てるのは簡単なので必要があればすぐ立てれますね
ただ、アクセスコントロールだけしっかり理解して設定する必要がありそうです
勉強になりました。