Então eu decidi dar uma chance ao Ubuntu 16.04, apesar de uma visão um pouco desfavorável sobre o systemd.
Após o upgrade, minha conexão OpenVPN anteriormente persistente não funciona mais. Felizmente, o log do sistema é bastante útil para apontar para a causa raiz.
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
Nota: esses openvpn-up
foram produzidos removendo o comentário da segunda linha do script /etc/openvpn/openvpn-up.sh
(linha lê: exec &> >(logger -s -t openvpn-up) && set -x
).
Hmm, então, por algum motivo, o módulo ip_tables
não pôde ser carregado. Depois de certificar-me de ter todos os módulos do kernel com apt-get install --reinstall linux-image-$(uname -r)
, tentei usar modprobe ip_tables
e, com certeza, o vi agora carregado com lsmod
, mas também no log do sistema:
kernel: [ 446.293882] ip_tables: (C) 2000-2006 Netfilter Core Team
E, com certeza, ao executar systemctl restart openvpn
depois desse ponto, pareceu trazer a conexão e iptables-save
output prova que a regra SNAT apropriada foi adicionada.
Meu palpite é agora que a unidade OpenVPN é executada com algum contexto de usuário que não tem privilégios suficientes para usar modprobe
etc.
No entanto, não consegui confirmar essa suspeita. E, de fato, a saída de systemctl cat openvpn
me confunde:
# 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
Existe um recurso que eu preciso para permitir que os scripts sejam bem sucedidos chamando insmod
/ modprobe
? Eu gostaria de evitar a adição de CAP_SYS_ADMIN
, pois isso parece bastante cru. Ou é a única maneira de carregar o módulo ip_tables
, largando um .conf
em /etc/modprobe.d
?
Essencialmente, o que eu estou perguntando é: como um arquivo Ubuntu 16.04 (que não foi atualizado de 14.04) realizou essa tarefa? Ou seja Qual é o modo canônico ( e canônico) de fazê-lo? E por último, mas não menos importante, como posso determinar em qual contexto de usuário uma determinada unidade é executada (ou para ser mais preciso: com quais recursos)?