BIND9 (методическое пособие) — различия между версиями

Материал из wiki
Перейти к: навигация, поиск
(Зона прямого просмотра)
(DNAME)
 
(не показано 7 промежуточных версий этого же участника)
Строка 156: Строка 156:
 
Сервер ns.example.com. указан в качестве вторичного.
 
Сервер ns.example.com. указан в качестве вторичного.
  
Параметры времени жизни записи
+
Параметры времени жизни записи:
TTL - время, на которое запись считается действительной, после выдачи сервером. Записи в кэше хранятся в течение TTL.
+
* TTL - время, на которое запись считается действительной, после выдачи сервером. Записи в кэше хранятся в течение TTL.
 +
* Negative Cache TTL - время действия ответа об отсутствии записи (NXDOMAIN). Запись о том, что запрошенное имя не существует хранится в кэше на это время.
  
  
Negative Cache TTL - время действия ответа об отсутствии записи (NXDOMAIN). Запись о том, что запрошенное имя не существует хранится в кэше на это время.
+
TTL можно задавать отдельно для каждой записи. Negative Cache TTL - действует на зоны в целом.
 +
 
  
 
<code>
 
<code>
Строка 448: Строка 450:
 
www        IN      CNAME  example.com.
 
www        IN      CNAME  example.com.
 
</code>
 
</code>
 +
=== DNAME ===
 +
Перенаправление зон RFC 6672
  
 
=== PTR ===
 
=== PTR ===
Строка 491: Строка 495:
 
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0        IN      PTR    www.example.com.
 
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0        IN      PTR    www.example.com.
 
</code>
 
</code>
 
+
=== TEXT ===
 
=== SRV ===
 
=== SRV ===
 +
=== Обратные зоны для бесклассовых подсетей ===
 +
Приемы через CNAME и DNAME
  
 
== Директивы сервера bind==
 
== Директивы сервера bind==
Строка 565: Строка 571:
 
; запрет рекурсии
 
; запрет рекурсии
 
   recursion no;
 
   recursion no;
 +
; запрет добавления Additional секции со ссылками на root сервера для всех запросов, которых нет в зонах.
 +
; заставляет bind отвечать REFUSED на запрос посторонних имен. (Блокировка Upward referrals)
 +
  additional-from-cache no;
  
 
; зона видится внешними клиентами не так, как внутренними
 
; зона видится внешними клиентами не так, как внутренними
Строка 584: Строка 593:
 
</code>
 
</code>
  
 +
Обратите внимание: при запрете рекурсии внутри view перестанут работать CNAME на посторонние зоны.
  
 
При дублировании зон в областях видимости не забывайте прописать после NS записи еще и A-запись для вашего dns-сервера.
 
При дублировании зон в областях видимости не забывайте прописать после NS записи еще и A-запись для вашего dns-сервера.
Строка 613: Строка 623:
 
;; HEADER opcode: QUERY, status: SERVFAIL, id: 60022
 
;; HEADER opcode: QUERY, status: SERVFAIL, id: 60022
 
</code>
 
</code>
 +
 +
== Запрет рекурсий ==
 +
См. upward referrals debates
 +
https://www.dns-oarc.net/oarc/articles/upward-referrals-considered-harmful
 +
 
[[категория:Лекции]]  
 
[[категория:Лекции]]  
 
[[категория:Сети]]  
 
[[категория:Сети]]  
 
[[категория:DNS]]
 
[[категория:DNS]]

Текущая версия на 12:02, 11 марта 2020

Архитектура DNS

root(.)

gTLD

ccTLD

Домены, поддомены, псевдо-поддомены, зоны прямые и обратные

Делегирование зон

Трансфер зон

Рекурсивный и нерекурсивный запрос

Stub-resolver. Тупиковый резолвер с кэшем поддерживает только рекурсивный запрос. (win: DNS-client) TSIG протокол позволяет аутентифицировать передачу данных между DNS-серверами. Можно проверять подлинность данных при передаче зон, рекурсивных запросах, динамических обновлениях. Сами данные не шифруются, но подлинность проверяется. TSIG использует метки времени для предотвращения атаки повторения пакетов.

