Podman権限のないコンテナでopenvpnサーバーを実行しようとしています。
OpenVPNはネットワークインターフェイスを管理できる必要があります(たとえば、トンインターフェイスの作成、IPアドレスの割り当て、起動など)。私のシステム(アーチLinux)では、私はこれが代わりにopenvpnを実行する独自のサービスを作成できることをopenvpn-server.service
知っていました。CapabilityBoundingSet
podman run
まず、openvpnコンテナを作成しました。 Dockerfileは次のとおりです(便宜上、私はベースとしてarchlinuxを使用しました)。
FROM archlinux
RUN pacman -Sy --noconfirm openvpn
my_unprivileged_user
次に、このコンテナをビルドします(次にログインします)。
podman build \
--force-rm \
--no-cache \
--rm \
--device=/dev/net/tun \
-t openvpn .
その後、次のようにしましたmy_custom_openvpn.service
。
Description=OpenVPN in Podman container
After=syslog.target network-online.target
Wants=network-online.target
[Service]
User=my_unprivileged_user
Group=my_unprivileged_group
WorkingDirectory=/etc/openvpn
ExecStart=/usr/bin/podman run --rm --name openvpn -v ./server:/server --device /dev/net/tun --network "host" --cap-add CAP_IPC_LOCK,CAP_NET_ADMIN,CAP_NET_BIND_SERVICE,CAP_NET_RAW,CAP_SETGID,CAP_SETUID,CAP_SYS_CHROOT,CAP_DAC_OVERRIDE,CAP_AUDIT_WRITE localhost/openvpn:latest /usr/bin/openvpn --config /server/my_config.conf
ExecStop=/usr/bin/podman stop -t 0 openvpn
Capabilities=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE CAP_AUDIT_WRITE
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
#ProtectSystem=true
#ProtectHome=true
RestartSec=5s
Restart=on-failure
TimeoutSec=5s
[Install]
WantedBy=multi-user.target
だから私はsystemdがpodmanに機能を渡し、再びopenvpnに機能を渡すと思います。
ただし、openvpnはtun0インターフェイスを作成できないと文句を言うことはできません。このようにtun0を直接作成しても、openvpn --mktun --dev tun0
openvpnがこのtun0インターフェイスを設定できないという別のエラーが発生します。
setcap
コンテナ内で行う必要があるかもしれないと考えて、podman exec
コンテナに入り、以下で実行しました。
setcap CAP_IPC_LOCK,CAP_NET_ADMIN,CAP_NET_BIND_SERVICE,CAP_NET_RAW,CAP_SETGID,CAP_SETUID,CAP_SYS_CHROOT,CAP_DAC_OVERRIDE,CAP_AUDIT_WRITE=+ep /usr/bin/openvpn
しかし、それは役に立ちませんでした。このエラーは引き続き発生します。
Tue Jan 28 13:34:31 2020 /usr/bin/ip link set dev tun0 up mtu 1500
RTNETLINK answers: Operation not permitted
このような機能を使ってみると役に立たないかもしれません。
答え1
ip
コンテナ内で常に0を返すbashスクリプトに置き換えて、openvpnを機能させました。私の考えでは、openvpnがしようとしている唯一のことは、tun0
IPアドレスを設定、割り当て、実行することです。私はコンテナの外で(ルートとして)これを手動で実行することにしたので、openvpnはこれを行う必要はありません。 openvpn Wikiのプロセスを説明します。ここ