複数のVPN接続を行なうためのDockerコンテナ
- Dockerコンテナ内でVPN接続
- OpenVPN を使用
- Dockerコンテナ内で起動しているHTTPプロキシ経由でアクセス
- ※ プロキシサーバーは
docker-compose up
で自動起動 - コンテナ内で動作するプロキシのため、VPNへのアクセスが可能
- (オプション)メール(POP3,SMTP)プロキシサーバー経由でメール送受信も可能
- ※ プロキシサーバーは
- 1コンテナ 1VPN 1proxyのため、接続するVPNごとに実行
- docker, docker-compose をインストール
- 接続したいVPNの数だけ以下を繰り返す
- このフォルダを複製(
git clone
,cp
, etc) - 環境変数設定
cp .env.example .env
.env
ファイルを編集(詳細は後述)
vpn-config
フォルダに.ovpn
拡張子のOpenVPN用設定ファイルを配置- ファイル名は自由(
.ovpn
拡張子で検索する) - フォルダ内に1つの
.ovpn
拡張子のみ可
- ファイル名は自由(
docker-compose up -d
- ※ 更新時は再ビルドが必要
docker-compose up -d --build
- ※ 更新時は再ビルドが必要
.env
で設定したプロキシPROXY_BIND_IP_PORT
の<IP>:<PORT>
をブラウザやOSのプロキシ設定に登録- おすすめ:
proxy.pac
を使用- 複数VPNを同時利用する場合は必須
- 例: doc/example.proxy.pac
- メール(POP3,SMTP)プロキシを使う場合はメーラーの設定を変更(
設定値
参照)
- おすすめ:
- VPN接続用scriptを実行
connect-vpn-windows.bat
- Windows用
connect-vpn-windows.bash
- Windows用(キーボードショートカットでクリップボードを貼り付けたい場合)
- Git Bash(MinTTY) などに関連付けして使う
connect-vpn-linux.sh
- Linux用
- このフォルダを複製(
key=value
形式- ※
=
前後には空白無し
- ※
#
始まりはコメント行- 同名の環境変数が定義されていると、
.env
での定義より環境変数が優先される
インターネットアクセスにプロキシの設定が必要ならコメントアウトを外してアドレス:PORTを編集
# http_proxy=http://proxy.example.com:8080
# https_proxy=http://proxy.example.com:8080
Docker image build 時の openvpn
& squid
& tzdata
& tini
インストールに使用
※ すでに環境変数にセットされているならこのファイルでのセットは不要
コンテナ内のproxyのbindをhost側につなげる際のhost側の待ち受けIP:PORT
PROXY_BIND_IP_PORT=127.0.0.1:18080
※ Docker Toolbox (VirtualBox) を使っている場合は、コンテナの待ち受けIPを 0.0.0.0
として、ブラウザに設定するプロキシは、VMのIPにする必要がある(VMのIPは以下のコマンド確認可能)。
docker-machine ip
メール(POP3,SMTP)プロキシサーバーも起動するかの切り替えに使用
- メール(POP3,SMTP)プロキシサーバー無し
# COMPOSE_PROFILES=mail
- メール(POP3,SMTP)プロキシサーバー有り
COMPOSE_PROFILES=mail
コンテナ内のPOP3プロキシサーバーのbindをhost側につなげる際のhost側の待ち受けIP:PORT
POP3_BIND_IP_PORT=127.0.0.1:10110
メーラーの設定を上記 POP3_BIND_IP_PORT
の IP:PORT
に変更する
POP3(TCP)パケットを転送する先のIP(host):PORT
POP3_PROXY_TARGET=example.com:110
メーラーにもともと設定してあったIP(host):PORT
コンテナ内のSMTPプロキシサーバーのbindをhost側につなげる際のhost側の待ち受けIP:PORT
SMTP_BIND_IP_PORT=127.0.0.1:10025
メーラーの設定を上記 SMTP_BIND_IP_PORT
の IP:PORT
に変更する
SMTP(TCP)パケットを転送する先のIP(host):PORT
SMTP_PROXY_TARGET=example.com:25
メーラーにもともと設定してあったIP(host):PORT
タイムゾーン設定
TZ=Asia/Tokyo
ログの時刻をUTCから変更して理解しやすくしたいとき用
vpn-config
フォルダに配置した設定ファイル(.ovpn
拡張子)に以下のプロキシ設定を追加
http-proxy <proxy_fqdn> <proxy_port>
例
http-proxy proxy.example.com 8080
vpn-config
フォルダにuser.txt
ファイルを作成user.txt
ファイルの1行目にUser IDを記述vpn-config
フォルダに配置した設定ファイル(.ovpn
拡張子)に以下の認証設定を追加auth-user-pass /etc/vpn-config/user.txt
- ※ すでに、
auth-user-pass
行が存在する場合は置き換え
- ※ すでに、
SSH config ( ~/.ssh/config
) に ProxyCommand
を追加
Host server1
HostName 10.12.34.56
IdentityFile ~/.ssh/keys/server1
ProxyCommand connect.exe -H 127.0.0.1:18080 %h %p
connect.exe
は -H
オプションでプロキシサーバーを指定する
ProxyCommand connect.exe -H <proxy-server-ip>:<proxy-server-port> %h %p
参照: .env
の PROXY_BIND_IP_PORT
設定
※ Gitもsshで接続している場合は同じ方法で可能
- PC再起動後
restart: always
にしてあり自動起動するが、正常起動しない場合あり
- Docker更新後
- ボリューム共有がリセットされてOpenVPN用設定ファイル(
vpn-config
フォルダの.ovpn
)が共有されていない場合あり
- ボリューム共有がリセットされてOpenVPN用設定ファイル(
dockerコンテナの再起動
docker-compose restart
上記対応で解決されない場合は、コンテナの再作成
docker-compose up -d --force-recreate
- ログイン時
- User ID & Password が間違っている
- ログイン成功後
- VPN接続の切断(ネットワークやサーバー側の問題など)
再ログイン
確認コマンド
docker-compose exec -T vpn sh -c 'ip -f inet addr'
出力(例)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
46: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link-netnsid 0
inet 172.18.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
この場合、 172.18.0.2/16
にVPN側のIPが含まれていると通信できない