DNSSEC

nslookup

Пример dns запроса на сервер 10.13.0.101 - рекурсия разрешена:

root@netctrl-01:/etc/bind# nslookup www.ru. 10.13.0.101
Server:         10.13.0.101
Address:        10.13.0.101#53
Non-authoritative answer:
Name:   www.ru
Address: 194.87.0.50

Пример dns запроса на сервер 10.13.0.101 - рекурсия запрещена:

root@netctrl-01:/etc/bind# nslookup www.ru. 10.13.0.101
Server:         10.13.0.101
Address:        10.13.0.101#53
** server can't find www.ru: REFUSED

dig

Пример запроса при помощи команды dig. Рекурсия запрещена

root@netctrl-01:/etc# dig +all ya.ru.
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> +all ya.ru.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 36103
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;ya.ru.                         IN      A
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Feb 20 16:21:58 2014
;; MSG SIZE  rcvd: 23

Рекурсия разрешена

root@netctrl-01:/etc/bind# dig +trace ya.ru.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> +trace ya.ru.
;; global options: +cmd
.                       510544  IN      NS      m.root-servers.net.
.                       510544  IN      NS      b.root-servers.net.
.                       510544  IN      NS      a.root-servers.net.
.                       510544  IN      NS      g.root-servers.net.
.                       510544  IN      NS      k.root-servers.net.
.                       510544  IN      NS      f.root-servers.net.
.                       510544  IN      NS      d.root-servers.net.
.                       510544  IN      NS      j.root-servers.net.
.                       510544  IN      NS      l.root-servers.net.
.                       510544  IN      NS      h.root-servers.net.
.                       510544  IN      NS      e.root-servers.net.
.                       510544  IN      NS      i.root-servers.net.
.                       510544  IN      NS      c.root-servers.net.
;; Received 512 bytes from 127.0.0.1#53(127.0.0.1) in 3 ms

ru.                     172800  IN      NS      a.dns.ripn.net.
ru.                     172800  IN      NS      b.dns.ripn.net.
ru.                     172800  IN      NS      d.dns.ripn.net.
ru.                     172800  IN      NS      e.dns.ripn.net.
ru.                     172800  IN      NS      f.dns.ripn.net.
;; Received 335 bytes from 128.63.2.53#53(128.63.2.53) in 191 ms

ya.ru.                  345600  IN      NS      ns1.yandex.ru.
ya.ru.                  345600  IN      NS      ns2.yandex.ru.
;; Received 154 bytes from 193.232.156.17#53(193.232.156.17) in 288 ms

ya.ru.                  7200    IN      A       213.180.204.3
ya.ru.                  7200    IN      A       93.158.134.3
ya.ru.                  7200    IN      A       213.180.193.3
ya.ru.                  7200    IN      NS      ns1.yandex.ru.
ya.ru.                  7200    IN      NS      ns2.yandex.ru.
;; Received 202 bytes from 213.180.193.1#53(213.180.193.1) in 47 ms

Сервер имен BIND9

Управление

Проверяет конфиг сервера имен

named-checkconf

Перезагружает конфиг и зоны

rndc reload

Перезагружает только изменившиеся зоны

rndc reconfig

Запуск

service bind9 start

Состояние сервера

rndc status

Сброс кэша

rndc flush

Конфигурация и файлы зон по-умолчанию лежат в /etc/bind/

Опции

Списки доступа

acl network1 {
        1.2.3.0/24;
        192.168.0.0/20;
};
acl GoodDns {
       1.2.3.4;
};

Ограничение на трансфер зон и запросы

        allow-transfer {
                localhost;
               GoodDns;
        };
        allow-query {
               any;
        };

Настройка зоны и подключение файла зоны

zone "example.com" {
        type master;
        file "/etc/bind/db.example.com.";
        allow-query {
                any;
        };
};

Зона прямого просмотра

Зоны прямого просмотра делегируются нам владельцем родительского домена.

