따라서 나는 systemd에 대해 약간 불리한 의견에도 불구하고 Ubuntu 16.04에 기회를 주기로 결정했습니다.
업그레이드 후 이전의 지속적인 OpenVPN 연결이 더 이상 작동하지 않습니다. 다행히도 시스템 로그는 근본 원인을 찾아내는 데 매우 도움이 될 수 있습니다.
openvpn-up: + /sbin/iptables -t nat -D POSTROUTING -o tun0 -s 192.168.x.x -j SNAT --to-source 10.x.x.x
openvpn-up: modprobe: ERROR: could not insert 'ip_tables': Operation not permitted
openvpn-up: iptables v1.6.0: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
openvpn-up: Perhaps iptables or your kernel needs to be upgraded.
openvpn-up: + /sbin/iptables -t nat -A POSTROUTING -o tun0 -s 192.168.x.x -j SNAT --to-source 10.x.x.x
openvpn-up: modprobe: ERROR: could not insert 'ip_tables': Operation not permitted
openvpn-up: iptables v1.6.0: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
ovpn-conn[613]: WARNING: Failed running command (--up/--down): external program exited with error status: 3
openvpn-up: Perhaps iptables or your kernel needs to be upgraded.
ovpn-conn[613]: Exiting due to fatal error
참고: 이는 openvpn-up
스크립트의 두 번째 줄 /etc/openvpn/openvpn-up.sh
(줄 읽기: ) 의 주석 처리를 제거하여 생성됩니다 exec &> >(logger -s -t openvpn-up) && set -x
.
어떤 이유로 모듈을 로드할 수 없습니다 ip_tables
. 커널 모듈이 모두 존재하는지 확인한 후 다음을 apt-get install --reinstall linux-image-$(uname -r)
사용해 보았 modprobe ip_tables
더니 이제 로드되었으며 lsmod
시스템 로그에도 표시되었습니다.
kernel: [ 446.293882] ip_tables: (C) 2000-2006 Netfilter Core Team
물론 systemctl restart openvpn
이후에 실행하면 연결이 열리는 것처럼 보이고 iptables-save
출력에서는 적절한 SNAT 규칙이 추가되었음을 증명합니다.
내 거추측하다이제 OpenVPN 장치는 이를 사용할 수 있는 충분한 권한이 없는 일부 사용자 modprobe
의 컨텍스트에서 실행 됩니다.
그러나 나는 이 의혹을 확인할 수 없었다. 사실 그 결과는 systemctl cat openvpn
나를 혼란스럽게 합니다.
# systemctl cat [email protected]
# /lib/systemd/system/[email protected]
[Unit]
Description=OpenVPN connection to %i
PartOf=openvpn.service
ReloadPropagatedFrom=openvpn.service
Before=systemd-user-sessions.service
Documentation=man:openvpn(8)
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO
[Service]
PrivateTmp=true
KillMode=mixed
Type=forking
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/%i.conf --writepid /run/openvpn/%i.pid
PIDFile=/run/openvpn/%i.pid
ExecReload=/bin/kill -HUP $MAINPID
WorkingDirectory=/etc/openvpn
ProtectSystem=yes
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_READ_SEARCH CAP_AUDIT_WRITE
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
[Install]
WantedBy=multi-user.target
당신은 가지고 있습니까?능력insmod
/ 를 성공적으로 호출하려면 스크립트를 활성화해야 합니까 modprobe
? CAP_SYS_ADMIN
다소 조잡해 보이기 때문에 추가하는 것을 피하고 싶습니다 . 아니면 ip_tables
모듈을 로드하는 .conf
유일한 방법 은 /etc/modprobe.d
?
본질적으로 내가 요구하는 것은 Ubuntu 16.04입니다.아니요14.04에서 업그레이드하면 이 작업이 완료되나요? 즉, 표준은 무엇입니까 (그리고사양) 어떻게 해야 하나요? 마지막으로, 특정 장치가 어떤 사용자 컨텍스트에서 실행되고 있는지(또는 더 정확하게는 어떤 기능으로) 확인하려면 어떻게 해야 합니까?
답변1
모든 systemd 지시어에 대한 문서를 찾을 수 있습니다 man system.directives
. 거기 CapabilityBoundingSet=
에서 나는 man systemd.exec
.
man 7 capabilities
이로 인해 다양한 기능을 문서화할 수 있는 곳이 생겼습니다 . 거기에서 "모듈"을 검색하여 다음과 같은 기능을 찾았습니다. 필요한 기능인 것 같습니다.
CAP_SYS_MODULE은 커널 모듈을 로드 및 언로드합니다.
이 기능이 기본적으로 포함되지 않는 이유는 확실하지 않습니다. OpenVPN의 일반적인 사용 사례에는 필요하지 않을 수도 있습니다.
이 기능을 패키지의 시스템 구성에 추가하는 최소한의 방법은 "단위 삽입"을 사용하는 것입니다. 이 파일을 생성합니다:
/etc/systemd/system/[email protected]/add-module-loading.conf
이 내용으로:
[Service]
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_READ_SEARCH CAP_AUDIT_WRITE CAP_SYS_MODULE
이는 기존 기능을 활용하여 서비스를 확장하게 됩니다 CAP_SYS_MODULE
.
망설 systemd
였지만 마음에 드는 것들이 많이 발견됐어요. 이 timer
시스템은 20년 된 크론 시스템에 대한 환영받는 업데이트입니다.