DNSCrypt-proxy 使用包管理器安装完成之后无法启动,提示Permission denied

根据官方wiki的步骤:https://github.com/DNSCrypt/dnscrypt-proxy/wiki/Installation-on-Debian-and-Ubuntu

安装完成之后,修改dnscrypt-proxy.toml配置文件的listen_addresses部分

默认为: listen_addresses = []

可以修改成自己想要listen的地址(注意加端口号)

但是修改之后,systemctl restart dnscrypt-proxy.service 会提示如图的错误

Dec 04 05:37:27 Tokyo dnscrypt-proxy[1857]: [2019-12-04 05:37:27] [FATAL] listen udp 127.0.0.1:53: bind: permission denied

一开始我考虑是不是因为使用了user_name = 'nobody' 这个选项导致权限不足(实际上一开始是root身份执行,初始化完成之后downgrade privilege,类似openvpn)

并不是,然后考虑是不是ubuntu/debian自带的AppArmor搞的鬼,结果没有警告,停止掉AppArmor也没有任何变化。

事情从这里就开始变得诡异了((

 

后来找了一圈,在这里

https://github.com/DNSCrypt/dnscrypt-proxy/issues/1066#issuecomment-557873668

我是不知道dnscrypt官方人怎么想的,有关于Permission denied问题的issue全部被Close,然后实际上什么问题都没有解决

用包管理器本来为了方便,省去一些破事,结果变得更加麻烦了

 

*用此方法后可能导致apt无法删除dnscrypt-proxy

Github上的命令如下

#停掉+禁用dnscrypt-proxy的service和socket
systemctl stop dnscrypt-proxy.service
systemctl stop dnscrypt-proxy.socket
systemctl disable dnscrypt-proxy.socket
systemctl disable dnscrypt-proxy.service

#删除dnscrypt-proxy的service和socket文件
rm /lib/systemd/system/dnscrypt-proxy.service /lib/systemd/system/dnscrypt-proxy.socket
rm /var/lib/systemd/deb-systemd-helper-enabled/dnscrypt-proxy.service.dsh-also /var/lib/systemd/deb-systemd-helper-enabled/dnscrypt-proxy.socket.dsh-also /var/lib/systemd/deb-systemd-helper-enabled/multi-user.target.wants/dnscrypt-proxy.service /var/lib/systemd/deb-systemd-helper-enabled/sockets.target.wants/dnscrypt-proxy.socket

#Reload daemon
systemctl daemon-reload
systemctl reset-failed

#使用dnscrypt-proxy程序来安装服务(?????????????????)
dnscrypt-proxy -config /etc/dnscrypt-proxy/dnscrypt-proxy.toml -service install

#最后手动开一下dnscrypt-proxy服务
systemctl start dnscrypt-proxy.service && systemctl enable dnscrypt-proxy.service

 

感觉。。。。这只是包管理器装的服务文件不对

比较一下。。。

(Debian 10 buster, ubuntu是使用PPA安装的,所以服务文件有些不同)

这是apt包管理器安装的服务文件,在/lib/systemd/system/dnscrypt-proxy.service

[Unit]
Description=DNSCrypt client proxy
Documentation=https://github.com/jedisct1/dnscrypt-proxy/wiki
Requires=dnscrypt-proxy.socket
After=network.target
Before=nss-lookup.target
Wants=nss-lookup.target

[Install]
Also=dnscrypt-proxy.socket
WantedBy=multi-user.target

[Service]
NonBlocking=true
ExecStart=/usr/sbin/dnscrypt-proxy -config /etc/dnscrypt-proxy/dnscrypt-proxy.toml
ProtectHome=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
MemoryDenyWriteExecute=true

User=_dnscrypt-proxy
CacheDirectory=dnscrypt-proxy
LogsDirectory=dnscrypt-proxy
RuntimeDirectory=dnscrypt-proxy

 

这是使用dnscrypt-proxy命令安装的

[Unit]
Description=Encrypted/authenticated DNS proxy
ConditionFileIsExecutable=/usr/sbin/dnscrypt-proxy

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/sbin/dnscrypt-proxy

WorkingDirectory=/etc/dnscrypt-proxy

Restart=always
RestartSec=120
EnvironmentFile=-/etc/sysconfig/dnscrypt-proxy

[Install]
WantedBy=multi-user.target

 

(我是没话说了)