Пример файла зоны, для которой мы являемся мастером (SOA ns1.model.local.) Сервер ns.example.com. указан в качестве вторичного.

Параметры времени жизни записи:

  • TTL - время, на которое запись считается действительной, после выдачи сервером. Записи в кэше хранятся в течение TTL.
  • Negative Cache TTL - время действия ответа об отсутствии записи (NXDOMAIN). Запись о том, что запрошенное имя не существует хранится в кэше на это время.


TTL можно задавать отдельно для каждой записи. Negative Cache TTL - действует на зоны в целом.


;
$ORIGIN model.local.
$TTL 1h
;
@       IN      SOA     ns1.model.local.        hostmaster.model.local. (
                                                2014023001      ; Serial Number
                                                10800           ; refresh
                                                3600            ; retry
                                                604800          ; expire
                                                86400   )       ; Negative Cache TTL
;
                        IN      NS      ns1.model.local.
                        IN      NS      ns.example.com.
                        IN      MX      10      mail1
;
gw                      IN      A       10.13.0.1
; несколько имен на один адрес
ns1                     IN      A       10.13.0.2
net-ctrl-1              IN      A       10.13.0.2
mail1                  IN      A       10.13.0.10
front2                  IN      A       10.13.0.11
back1                   IN      A       10.13.0.20
back2                   IN      A       10.13.0.21
; несколько адресов на одно имя - балансировка
back                    IN      A       10.13.0.20
                        IN      A       10.13.0.21
stor1                   IN      A       10.13.0.30
stor2                   IN      A       10.13.0.31
stor-vip                IN      A       10.13.0.40
front-vrrp              IN      A       10.13.0.50
www                     IN      CNAME   model.local.
bc                      IN      A       10.13.0.255
;
; users
user1                  IN      CNAME   back.model.local.
www.user1              IN      CNAME   back.model.local.
user2                  IN      CNAME   back.model.local.
www.user2              IN      CNAME   back.model.local.
;

Зона обратного просмотра

Зона обратного просмотра управляется владельцем диапазона ip адресов.

Пример файла зоны обратного просмотра, для которой мы являемся мастером

;
$ORIGIN 0.13.10.IN-ADDR.ARPA.
$TTL 1h
;
@       IN      SOA     ns1.model.local.        hostmaster.model.local. (
                                                2014023001      ; Serial Number
                                                10800           ; refresh
                                                3600            ; retry
                                                604800          ; expire
                                                86400   )       ; min TTL
;
                        IN      NS      ns1.model.local.
;
2                       IN      PTR     ns1.model.local.
101                     IN      PTR     netctrl-01.model.local.
255                     IN      PTR     bc.model.local.
;

Зоны по-умолчанию

Зона типа hint для домена точки со списком корневых серверов. Файл зона необходимо периодически обновлять с сервера ftp://ftp.internic.net/domain/named.cache

zone "." {
        type hint;
        file "/etc/bind/db.root";
};

Зоны замыкания на себя прямые, обратные и броадкастов.

zone "localhost" {
        type master;
        file "/etc/bind/db.local";
};

zone "127.in-addr.arpa" {
        type master;
        file "/etc/bind/db.127";
};

zone "0.in-addr.arpa" {
        type master;
        file "/etc/bind/db.0";
};

zone "255.in-addr.arpa" {
        type master;
        file "/etc/bind/db.255";
};

Пример прямой и обратной зоны замыкания на себя, входящих в дистрибутив BIND9

; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
@       IN      A       127.0.0.1
@       IN      AAAA    ::1
;
$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
1.0.0   IN      PTR     localhost.

Типы ресурсных записей (RR)

SOA

SOA запись в файле зоны должна быть только одна. В файле она должна стоять первой. Запись SOA определяет какой сервер является владельцем зоны и какие на зону установлены параметры. После записи SOA надо обязательно указать IN NS запись с тем-же сервером, что и в заголовке.

