🦁

kylemanna/docker-openvpn で、一発でOpenVPNサーバーを立ち上げようとして断念した

2023/05/26に公開

結論

インタラクティブな操作が基本になるコンテナで、一発でどうこうとかはやるもんじゃねえ!
(入力待ちが回避できなかった、というかよく考えたら回避しないほうが色々と良いと思った)

成果物

こんな docker-compose.yml

▼ docker-compose.yml

version: '3'

x-base: &base
  cap_add:
   - NET_ADMIN
  image: kylemanna/openvpn
  volumes:
   - ./config:/etc/openvpn
  restart: "no"

services:
  ovpn:
    <<: *base
    ports:
     - "1194:1194/udp"
    restart: always

  genconfig:
    <<: *base
    command: ovpn_genconfig -u udp://${SUBDOMAIN}.${DOMAIN}

  initpki:
    <<: *base
    command: ovpn_initpki

  build-client:
    <<: *base
    command: easyrsa build-client-full ${CLIENT} nopass

  get-client:
    <<: *base
    command: /bin/sh -c 'ovpn_getclient ${CLIENT} | tee /ovpn/${CLIENT}.ovpn'
    volumes:
     - ./config:/etc/openvpn
     - ./ovpn:/ovpn

大したことしてない(できてない)
docに書いてあるコマンドをcomposeに直しただけ。

説明

  • ovpn というサービスがメイン。常時稼働。
  • .env や 環境変数定義で下記を渡す必要あり。DOMAIN/SUBDOMAINは.env化を推奨。
    • CLIENT
    • DOMAIN
    • SUBDOMAIN

操作

  1. docker compose run genconfig -> 初期configが作られる。(既存は上書き、bak作られるけど)
  2. docker compose run initpki -> CAパスフレーズのやりとり
  3. docker compose up -d ovpn メインサービス起動
  4. CLIENT=takashiaihara docker compose run build-client -> パスフレーズやりとり
  5. CLIENT=takashiaihara docker compose run get-client -> ovpnにovpnファイルが格納される。

クライアントの数だけ4,5を行って、作成された*.ovpnをクライアントPCなりルーターなりに適用する。

ミソ

  • アンカーを利用して、出来るだけDRYに。
  • 環境変数を使うべきところは出来るだけ使う。
  • commandも出来るだけ内包。

注意点

  • nopassなのでセキュリティ的に推奨されません。

後記

多分、ovpn_genconfigとかbuild-client-full の中身をしっかり解析したり、パスフレーズをコマンドで渡したりすれば、一発で起動というのも出来るはず。
docに書いてないけど、使えるオプションとかあるみたいだし。

参考

https://github.com/kylemanna/docker-openvpn

Discussion