こんにちは。
ピクトリンク事業部開発部インフラ課の粟田です。

フリュー 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用の環境変数の設定が早くできれば良いので、以下を実施していました。

  1. 社内のproxyサーバの情報を取得する
    proxy.pacをダウンロードするなり、人に聞くなりの手段にて。
    以降の説明では社内proxyを“192.168.100.10:3128”とします。
  2. proxy設定用のスクリプトを作成する
    proxy.shみたいなファイルを~/binとかに配置
  3. ~/.bashrcとか~/.zshrcとかにaliasを設定

    ’.’ を指定してあるので、sourceを指定しているのと同じ意味合いになります。
    なので、呼び出したshellに環境変数が設定された状態を作ることができるようになる訳です。
  4. proxyの要否をコマンド実行時に切り替え

    とか

    してからネットワークを使うコマンド実行

ビルドプロセス中とかでない場合、またはビルドプロセスでも外部のリポジトリに依存している物をローカルに先にキャッシュしておく、などで同時接続を防ぐ事ができるなら、まぁこれで許容できるかな、という感じですね。
これで一旦は切り替えが楽になったけれども、やっぱり一々切り変えるの面倒じゃないですか?

今実施している別の対策

多段proxyを自分のローカルPC上に建てました。
普段の作業をLinuxのコンソールで実施しているので、パッケージでsquidインストールして常に環境変数設定しとけば良いやん、と。

って、.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つづつ定義してあると、自分の環境に併せて編集する際に書き方わかるので良いかな、と……

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と折り合いを付ける為だけに頑張ってみた結果こうなりました…

本当はもう1つ問題があるけれども、完全に弊社の問題なので割愛。