Пример: домен example.com обслуживается серверами ns.example.com и ns.examle.net. После указания директивы $ORIGIN сервер автоматически допишет за нас все неполные dns имена (таким образом hostmaster читается как hostmaster.example.com). Имя сервера вне зоны пишется полностью.

$TTL 2d ; zone TTL default = 2 days or 172800 seconds
$ORIGIN example.com.
@      IN      SOA   ns hostmaster (
               2003080800 ; serial number
               1d12h      ; refresh =  1 day 12 hours
               15M        ; update retry = 15 minutes
               3W12h      ; expiry = 3 weeks + 12 hours
               2h20M      ; minimum = 2 hours + 20 minutes
               )
       IN      NS  ns
       IN      NS  ns.example.net.  ; out-of-zone 
...
; A record for the NS RR above
ns     IN      A   192.168.2.1
;

Пример 2: домен example.com обслуживается двумя серверами вне зоны. Для них указаны полные имена в записях IN NS. Т.к. домен обслуживается другими серверами никакие A записи не допускаются.

$TTL 2d ; zone TTL default = 2 days or 172800 seconds
$ORIGIN example.com.
@      IN      SOA   ns.example.net. hostmaster.example.com. (
               2003080800 ; serial number
               1d12h      ; refresh =  1 day 12 hours
               15M        ; update retry = 15 minutes
               3W12h      ; expiry = 3 weeks + 12 hours
               2h20M      ; minimum = 2 hours + 20 minutes
               )
        IN     NS    ns.example.net. ; out-of-zone name server
        IN     NS    ns.example.org. ; out-of-zone name server

NS

Инфраструктурная запись, указывающая имя сервера имен для данного домена. Формат

owner-name     ttl  class   rr     target-name
example.com.        IN      NS      ns1.example.com.

Согласно стандарту, каждый публичный домен должен иметь минимум 2 сервера имен. Частный домен может обслуживаться и одним сервером.

Если NS сервер для нашего домена находится в нашем домене, то мы обязаны указать A-запись для этого сервера (glue-record). Если NS сервер лежит вне домена - A-запись указывать не нужно.

Пример: NS записи для основного домена и для делегированного поддомена с указанием glue-records.

$TTL 2d ; default TTL is 2 days
$ORIGIN example.com.
@              IN      SOA   ns1.example.com. hostmaster.example.com. (
               2003080800 ; serial number
               2h         ; refresh =  2 hours 
               15M        ; update retry = 15 minutes
               3W12h      ; expiry = 3 weeks + 12 hours
               2h20M      ; minimum = 2 hours + 20 minutes
               )
              IN      NS     ns1.example.com.
              IN      NS     ns2.example.com.
; обязательно указываем адреса этих серверов
ns1           IN      A      192.168.0.3
ns2           IN      A      192.168.0.4
; переключение на поддомен
$ORIGIN us.example.com.
@             IN      NS     ns3.us.example.com.
              IN      NS     ns1.example.com.
; обязательно указываем на сервер поддомена
ns3.us.example.com. A 10.10.0.24

A, AAAA

A-запись указывает на ip адрес для данного имени хоста. Опционально указать особо ttl.

Пример: различные вариации записи

$TTL 2d ; zone default = 2 days or 172800 seconds
joe        IN      A      192.168.0.3  ; одинаковые ip
www        IN      A      192.168.0.3
; можно указать домен полностью
www.example.com.   A      192.168.0.3
fred  3600 IN      A      192.168.0.4  ; указан другой ttl
ftp        IN      A      192.168.0.24 ; разные ip для одного имени
           IN      A      192.168.0.7
mail       IN      A      192.168.0.15  ; разные ip для одного имени
mail       IN      A      192.168.0.32
mail       IN      A      192.168.0.3
squat      IN      A      10.0.14.13  ; другая подсеть

AAAA-запись используется для IPv6 адресов

ws1-29                  A       10.0.10.29                                                                                      
                        AAAA    2002:d4c0:4090::d110:1011 

Когда одному имени сопоставлено много адресов, в обратной записи для адреса нужно выдрать только одно имя.

