systemd-resolved、resolvconf.service、resolvconf 和 openresolv。为什么、选择哪个以及如何选择?

systemd-resolved、resolvconf.service、resolvconf 和 openresolv。为什么、选择哪个以及如何选择?

我正在使用一个 VPN 客户端,它向 添加了两个名称服务器/etc/resolv.conf。我的所有连接都由 Network-Manager 管理。

我必须将此 VPN 客户端用于我的工作 VPN,但在 Ubuntu systemd-resolved16.10 升级到 后,我的连接和 DNS 出现了问题。由于某种原因,似乎systemd-resolved改回/etc/resolv.conf了默认名称服务器,导致内部页面无法解析。我对此进行了进一步研究,最终将其替换resolvconfopenresolv。这很有帮助,但在 VPN 启动一段时间后仍然systemd-resolved会重置。/etc/resolv.conf

可能是刚连接上,或者几分钟后,或者有时根本没有。然后我禁用了systemd-resolvedsystemd resolvconf.service只运行了openresolv。一切似乎都运行良好。

但是,这一切都非常令人困惑。是否有理由systemd-resolved与其他版本一起使用?它在 Ubuntu 16.10 中已启用,所以我认为肯定有原因,但它似乎引起了争执/etc/resolv.conf

如果我能跑去解释一下就好了operesolv。我已经阅读了不少相关内容,但我仍然不明白为什么/etc/resolv.conf会这样管理,只是当我使用systemd它时,我无法使用我的 VPN 客户端。

答案1

我设法更改了 Ubuntu 中 OpenVPN 中处理这些配置项的脚本(在 18.04 上测试)。这里有一个补丁:

--- /etc/openvpn/update-resolv-conf.orig    2019-03-13 19:14:16.163914424 +0400
+++ /etc/openvpn/update-resolv-conf 2019-03-13 19:29:30.380420708 +0400
@@ -15,7 +15,7 @@
 #     foreign_option_3='dhcp-option DOMAIN be.bnc.ch'
 #

-[ -x /sbin/resolvconf ] || exit 0
+[ -x /usr/bin/systemd-resolve ] || exit 0
 [ "$script_type" ] || exit 0
 [ "$dev" ] || exit 0

@@ -43,16 +43,16 @@
        fi
    done
    R=""
-   [ "$SRCHS" ] && R="search $SRCHS
-"
+   for SRCH in $SRCHS ; do
+       R="${R}--set-domain=$SRCH "
+   done
    for NS in $NMSRVRS ; do
-           R="${R}nameserver $NS
-"
+       R="${R}--set-dns=$NS "
    done
-   echo -n "$R" | /sbin/resolvconf -a "${dev}.openvpn"
+   /usr/bin/systemd-resolve -i ${dev} ${R}
    ;;
   down)
-   /sbin/resolvconf -d "${dev}.openvpn"
+   echo "Doing nothing, interface disappears."
    ;;
 esac

您需要将以下项目添加到 OpenVPN 配置文件中:

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

答案2

您使用的是哪个 VPN 客户端?我使用直接 OpenVPN 时遇到了问题,但安装 NM 版本的客户端后问题就解决了。好吧,大多数情况下,我无法阻止路由被推送,但这是一个完全不同的问题。

重点是:你的 VPN 客户端了解如何与 systemd 管理 DNS 服务的想法进行交互。我不推荐这样做,但您可以尝试禁用 resolvd 服务 ( systemctl disable systemd-resolved.service) 以查看它是否会改善情况,但最终您必须获得一个了解如何服从 systemd 的反复无常的客户端 :)

(systemd 这艘船早已起航,我们不要再讨论为什么要做某些事情了。)

答案3

我使用的 VPN 客户端更新解决了这个问题(双关语)。它是 Fortinet VPN 的 OpenFortiGui 客户端。

相关内容