Ubuntu 14.04를 16.04로 업그레이드한 후 iptables 모듈이 로드되지 않음

Ubuntu 14.04를 16.04로 업그레이드한 후 iptables 모듈이 로드되지 않음

그래서 저는 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에서 업그레이드되었습니다) 이 작업을 수행하시겠습니까? 즉, 정식은 무엇입니까(그리고Canonical) 방법은 무엇입니까? 마지막으로 특정 유닛이 어떤 사용자 컨텍스트에서 실행되는지(또는 더 정확하게 말하면 어떤 기능으로) 어떻게 확인할 수 있습니까?

답변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년 된 크론 시스템에 대한 환영받는 업데이트입니다.

관련 정보