MX

Инфраструктурная запись указывающая на имя почтового сервера для домена. Если имя сервера в этом-же домене - требуется еще А-запись с ip адресом почтового сервера.

Почтовых серверов для домена можно указать несколько с разными приоритетами.

Пример: почтовые сервера для домена и поддомена в одном файле

$TTL 2d ; zone default = 2 days or 172800 seconds
$ORIGIN example.com.
example.com. IN     SOA   ns1.example.com. root.example.com. (
               2003080800 ; serial number
               2h         ; refresh =  2 hours 
               15M        ; update retry = 15 minutes
               3W12h      ; expiry = 3 weeks + 12 hours
               2h20M      ; minimum = 2 hours + 20 minutes
               )
; почтовый сервер для адресов вида user@example.com
              IN      MX 10  mail.example.com.
; почтовые сервера для поддомена user@us.example.com
us            IN      MX 10  mail.us.example.com.
us            IN      MX 20  mail.example.com.
; A-запись для основного почтового сервера
mail          IN      A      192.168.0.5
; Переключение на поддомен
$ORIGIN us.example.com.
; A-запись для почтового сервера поддомена
mail          IN      A      10.10.0.29

CNAME

Запись CNAME используется для указания псевдонима или ссылки одного имени на другое. Если сервер вернул клиенту CNAME в ответ на запрос, то клиенту придется повторно делать запрос на разрешение CNAME. Используется для удобства администрирования при наличии многих имен у одного сервера.

Примеры различных псевдонимов в домене example.com.:

joe        IN      A      192.168.254.3   
www        IN      CNAME  joe 
www        IN      CNAME  joe.example.com. 
ftp        IN      CNAME  www.example.com. ; паровоз
bill       IN      CNAME  fred.another.com. ; перенаправление на имя в другом домене
;
           IN      A      192.168.254.8
www        IN      CNAME  example.com.

DNAME

Перенаправление зон RFC 6672

PTR

Обратная запись указывает на имя по ip адресу. Используется специальный домен .IN-ADDR.ARPA. Для IPv6 используется другой домен - IP6.ARPA. Поэтому обратные записи необходимо держать в разных файлах для ipv4 и ipv6.

Пример для IPv4:

$TTL 2d ; 172800 secs
$ORIGIN 23.168.192.IN-ADDR.ARPA.
@             IN      SOA   ns1.example.com. hostmaster.example.com. (
                              2003080800 ; serial number
                              12h         ; refresh
                              15m        ; update retry
                              3w         ; expiry
                              3h         ; minimum
                              )
              IN      NS      ns1.example.com.
              IN      NS      ns2.example.com.
2             IN      PTR     joe.example.com. ; FDQN
15            IN      PTR     www.example.com.
17            IN      PTR     bill.example.com.
74            IN      PTR     fred.example.com.

Пример для IPv6:

; reverse IPV6 zone file for example.com
$TTL 2d    ; default TTL for zone 172800 secs
$ORIGIN 0.0.0.0.8.b.d.0.1.0.0.2.IP6.ARPA.
@         IN      SOA   ns1.example.com. hostmaster.example.com. (
                        2003080800 ; sn = serial number
                        12h         ; refresh = refresh
                        15m        ; retry = update retry
                        3w         ; expiry = expiry
                        2h         ; min = minimum
                        )
          IN      NS      ns1.example.com.
          IN      NS      ns2.example.net.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0         IN      PTR     ns1.example.com.
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0         IN      PTR     mail.example.com.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0         IN      PTR     joe.example.com.
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0         IN      PTR     www.example.com.

TEXT

SRV

Обратные зоны для бесклассовых подсетей

Приемы через CNAME и DNAME

Директивы сервера bind

$TTL $ORIGIN

View - ограничение видимости зон

Использование ограничения видимости позволяет применять различные опции по отношению к различным клиентам. Опция вступают в действие в зависимости от ip адреса клиента - источника запроса.

Это позволяет использовать разные данные по одной и той-же зоне для разных клиентов. Для внутренних клиентов мы должны разрешить рекурсивные запросы, для внешних - запретить.

