🦁
kylemanna/docker-openvpn で、一発でOpenVPNサーバーを立ち上げようとして断念した
結論
インタラクティブな操作が基本になるコンテナで、一発でどうこうとかはやるもんじゃねえ!
(入力待ちが回避できなかった、というかよく考えたら回避しないほうが色々と良いと思った)
成果物
こんな 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
操作
-
docker compose run genconfig
-> 初期configが作られる。(既存は上書き、bak作られるけど) -
docker compose run initpki
-> CAパスフレーズのやりとり -
docker compose up -d ovpn
メインサービス起動 -
CLIENT=takashiaihara docker compose run build-client
-> パスフレーズやりとり -
CLIENT=takashiaihara docker compose run get-client
-> ovpnにovpnファイルが格納される。
クライアントの数だけ4,5を行って、作成された*.ovpnをクライアントPCなりルーターなりに適用する。
ミソ
- アンカーを利用して、出来るだけDRYに。
- 環境変数を使うべきところは出来るだけ使う。
- commandも出来るだけ内包。
注意点
- nopassなのでセキュリティ的に推奨されません。
後記
多分、ovpn_genconfigとかbuild-client-full の中身をしっかり解析したり、パスフレーズをコマンドで渡したりすれば、一発で起動というのも出来るはず。
docに書いてないけど、使えるオプションとかあるみたいだし。
参考
Discussion