操作系统:Ubuntu 16.04.2 LTS
我的 VPN 配置有指令:
user ovpn
group ovpn
up "/path/to/my/script"
down "/path/to/my/script"
我的 visudo 文件有指令:
%ovpn ALL=(ALL:ALL) NOPASSWD: /sbin/iptables
这允许 openvpn 从root
非特权用户降级ovpn
(出于安全原因),但仍用于iptables
启动和关闭从数据库加载的路由。如果我直接从 shell 调用 openvpn 进程,它就可以工作,即:
$ sudo openvpn /etc/openvpn/vpn0.conf
然后用CTRL-杀死它C。“它有效”是指根据需要添加和删除 iptables 规则而不会出现任何错误。
但是,如果我使用 vanilla Ubuntu systemd openvpn 服务启动和停止 openvpn 进程。IE
$ sudo systemctl start openvpn
$ sudo systemctl stop openvpn
然后“--down”脚本在执行“stop”命令期间失败。当我检查 syslog 时,我看到 --down 脚本在 shell 命令调用时失败sudo /sbin/iptables
,特别是在它试图派生进程的地方。(关于错误消息,我的脚本是一个使用 . 的 python 脚本subprocess.call(['/usr/bin/sudo', '/sbin/iptables', ...])
。错误消息是:
File "/usr/lib/python2.7/subprocess.py", line 523, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1235, in _execute_child
self.pid = os.fork()
OSError: [Errno 11] Resource temporarily unavailable
如果我从 openvpn 配置文件中删除user
andgroup
指令以使进程root
在整个执行过程中保持不变,那么我不会收到错误消息,并且 iptables 调用按预期工作,即使使用 systemd 服务启动和停止也是如此。
所以它闻起来像 systemd 阻止我sudo
在关闭服务时使用升级权限。
关于如何克服这个困难,同时仍然降级为非特权用户的任何想法?
显然,在这种情况下
Resource temporarily unavailable
告诉我这os.fork
是失败的,因为非特权用户已经达到了 openvpn 服务的 systemd 配置允许的最大进程数。为了解决这个问题,我编辑
/lib/systemd/system/[email protected]
并进行了以下更改:随后,即使使用非特权用户并使用 sudo 提升权限,我的
iptables
链式拆除命令也会成功。