こんにちは。
ピクトリンク事業部開発部インフラ課の粟田です。
フリュー Advent Calendar 2018の12/10分の記事になります。
今回はみんなが大嫌いな(はずの)proxyについて書きます。
問題
弊社のproxyは管理部署が違うため、設定変更できないです(前提)。
なので、proxyの設定変更をすれば良いという意見は聞きません!
- 社内のproxyがDIRECT接続を設定していない。
- proxyを設定したままだと社内のサーバに繋がらない。
- 設定を消すとgithubなど外部のサービスに繋がらない。
- ブラウザ設定(Windowsの場合はIEから設定するシステム用)のproxy設定にproxy.pacを設定している。
- Linux上のコンソールで作業する時、http_proxy環境変数などにproxy.pacを設定できない(しても効かない)。
- 最近はactive directoryで自動配信(IE上などで「自動的に設定する」となってる)になったので、proxy.pacの在処がわからない。
といった事が発生しますよね。
特にDIRECT接続が設定されていないのは問題があります。
たとえば、プログラムのコンパイル時など、社内/社外両方のリポジトリからライブラリを引っ張ってくる時とかに非常に困るんです。
暫定対策
自分一人だけが、手っ取り早くなんとかするというのなら、proxy用の環境変数の設定が早くできれば良いので、以下を実施していました。
社内のproxyサーバの情報を取得する
proxy.pacをダウンロードするなり、人に聞くなりの手段にて。
以降の説明では社内proxyを“192.168.100.10:3128”とします。
proxy設定用のスクリプトを作成する
proxy.shみたいなファイルを~/binとかに配置
case $1 in on) export http_proxy=http://192.168.100.10:3128/ export https_proxy=http://192.168.100.10:3128/ export ftp_proxy=http://192.168.100.10:3128/;; off) unset http_proxy unset https_proxy unset ftp_proxy;; esac
- ~/.bashrcとか~/.zshrcとかにaliasを設定
proxy='. ~/bin/proxy.sh'
’.’ を指定してあるので、sourceを指定しているのと同じ意味合いになります。
なので、呼び出したshellに環境変数が設定された状態を作ることができるようになる訳です。
- proxyの要否をコマンド実行時に切り替え
$ proxy on
とか
$ proxy off
してからネットワークを使うコマンド実行
ビルドプロセス中とかでない場合、またはビルドプロセスでも外部のリポジトリに依存している物をローカルに先にキャッシュしておく、などで同時接続を防ぐ事ができるなら、まぁこれで許容できるかな、という感じですね。
これで一旦は切り替えが楽になったけれども、やっぱり一々切り変えるの面倒じゃないですか?
今実施している別の対策
多段proxyを自分のローカルPC上に建てました。
普段の作業をLinuxのコンソールで実施しているので、パッケージでsquidインストールして常に環境変数設定しとけば良いやん、と。
export http_proxy=http://localhost:3128/ export https_proxy=http://localhost:3128/ export ftp_proxy=http://localhost:3128/
って、.bashrcか.zshrcに書いときゃえーやん、と。
なので、ローカルPCにsquidをインストールして、設定を記述。
ローカルなネットワークドメイン名とかは当然知っているものとして、squid.confのコメントを便りに設定しました。
以降では社内ドメインとして以下の2つを使用します。
- example1.com
- example2.com
また、社内LANのIPレンジとして以下の2つを使用しているとします。
- 192.168.20.0/24
- 192.168.100.0/24
2つづつ定義してあると、自分の環境に併せて編集する際に書き方わかるので良いかな、と……
acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT acl local_server dst localhost acl local_server_dom dstdomain .example1.com .example2.com acl local_seg dst 192.168.20.0/24 192.168.100.0/24 127.0.0.1/32 http_access allow all http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost http_access deny all always_direct allow local_server local_server_dom local_seg http_access allow localhost http_access deny all http_port 3128 cache_peer 192.168.100.10 parent 3128 0 no-query cache_peer_access 192.168.100.10 allow !local_server !local_server_dom !local_seg coredump_dir /var/spool/squid3 pinger_enable off refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880 refresh_pattern . 0 20% 4320 visible_hostname localhost icp_port 0 never_direct allow !local_server !local_server_dom !local_seg append_domain .example1.com no_cache deny all
proxy設定はiptablesなどの設定とかでもある様に定義する順番が重要だったりします。
ちゃんとサンプルファイルやコメントを見ながら自分の環境に併せるの重要ですよ!
以下、軽く解説
- 1〜12行目は、ポート設定ですね。パッケージデフォルトの設定にも入っているかと。
- 13〜15行目でローカルのネットワーク情報を設定してあります。
- 16〜25行目で許可設定ですね。順番大事(許可してから全部塞ぐ)です!
特に重要なのは23行目で、ローカルのセグメントには必ずDIRECTアクセスさせる所ですかね。 * 26行目で新しく建てるproxyのポートを設定(デフォルト!) * 27〜28行目で社内プロキシ(転送先)を指定します。 * 29〜35行目は無視するとして(よくわかってない) * 36行目でPCのホスト名をちゃんと設定しましょう。
squidが返すエラーページにこのホスト名が載ってきます。localhostは適当過ぎる! * 37行目は無視するとして(よくわかってない再び) * 38行目でローカルのセグメントではない物のDIRECTアクセスを拒否してます。 * 39行目はいらないかもしれないけれども、過去に上手く動かないものがあったので、サーバ名(ドメイン名指定なし)でブラウザアクセスした場合などに、サーバ名(ドメイン名指定あり)に変換する際のドメイン名になります。
※ 逆に邪魔になる時もあるので注意する。不要なら消しても影響ないはず。 * 40行目は記載の意味が良くわからないですが、キャッシュしない(キャッシュプロキシとして動作しない)為の設定だそうです。
(「キャッシュしない」のを「全て」で「拒否」する、と読んだら全部キャッシュしそうな気がしません?)
## あとがき
長年戦ってきた社内proxyと折り合いを付ける為だけに頑張ってみた結果こうなりました…