概要


前提


OpenVPNとは

物理ネットワーク: 拠点A --- インターネット --- 拠点B

を、

論理: 仮想プライベートネットワーク(AとB) --- インターネット

にする。ここでは特に、

論理: OpenVPNクライアント --- OpenVPNサーバ --- インターネット

同じプライベートネットワークに属する(ように見える)

プロキシ


OpenVPNクライアント: VPN Gateのサーバに接続する例

VPN Gate

VPNサーバを信用できなくても

クライアントからの接続手順

  1. OpenVPN設定ファイルのダウンロード
    • 公式サイトのサーバリスト表から1つ選ぶ
  2. Dockerイメージの作成
    • alpineopenvpnをインストール
  3. Dockerコンテナ起動
    • 1のファイルをマウント、読み込み

OpenVPN設定ファイルのダウンロード

OpenVPN設定ファイル

設定ファイルの内容

# 主な項目例
# クライアントとしてVPN Gateのサーバに接続する場合
dev tun

# プロトコル
proto udp

# サーバの場所
remote ホスト名かIPアドレス ポート番号

# 暗号のアルゴリズム
cipher AES-128-CBC
auth SHA1

Dockerイメージの作成: クライアントもサーバも対応

alpine:3.12イメージからビルド

FROM alpine:3.12

# 情報更新
RUN apk update
# インストール
RUN apk add man man-pages openvpn openvpn-doc easy-rsa

# ページャ、英語
ENV PAGER=less LANG=C

WORKDIR /etc/openvpn
# サンプルファイルへのリンク
RUN ln -s /usr/share/doc/openvpn/samples/sample-config-files/

CMD ["/bin/sh"]
# ビルド
image=my-openvpn
docker build --tag $image .

設定ファイル、コマンドオプション

設定ファイルのとき

サンプルの設定ファイル


Dockerコンテナ起動: OpenVPNクライアント

dockerコマンドの調整

image=my-openvpn
container=openvpn-client

docker run --rm -it --name $container \
  --network host \
  --cap-add=NET_ADMIN --device=/dev/net/tun \
  --volume "$PWD/conf":/etc/openvpn/conf:z \
  $image \
  openvpn --cd /etc/openvpn/conf --config client.conf
(中略)
TUN/TAP device tun0 opened
TUN/TAP TX queue length set to 100
/sbin/ip link set dev tun0 up mtu 1500
/sbin/ip addr add dev tun0 local 10.211.1.81 peer 10.211.1.82
/sbin/ip route add サーバネットワーク via ローカル物理ルータ
/sbin/ip route add 0.0.0.0/1 via 10.211.1.82
/sbin/ip route add 128.0.0.0/1 via 10.211.1.82
WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Initialization Sequence Completed

これで、VPN Gateのサイトなどにアクセスすると、グローバルIPアドレスがサーバのものになっていることを確認できる。


ネットワーク確認

TUNデバイスができている

ip address show type tun
# 例
9: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none
    inet 10.211.1.81 peer 10.211.1.82/32 scope global tun0

ルーティングテーブルにTUNデバイス

ip route show
0.0.0.0/1 via 10.211.1.82 dev tun0
default via 物理ルータIP dev eno1 proto static metric 100
10.211.1.82 dev tun0 proto kernel scope link src 10.211.1.81
128.0.0.0/1 via 10.211.1.82 dev tun0
サーバグローバルIP via 物理ルータIP dev 物理デバイス
(中略)

コンテナ停止で元に戻る