社内のproxyサーバと折り合いを付けたやりかたの紹介


目次

こんにちは。

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

フリュー 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”**とします。
  1. proxy設定用のスクリプトを作成する
proxy.shみたいなファイルを~/binとかに配置</p> ```lang:sh decode:true" title="proxy.sh

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


  3. ~/.bashrcとか~/.zshrcとかにaliasを設定 ```lang:sh decode:true " title="alias
proxy='. ~/bin/proxy.sh'
’.’ を指定してあるので、sourceを指定しているのと同じ意味合いになります。

なので、呼び出したshellに環境変数が設定された状態を作ることができるようになる訳です。</li> 

  * proxyの要否をコマンド実行時に切り替え ```lang:sh decode:true" title="proxy.sh

$ proxy on

        
        とか
        
        ```lang:sh decode:true" title="proxy.sh
$ proxy off
    してからネットワークを使うコマンド実行</li> </ol> 
    
    ビルドプロセス中とかでない場合、またはビルドプロセスでも外部のリポジトリに依存している物をローカルに先にキャッシュしておく、などで同時接続を防ぐ事ができるなら、まぁこれで許容できるかな、という感じですね。

    これで一旦は切り替えが楽になったけれども、やっぱり一々切り変えるの面倒じゃないですか?
    
    ## 今実施している別の対策
    
    多段proxyを自分のローカルPC上に建てました。

    普段の作業をLinuxのコンソールで実施しているので、パッケージでsquidインストールして常に環境変数設定しとけば良いやん、と。
    
    ```lang:sh decode:true " title="export

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つづつ定義してあると、自分の環境に併せて編集する際に書き方わかるので良いかな、と……
        
        ```lang:default decode:true " title="squid.conf
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と折り合いを付ける為だけに頑張ってみた結果こうなりました…
    
    本当はもう1つ問題があるけれども、完全に弊社の問題なので割愛。
    
    &nbsp;