会社のファイヤーウォール内と出張や在宅時のインターネットへの直接接続とでプロキシ設定が異なるので、Apache2でフォワードプロキシをローカルに立てて、フォワードプロキシの設定で一発変更する。
各プログラムのプロキシ設定は、全てローカルのプロキシを設定する。
使用している環境はUbuntu 20.10。
Apache2の設定
Apache2はインストール・稼働できているものとする。
モジュールを有効化
プロキシ用のモジュールを有効にする。
sudo a2enmod proxy proxy_http proxy_ftp proxy_ssl proxy_connect
自前のコンフィグを用意
/etc/apache2/mods-available/proxy.conf
をベースに、/etc/apache2/sites-available/
に用意した。
ポート番号、イントラネットのプロキシのアドレス (ProxyRemoteの設定)、ダイレクトにアクセスするアドレス (NoProxyの設定) はそれぞれの環境に合わせてカスタマイズする。
今回はポート番号を8888としてみた。
<IfModule mod_proxy.c>
# 適当な空いているポート番号
Listen 8888
# Listenの設定とポート番号を合わせる
<VirtualHost *:8888>
# If you want to use apache2 as a forward proxy, uncomment the
# 'ProxyRequests On' line and the <Proxy *> block below.
# WARNING: Be careful to restrict access inside the <Proxy *> block.
# Open proxy servers are dangerous both to your network and to the
# Internet at large.
#
# If you only want to use apache2 as a reverse proxy/gateway in
# front of some web application server, you DON'T need
# 'ProxyRequests On'.
ProxyRequests On
SSLProxyEngine On
#AllowCONNECT 443
#CustomLog ${APACHE_LOG_DIR}/proxy.log combined
<Proxy *>
AddDefaultCharset off
Require all denied
Require local
</Proxy>
# Enable/disable the handling of HTTP/1.1 "Via:" headers.
# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
# Set to one of: Off | On | Full | Block
#ProxyVia Off
# Comment out ProxyRemote if conecting to the Internet directly.
#ProxyRemote * http://proxy.mycompany.com:8888
#NoProxy 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 .mygroup.mycompany.com
</VirtualHost>
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
簡単に切り替えられるようにProxyRemote設定だけintranet.conf
として独立。
リクエストを丸投げする社内からのプロキシをProxyRemoteに設定する。
<IfModule mod_proxy.c>
# Comment out ProxyRemote if conecting to the Internet directly.
ProxyRemote * http://proxy.mycompany.com:8888
NoProxy 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 .mygroup.mycompany.com
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Apacheの再起動
sudo a2ensite proxy intranet
sudo systemctrl restart apache2
各設定の見直し
ブラウザ
GNOMEの「設定」→「ネットワーク」→「ネットワークプロキシ」からプロキシを「手動」にしてHTTP/HTTPS/FTPそれぞれにlocalhost
と8888
を指定する。
環境変数
システムワイドの環境変数の設定。
#!/bin/bash
export HTTP_PROXY="http://localhost:8888"
export HTTPS_PROXY="http://localhost:8888"
export FTP_PROXY="http://localhost:8888"
apt
aptの設定。90は適当に決めた。
// Configuration for Proxy
Acquire {
ftp::proxy "http://localhost:8888/";
http::proxy "http://localhost:8888/";
https::proxy "http://localhost:8888/";
}
snapd
snapdの設定。
sudo systemctl edit snapd
エディタが開くので以下の内容で保存する。
[Service]
Environment=http_proxy=http://localhost:8888
Environment=https_proxy=http://localhost:8888
snapdデーモンの再起動。
sudo systemctl restart snapd
SSH (GitHub) の設定
MyUserNameは適切に設定する。
#
# Configuration for SSH
# ~/.ssh/config
#
Host github.com
User MyUserName
HostName ssh.github.com
Port 443
ProxyCommand nc -X connect -x localhost:8888 %h %p
その他
設定の必要があればどれもこれもhttp://localhost:8888とする。
伝統 (Legacy) なのだろうが、プログラム毎にプロキシの設定があるのは面倒くさい。
イントラネットとダイレクトのプロキシ切り替え
簡単なスクリプトを組んでも良いのだろうけど、それほど頻繁には切り替えないし、たいした労力でないのでコマンドを2個叩くことにした。
イントラネットで使用
sudo a2ensite intranet
sudo systemctl reload apache2
ダイレクト接続で使用
sudo a2dissite intranet
sudo systemctrl reload apache2
2020年11月10日追記
簡単なスクリプトを作ってみた。
#!/bin/bash
# Enable/Disable ProxyPass
if [ $# -eq 0 ]; then
a2query -s intranet
exit
fi
case "${1}" in
on)
echo "intranet"
a2ensite intranet > /dev/null
;;
off)
echo "the Internet"
a2dissite intranet > /dev/null
;;
*)
echo "$0 [on|off]"
exit
esac
systemctl reload apache2
使い方
Proxy有効
sudo ~/bin/proxy.sh on
Proxy無効
sudo ~/bin/proxy.sh off
確認 (確認だけならsudo
は不要)
~/bin/proxy.sh
2020年12月1日追記
Node.js (npm) の設定。
HTTPSではなくHTTPを使うのがミソらしい。
sudo npm -g config set proxy http://localhost:8888
sudo npm -g config set https-proxy http://localhost:8888
sudo npm -g config set registry http://registry.npmjs.org/