NetworkManager может либо:
обновлять resolv.conf
самостоятельно;
делегировать resolvconf
(для интерфейса NetworkManager
);
либо использовать netconfig
.
Различные конфигурации, поступающие от каждого интерфейса, просто объединяются (см. update_dns()
).
Если вы не используете NetworkManager для VPN, вы можете использовать openresolv
в эксклюзивном режиме (-x
), чтобы заменить серверы имен из NetworkManager
на серверы из VPN вместо их добавления. Это можно сделать с помощью этого (уродливого) скрипта (OpenVPN hook):
#!/bin/sh
# Dump all foreign options (coming from environment variables foreign_option_N) to stdout
foreign_options() {
local i
i=1
while true; do
local varname=foreign_option_$i
local value="$(eval echo \$$varname)"
if [ -z "$value" ]; then
return
fi
echo $value
i=$((i+1))
done
}
#Create a resolv.conf file from OpenVPN environment variables
create_resolvconf() {
foreign_options | grep "^dhcp-option DNS " | sed "s/^dhcp-option DNS /nameserver /"
}
route_up() {
create_resolvconf | resolvconf -x -a $dev
}
down() {
resolvconf -d $dev
}
case "$script_type" in
route-up) route_up "$@" ;;
down) down "$@" ;;
esac
Вы должны быть в состоянии адаптировать его для использования в качестве скрипта диспетчера NetworkManager (см. man 8 NetworkManager), используя:
VPN_IP4_NAMESERVERS
VPN_IP6_NAMESERVERS
Я не проверял это, но что-то вроде этого должно сработать:
#!/bin/sh
create_resolvconf() {
for ip in $VPN_IP4_NAMESERVERS $VPN_IP6_NAMESERVERS; do
echo "nameserver $ip"
done
}
up() {
create_resolvconf | resolvconf -x -a $VPN_IP_IFAC
}
down() {
resolvconf -d $VPN_IP_IFAC
}
if [ -z "$VPN_IP_IFACE" ]; then
return 0
fi
case "$2" in
up) up ;;
down) down ;;
esac