루트가 아닌 사용자로 openvpn 실행

루트가 아닌 사용자로 openvpn 실행

Podman 권한이 없는 컨테이너에서 openvpn 서버를 실행하려고 합니다.

OpenVPN은 네트워크 인터페이스를 관리할 수 있어야 합니다(예: tun 인터페이스 생성, IP 주소 할당, 시작). 내 시스템(아치 리눅스)에서 나는 이것이 대신 openvpn을 실행하는 내 자신의 서비스를 만들 수 있다는 것을 openvpn-server.service알았습니다 .CapabilityBoundingSetpodman 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 tun0openvpn이 이 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이 시도하는 유일한 일은 tun0IP 주소를 설정하고 할당하고 실행하는 것입니다. 나는 컨테이너 외부에서(루트로서) 이 작업을 수동으로 수행하기로 결정했기 때문에 openvpn은 이 작업을 수행할 필요가 없습니다. openvpn 위키에서 프로세스를 설명합니다.여기

관련 정보