イントラネットと出張/在宅とで設定変更が面倒なのでローカルにApache2でフォワードプロキシを立ててみたらちょっと幸せになった

会社のファイヤーウォール内と出張や在宅時のインターネットへの直接接続とでプロキシ設定が異なるので、Apache2でフォワードプロキシをローカルに立てて、フォワードプロキシの設定で一発変更する。
各プログラムのプロキシ設定は、全てローカルのプロキシを設定する。
使用している環境はUbuntu 20.10。

## Apache2の設定

Apache2はインストール・稼働できているものとする。

### モジュールを有効化

プロキシ用のモジュールを有効にする。

```shell-session
sudo a2enmod proxy proxy_http proxy_ftp proxy_ssl proxy_connect
```

### 自前のコンフィグを用意

`/etc/apache2/mods-available/proxy.conf`をベースに、`/etc/apache2/sites-available/`に用意した。

ポート番号、イントラネットのプロキシのアドレス (ProxyRemoteの設定)、ダイレクトにアクセスするアドレス (NoProxyの設定) はそれぞれの環境に合わせてカスタマイズする。
今回はポート番号を8888としてみた。

```config:/etc/apache2/sites-available/proxy.conf
<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に設定する。

```config:/etc/apache2/sites-available/intranet.conf
<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の再起動

```shell-session
sudo a2ensite proxy intranet
sudo systemctrl restart apache2
```

## 各設定の見直し

### ブラウザ

GNOMEの「設定」→「ネットワーク」→「ネットワークプロキシ」からプロキシを「手動」にしてHTTP/HTTPS/FTPそれぞれに`localhost`と`8888`を指定する。

### 環境変数

システムワイドの環境変数の設定。

```bash:/etc/profile.d/proxy.sh 
#!/bin/bash

export HTTP_PROXY="http://localhost:8888"
export HTTPS_PROXY="http://localhost:8888"
export FTP_PROXY="http://localhost:8888"
```

### apt

aptの設定。90は適当に決めた。

```config:/etc/apt/apt.conf.d/90proxy 
// Configuration for Proxy
Acquire {
    ftp::proxy "http://localhost:8888/";
    http::proxy "http://localhost:8888/";
    https::proxy "http://localhost:8888/";
}
```

### snapd

snapdの設定。

```shell-session
sudo systemctl edit snapd
```

エディタが開くので以下の内容で保存する。

```conf
[Service]
Environment=http_proxy=http://localhost:8888
Environment=https_proxy=http://localhost:8888
```

snapdデーモンの再起動。

```shell-session
sudo systemctl restart snapd
```

### SSH (GitHub) の設定

*MyUserName*は適切に設定する。

```config:~/.ssh/config
#
# 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個叩くことにした。

### イントラネットで使用

```shell-session
sudo a2ensite intranet
sudo systemctl reload apache2
```

### ダイレクト接続で使用

```shell-session
sudo a2dissite intranet
sudo systemctrl reload apache2
```

## 2020年11月10日追記

簡単なスクリプトを作ってみた。

```bash:~/bin/proxy.sh
#!/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有効

```shell-session
sudo ~/bin/proxy.sh on
```

Proxy無効

```shell-session
sudo ~/bin/proxy.sh off
```

確認 (確認だけなら`sudo`は不要)

```shell-session
~/bin/proxy.sh
```

## 2020年12月1日追記

Node.js (npm) の設定。
HTTPSではなくHTTPを使うのがミソらしい。

```shell-session
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/
```