操作系统:Debian 11
软件包:OpenVPN 2.5.1
背景:
更新后,Openvpn-2.5客户端无法再使用ip路由删除 root 权限并且系统单元以非特权用户身份运行后,修改接口并配置 OpenVPN 服务器推送的路由。基于这两个线程中关于 iproute 问题的讨论:
https://bugs.archlinux.org/task/68480
https://phabricator.vyos.net/T3805建议采取一种解决方法,从单独的 .service 文件中删除用户和组指令 ,
/etc/openvpn/openvpn.conf
并将环境功能添加 到单独的 .service 文件中。User=tunnel
Group=tunnel
已经有一个现有的 Openvpn 服务文件([电子邮件受保护])/lib/systemd/system
因此我们创建了一个新目录并在其中包含一个 .service 文件 -/lib/systemd/system/[email protected]/override.conf
# separate service file containing User and group directives along with Ambient capabilities
[Service]
User=tunnel
Group=tunnel
SecureBits=keep-caps
ExecStartPre=/usr/bin/sudo --non-interactive /usr/sbin/openvpn --rmtun --dev tun0
ExecStartPre=/usr/bin/sudo --non-interactive /usr/sbin/openvpn --mktun --dev tun0 --dev-type tun --user tunnel --group tunnel
ExecStopPost=/usr/bin/sudo --non-interactive /usr/sbin/openvpn --rmtun --dev tun0
AmbientCapabilities=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
运行以下命令:
sudo systemctl daemon-reload
sudo chown -R tunnel:tunnel /etc/openvpn /run/openvpn
sudo /usr/sbin/openvpn --rmtun --dev tun0
sudo /usr/sbin/openvpn --mktun --dev tun0 --dev-type tun --user tunnel --group tunnel
cd /etc/openvpn/
sudo -u tunnel openvpn /etc/openvpn/openvpn.conf
错误
预期非特权者User=tunnel
将具有打开 tun0 并修改接口以完成 openvpn 连接的环境能力。然而,它遇到了错误。
#Error after running sudo -u tunnel openvpn /etc/openvpn/openvpn.conf
2022-06-24 17:32:08 us=174691 TUN/TAP device tun0 opened
2022-06-24 17:32:08 us=174755 do_ifconfig, ipv4=1, ipv6=0
2022-06-24 17:32:08 us=174844 net_iface_mtu_set: mtu 1500 for tun0
2022-06-24 17:32:08 us=175005 sitnl_send: rtnl: generic error (-1): Operation not permitted
2022-06-24 17:32:08 us=175084 Linux can't set mtu (1500) on tun0
2022-06-24 17:32:08 us=175142 Exiting due to fatal error
有效的解决方案
然而,使用 capsh,我直接将 Ambient Capability 赋予了具有特权的 Openvpn 可执行文件user=tunnel
,而 systemd 服务中没有任何内容:
sudo /sbin/capsh --keep=1 --user='tunnel' --inh='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' --addamb='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' -- -c 'openvpn /etc/openvpn/openvpn.conf'
问题:
为什么 systemd 无法为 user=tunnel 设置环境功能,而 capsh 却可以?如何使其与 systemd 一起工作?
答案1
我怀疑sudo -u tunnel
清除了环境能力。要确认这一点,您可以尝试在最后一行之前插入这些行:
/sbin/capsh --print
sudo -u tunnel /sbin/capsh --print
sudo -u tunnel openvpn /etc/openvpn/openvpn.conf