В конфигурационном файле необходимо запретить рекурсию по-умолчанию (закомментировать). На рубеже версии 9.5 поведение этого флажка меняется, на новых версиях надо оставить строчку включенной.

allow-recursion { any; };

На версии 9.8.4 поведение такое:

  • allow-recursion { any; }; view recusion yes; - разрешает рекурсию. (на нерекурсивный запрос дает хинт root-list);
  • allow-recursion { any; }; view recusion no; - запрещает рекурсию молча (no answer);
  • allow-recursion { none; }; view recusion yes|no; - запрещает рекурсию (REFUSED);
  • закомментарен allow-recursion { none; }; view recusion yes|no; - запрещает рекурсию (REFUSED);

Т.е. для нас актуальны первые два варианта.

Выключить проверку DNSSEC. Требуется если мы в лабораторных условиях сквоттим TLD.

dnssec-validation no;

Конфигурация зон /etc/bind/named.conf

; список доступа - наши внутренние клиенты
acl internal {
    10.13.0.0/24;
    localhost;
};

; область видимости для внутренних клиентов
view "internal-view" {
  ; клиент - соответствует списку доступа
  match-clients { internal; };
  ; разрешена рекурсия для внутренних клиентов
  recursion yes;

 ;  зона видима только для внутренних клиентов
  zone "model.local" in {
    type master;
    file "/etc/bind/db.model.local";
  };

; зона видима для внутренних клиентов иначе, чем для внешних
; файл зоны свой
  zone "model.example.net" in {
    type master;
    file "/etc/bind/db.model.example.net.internal";
  };

; обратная зона для внутренних клиентов тоже своя
  zone "0.13.10.in-addr.arpa" in {
    type master;
    file "/etc/bind/rev.10.13.0.internal";
  };

; дефолтные зоны сервера
  include "/etc/bind/named.conf.default-zones";
};

; область видимости, доступная всем прочим клиентам
view "external-view" {
  match-clients { any; };
; запрет рекурсии
  recursion no;
; запрет добавления Additional секции со ссылками на root сервера для всех запросов, которых нет в зонах.
; заставляет bind отвечать REFUSED на запрос посторонних имен. (Блокировка Upward referrals)
  additional-from-cache no;

; зона видится внешними клиентами не так, как внутренними
; файл зоны свой
  zone "model.example.net" in {
    type master;
    file "/etc/bind/db.model.example.net";
  };

;  обратная зона видится внешними клиентами не так, как внутренними
; файл зоны свой
  zone "0.13.10.in-addr.arpa" in {
    type master;
    file "/etc/bind/rev.10.13.0";
  };

};

Обратите внимание: при запрете рекурсии внутри view перестанут работать CNAME на посторонние зоны.

При дублировании зон в областях видимости не забывайте прописать после NS записи еще и A-запись для вашего dns-сервера. Внешние клиенты тоже должны знать ip адрес вашего NS. Пример:

$ORIGIN model.local.
$TTL 1h
;
@       IN      SOA     ns1.model.local.        hostmaster.model.local. (
                                                2014025006      ; Serial Number
                                                10800           ; refresh
                                                3600            ; retry
                                                604800          ; expire
                                                86400   )       ; min TTL
;
                        IN      NS      ns1.model.local.
                        IN      MX      10      mail1
;
ns1                     IN      A       10.13.0.104 ; <--------- ОБЯЗАТЕЛЬНО
gw                      IN      A       10.13.0.43
hi                      IN      A       10.13.0.223

Если этого не сделать, в ответ на запрос к любому имени в зоне сервер будет отвечать ошибкой "ServerFail":

root@model-net-ctrl-1:/etc/bind# dig hi.model.local. @10.13.0.104
;; Got answer:
;; HEADER opcode: QUERY, status: SERVFAIL, id: 60022

Запрет рекурсий

См. upward referrals debates https://www.dns-oarc.net/oarc/articles/upward-referrals-considered-harmful