概要
セキュリティの厳しい会社だと、社内ネットワークから外に出る際にプロキシサーバを通さなければならいことがあります。
このプロキシがなかなか厄介で、開発を進める上で必要な npm install
や brew install
といったコマンドもプロキシ経由での通信が求められるため、そのままだと通らないことがあります。
この記事では、そんな社内プロキシ環境下でどうプロキシを越えて通信するかを記述します。
結論から言うと、 Cntlm を使ってプロキシ問題を解決します。
プロキシ環境下での悩み
例えば curl
でいうと一応 HTTP_PROXY
HTTPS_PROXY
などを設定すればプロキシを越えられるものの、以下の悩みがあります。
- 社内へのアクセスと社外へのアクセスで、プロキシの ON/OFF を切り替えるのが面倒臭い
-
npm
など NTLM 認証に対応していないアプリケーションがプロキシを越えられない - 各アプリケーションごとにプロキシの設定をしないといけない
- パスワードが変わったときに上記の設定を全部変えるのがしんどい
などなど・・・
そこで Cntlm の出番です。
Cntlmとは
Cntlmとは、プロキシサーバとの間に挟まるローカルのプロキシサーバです。
何を言っているかわからないと思うので以下にイメージ図を描きます。
自分のPC内の各種アプリケーションが通信する場合に Cntlm が間に挟まりますということです。
これがあると何が嬉しいかというと
-
npm
など NTLM 認証に対応していないアプリケーションのために、NTLM認証を代行してくれる(つまりプロキシを越えられる) - プロキシの設定を1ヶ所に集約できる(つまりパスワードが変わったときに1ヶ所だけ変えればいい)
- プロキシを経由させたくない社内への通信は Cntlm の
NoProxy
に設定しておけば一律で設定可能
です。
NTLM 認証とは
認証プロトコルの一種です。NTLM/NTLMv2 認証のプロキシサーバは、ユーザ名・パスワードを入力して認証する必要があります。Cntlm はクライアントから受け取ったリクエストを NTLM 認証付きで社内プロキシに転送し、その結果をクライアントに返します。これによりクライアント側は NTLM 認証を意識する必要がなくなります。
Cntlmのインストールと設定
Cntlmをインストールして設定する手順を書きます。
Mac を前提に書きますが、Windows でも同じような流れで設定できると思います。
インストール
brew install cntlm
続いて設定ファイルを編集します。設定ファイルは以下のパスにあります。
- Mac:
/opt/homebrew/etc/cntlm.conf
- Windows:
C:¥Program Files (x86)¥Cntlm¥cntlm.ini
以下のように入力します。
Username YOUR USERNAME
Password YOUR PASSWORD
Domain example-company.co.jp
Proxy example-proxy.co.jp:8080
# NoProxy に社内システムを記載する
NoProxy localhost, 127.0.0.*, 10.*, 192.168.*
Listen 3128
# プロキシによって「NTLM」か「NTLMv2」を指定する
Auth NTLM
Domain について
NTLM 認証を行う際のドメイン名を指します。これは、プロキシサーバ自体のドメイン名とは必ずしも一致しません。正確な情報はシステム管理者に聞かないとわからないかもしれません。
Windows だと echo %USERDOMAIN%
と入力すると、ログインしているドメイン名が表示される、という情報はありました。
Cntlmの起動
設定が完了したら、Cntlmを起動します。
brew services start cntlm
もし起動後に設定ファイルを書き換えた場合は再起動が必要です。
brew services restart cntlm
そうすると http://127.0.0.1:3128/
で Cntlm が起動します。
各種アプリケーションのプロキシ設定
Cntlmが起動したら、あとは各アプリケーション、ツールのプロキシ設定をCntlmのアドレスに向けます。
ここでは代表的なものを例として挙げます。
curl, brew 等のコマンド
curl
brew
等のコマンドは HTTP_PROXY
HTTPS_PROXY
環境変数を参照するので、以下のように環境変数をセットしてあげる必要があります。
毎回これをするのは面倒なので .zshrc
などに登録しておくと良いと思います。
export HTTP_PROXY=http://127.0.0.1:3128/ HTTPS_PROXY=http://127.0.0.1:3128/
npm, npx
npm install
や npx install
したいの場合は、以下のコマンドでプロキシを設定します。
npm config set proxy "http://127.0.0.1:3128/"
npm config set https-proxy "http://127.0.0.1:3128/"
# もし SSL エラーが出るようであれば以下を設定
npm config set registry http://registry.npmjs.org/
npm config set strict-ssl false
Git
git
の場合は、以下のコマンドでプロキシを設定します。
git config --global http.proxy http://127.0.0.1:3128/
git config --global https.proxy http://127.0.0.1:3128/
もし特定のプロジェクトのみに設定したい場合は --global
を付けずに実行します。
docker
docker でプロキシ設定する場合は、Settings > Resources > Proxies を開き以下のように設定します。
忘れずに「Apply & restart」しましょう。
その他のデスクトップアプリ
デスクトップアプリでプロキシを越えたい場合は、そのアプリケーションにプロキシ設定があればいいですが、ない場合は少し工夫が必要です。
Mac であれば以下のようにアプリケーションを起動することでプロキシを越えられることがあります。
# 環境変数にセット
export HTTP_PROXY=http://127.0.0.1:3128/ HTTPS_PROXY=http://127.0.0.1:3128/
# 環境変数を引き継いだ状態でコマンドラインからアプリケーションを起動する
open /Applications/Warp.app
これを毎回やるのは面倒なので、Mac であれば「ショートカット」アプリケーションを使ってこのシェルを登録しておくと便利です。
トラブルシューティング
もしCntlm経由での通信がうまくいかない場合は、以下の点を確認してみてください。
-
Cntlmが起動しているか?
- サービスまたはフォアグラウンドでCntlmが正しく起動しているか確認します。
-
cntlm.conf
の設定は正しいか?-
Proxy
のIPアドレスとポート番号が正しいか -
Username
,Domain
が正しいか -
Auth
の設定を変えてみる
-
それでも解決しない場合は、Cntlm を -v
をつけて起動し、ログを確認すると良いです。
# 一旦 Cntlm をストップ
brew services stop cntlm
# フォアグラウンドかつ verbose モードで起動
cntlm -v -f
この状態で実際に Cntlm を使うアクセスをすると、ログが表示されます。