HOWTO SAMBA на 2 интерфейса и 2 сети с разными smb.conf

11 мая, 2012 Рубрики: HOWTO, Linux, SAMBA, Windows, Настройка сервера Linux

samba, два интерфейса, два конфигаДоброго времени, читатели и гости моего блога. На днях довелось реализовать вот такую необычную схему на SAMBA, установленной из пакетного менеджера Debian squeezy. Делюсь данным решением с Вами.

Введение

Итак, стояла задача организовать обменник между двумя сетям не связанными между собой. При этом, объем файлов был довольно большой и использовать файловые хостинги или почту для данной задачи неудобно. Было решено поставить между сетями слабенькую машинку с большим объемом дискового пространства и попробовать настроить SAMBA. При этом, 2 конфига будут указывать на один и тот же каталог в файловой системе, это позволит видеть измененные/добавленные файлы обоим подсетям в онлайне. За основу статьи был взят материал из wiki samba.

Особенностью конфигурации samba для работы в нескольких сетях (читай - с разными конфигами) заключается в том, что необходимо хранить tdb - файлы раздельно для каждого запущенного экземпляра smbd/nmbd. Эти файлы содержат некоторую техническую информацию о работе демонов, такую как сопоставление пользователей, пароли и др. (более подобно о файлах tdb можно почитать в man smbd). Чтобы обеспечить хранение tdb-файлов в разных каталогах, можно пойти двумя путями:

  1. перекомпилировать SAMBA с указанием путей размещения файлов
  2. указать размещение - в конфигурационном файле smb.conf и указать каждому экземпляру демона свой конфигурационный файл

Как вы, наверно, догадались - мы пойдем по второму пути. Кроме того, необходимо заставить samba (читай - демонов smbd, nmbd) слушать запросы на заданных сетевых интерфейсах. Это тоже делается в конфигурационном файле.

Исходные данные

  • Данный мануал ориентирован на Debian-подобные дистрибутивы.
  • Для статьи я буду использовать файл конфигурации для файлопомойки, чтобы не отвлекать от основной задачи настройки SAMBA на двух интерфейсах. Никто не запрещает настроить samba, например для взаимодействия в одной из сетей с контроллером домена.
  • На нашем сервере имеется два сетевых интерфейса: eth1 и eth2
  • На интерфейсе eth1 будут работать следующие параметры:
    • рабочая группа SAMBA
    • имя сервера FILES
    • подсеть 192.168.0.1/24
  • На интерфейсе eth2 будут работать следующие параметры:
    • рабочая группа WINDOWS
    • имя сервера SERVER
    • подсеть 10.0.0.1/24
  • Для настройки данной статьи необходимо наличие установленного пакета sambawinbind, если используется доменная аутентификация), на момент написания статьи версия - 3.5.6~dfsg-3squeeze8.

Настройка сети для SAMBA

Настроим сетевые интерфейсы и некоторые другие сетевые параметры перед настройкой SAMBA. (Для редактирования конфигов я использую редактор vim). Вот содержимое файлов:

root@debian:~# vim /etc/network/interfaces
root@debian:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth1 eth2
iface eth1 inet static
        address 192.168.0.1
        netmask 255.255.255.0

iface eth2 inet static
        address 10.0.0.1
        netmask 255.255.255.0
root@debian:~# vim /etc/hosts
root@debian:~# cat /etc/hosts
127.0.0.1       localhost
192.168.0.1     files.samba             files
10.0.0.1        server.windows          server

Более подробно о настройке сети в Linux я писал в соответствующей статье.

Настройка каталогов размещения экземпляров SAMBA

Если мы посмотрим в каких каталогах самба по умолчанию хранит свои настройки:

root@debian:~# testparm -vs 2> /dev/null |  grep /
        smb passwd file = /etc/samba/smbpasswd
        private dir = /etc/samba
        passwd program = /usr/bin/passwd %u
        log file = /var/log/samba/log.%m
        lock directory = /var/run/samba
        state directory = /var/lib/samba
        cache directory = /var/cache/samba
        pid directory = /var/run/samba

то сможем эти пути переделать под наши нужны. О назначении каждого из каталогов можно почитать в man smb.conf. Давайте создадим необходимые нам каталоги, в которых samba хранит свои настройки (pid'ы, базы данных ...):

root@debian:~# mkdir -p /var/log/samba-server /var/log/samba-files
mkdir: создан каталог «/var/log/samba-server»
mkdir: создан каталог «/var/log/samba-files»
root@debian:~# mkdir -p -v /var/run/samba-server /var/run/samba-files
mkdir: создан каталог «/var/run/samba-server»
mkdir: создан каталог «/var/run/samba-files»
root@debian:~# mkdir -p -v /var/lib/samba-server /var/lib/samba-files
mkdir: создан каталог «/var/lib/samba-server»
mkdir: создан каталог «/var/lib/samba-files»
root@debian:~# mkdir -p -v /var/cache/samba-server /var/cache/samba-files
mkdir: создан каталог «/var/cache/samba-server»
mkdir: создан каталог «/var/cache/samba-files»
root@debian:~# mkdir -p -v /shares/obmen
mkdir: создан каталог «/shares»
mkdir: создан каталог «/shares/obmen»

Данные пути я выбрал для удобства. Вы можете создать свои каталоги для разных экземпляров samba. Конечно же, если укажите свои пути, то их нужно учесть в следующих шагах.

Настройка ротации логов SAMBA

О syslog и logrotate я писал в прошлых статьях. Этих знаний должно быть вполне достаточно, чтобы понять следующий конфиг:

root@debian:~# # оригинальный конфиг:
root@debian:~# vim /etc/logrotate.d/samba
/var/log/samba/log.smbd {
        weekly
        missingok
        rotate 7
        postrotate
                /etc/init.d/samba reload > /dev/null
        endscript
        compress
        notifempty
}

/var/log/samba/log.nmbd {
        weekly
        missingok
        rotate 7
        postrotate
                [ ! -f /var/run/samba/nmbd.pid ] || kill -HUP `cat /var/run/samba/nmbd.pid`
        endscript
        compress
        notifempty
}
root@debian:~# # переделанный для нескольких интерфейсов:
root@debian:~# vim /etc/logrotate.d/samba
## в целом, конфиг необходимо формировать по следующим правилам:
#/путь/к/логам/log.* {
## путь задается в том формате, который задан в параметре log file
#        weekly
#        missingok
#        rotate 7
#        postrotate
## пути к pid указываются в соответствии с параметром pid directory
#                [ ! -f /путь/к/pid/файлу_nmbd.pid ] || /bin/kill -HUP `cat /путь/к/pid/файлу_nmbd.pid`
#                [ ! -f /путь/к/pid/файлу_smbd.pid ] || /bin/kill -HUP `cat //путь/к/pid/файлу_smbd.pid`
## путь к pid'у демона winbind указывать необязательно, если он не используется
#                [ ! -f /путь/к/pid/файлу_winbindd.pid ] || /bin/kill -HUP `cat /путь/к/pid/файлу_winbindd.pid`
#        endscript
#        compress
#        notifempty
#}

/var/log/samba-files/log.* {
        weekly
        missingok
        rotate 7
        postrotate
                [ ! -f /var/run/samba-files/nmbd-smb-files.conf.pid ] || /bin/kill -HUP `cat /var/run/samba-files/nmbd-smb-files.conf.pid`
                [ ! -f /var/run/samba-files/smbd-smb-files.conf.pid ] || /bin/kill -HUP `cat /var/run/samba-files/smbd-smb-files.conf.pid`
                [ ! -f /var/run/samba-files/winbindd-smb-files.conf.pid ] || /bin/kill -HUP `cat /var/run/samba-files/winbindd-smb-files.conf.pid`
        endscript
        compress
        notifempty
}

/var/log/samba-server/log.* {
        weekly
        missingok
        rotate 7
        postrotate
                [ ! -f /var/run/samba-server/nmbd-smb-server.conf.pid ] || /bin/kill -HUP `cat /var/run/samba-server/nmbd-smb-server.conf.pid`
                [ ! -f /var/run/samba-server/smbd-smb-server.conf.pid ] || /bin/kill -HUP `cat /var/run/samba-server/smbd-smb-server.conf.pid`
                [ ! -f /var/run/samba-server/winbindd-smb-server.conf.pid ] || /bin/kill -HUP `cat /var/run/samba-server/winbindd-smb-server.conf.pid`
        endscript
        compress
        notifempty
}

Из данных конфигурационных файлов может возникнуть вопрос, почему pid'ы указаны в таком формате. Об этом я расскажу ниже. В остальном, думаю, что понятно, что пути к каталогу логов и pid'ов необходимо поменять на те, которые были созданы на прошлом шаге, а точнее на те, которые вы укажите в соответствующем конфиге smb.conf для заданного экземпляра samba.

Настройка файлов smb.conf для разных экземпляров samba

Перед настройкой SAMBA на разных интерфейсах я обычно переименовываю оригинальный smb.conf и создаю отдельные конфиги с нуля:

root@debian:~# mv -v /etc/samba/smb.conf /etc/samba/_smb.conf.orig
«/etc/samba/smb.conf» -> «/etc/samba/_smb.conf.orig
root@debian:~# # конфиг для интерфейса eth2,
root@debian:~# # раб.гр. WINDOWS с именем севера SERVER:
root@debian:~# vim /etc/samba/smb-server.conf
[global]
        workgroup = WINDOWS
        netbios name = SERVER
        interfaces = eth2
        bind interfaces only = Yes
        security = SHARE
        log level = 3
        smb ports = 139
        wins support = Yes
        preferred master = Yes
        guest ok = yes
        log file = /var/log/samba-server/log.%m
        lock directory = /var/run/samba-server
        state directory = /var/lib/samba-server
        cache directory = /var/cache/samba-server
        pid directory = /var/run/samba-server
        private dir = /var/lib/samba-server

[win-serv]
        path = /shares/obmen
        read only = No
        inherit permissions = Yes
        create mask = 0777
        directory mask = 0777
root@debian:~# # конфиг для интерфейса eth1,
root@debian:~# # раб.гр. SAMBA с именем севера FILES:
root@debian:~# vim /etc/samba/smb-files.conf
[global]
        workgroup = SAMBA
        netbios name = FILES
        interfaces = eth1
        bind interfaces only = Yes
        security = SHARE
        log level = 3
        smb ports = 139
        wins support = Yes
        preferred master = Yes
        guest ok = yes
        log file = /var/log/samba-files/log.%m
        lock directory = /var/run/samba-files
        state directory = /var/lib/samba-files
        cache directory = /var/cache/samba-files
        pid directory = /var/run/samba-files
        private dir = /var/lib/samba-files

[samba-files]
        path = /shares/obmen
        read only = No
        inherit permissions = Yes
        create mask = 0777
        directory mask = 0777

Основополагающим для данной темы в данных конфигурационных файлах являются параметры interfaces и bind interfaces only, ограничивающие работу экземпляра samba на заданных интерфейсах. А так же параметры, разделяющие размещение приватных файлов для данного экземпляра SAMBA (log file, lock directory, state directory,cache directory, pid directory и private dir).

Примечание. В Debian в SAMBA, поставляемой с дистрибутивом по какой-то причине, smbd не слушается параметр private dir, в результате чего файлы passdb.tdb и secrets.tdb используются для всех запускаемых экземпляров и хранят в себе SID'ы и некоторые другие настройки для всех запущенных smbd. Почему так происходит - я ответа не нашел...

Создание init - скрипта для разных smb.conf

Про этапы загрузки Linux и систему System V init я писал в прошлых статьях, про работу bash так же было написано много статей, поэтому знаний для понимания происходящего должно хватить. Перед тем как создать модифицированные init-скрипты, необходимо остановить и отключить оригинальный экземпляр samba и winbind:

root@debian:~# /etc/init.d/samba stop
Stopping Samba daemons: nmbd smbd.
root@debian:~# /etc/init.d/winbind stop
Stopping the Winbind daemon: winbind.
root@debian:~# update-rc.d samba remove
update-rc.d: using dependency based boot sequencing
root@debian:~# update-rc.d winbind remove
update-rc.d: using dependency based boot sequencing

После этого, беремся модифицировать оригинальный init-скрипт samba, который имеет вид:

Показать оригинальный init для samba »

#!/bin/sh

### BEGIN INIT INFO
# Provides:          samba
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Should-Start:      slapd
# Should-Stop:       slapd
# Short-Description: start Samba daemons (nmbd and smbd)
### END INIT INFO

# Defaults
RUN_MODE="daemons"

# Reads config file (will override defaults above)
[ -r /etc/default/samba ] && . /etc/default/samba

PIDDIR=/var/run/samba
NMBDPID=$PIDDIR/nmbd.pid
SMBDPID=$PIDDIR/smbd.pid

# clear conflicting settings from the environment
unset TMPDIR

# See if the daemons are there
test -x /usr/sbin/nmbd -a -x /usr/sbin/smbd || exit 0

. /lib/lsb/init-functions

case "$1" in
        start)
                log_daemon_msg "Starting Samba daemons"
                # Make sure we have our PIDDIR, even if it's on a tmpfs
                install -o root -g root -m 755 -d $PIDDIR

                NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' 2>/dev/null`
                if [ "$NMBD_DISABLED" != 'Yes' ]; then
                        log_progress_msg "nmbd"
                        if ! start-stop-daemon --start --quiet --oknodo --exec /usr/sbin/nmbd -- -D
                        then
                                log_end_msg 1
                                exit 1
                        fi
                fi

                if [ "$RUN_MODE" != "inetd" ]; then
                        log_progress_msg "smbd"
                        if ! start-stop-daemon --start --quiet --oknodo --exec /usr/sbin/smbd -- -D; then
                                log_end_msg 1
                                exit 1
                        fi
                fi

                log_end_msg 0
                ;;
        stop)
                log_daemon_msg "Stopping Samba daemons"
                log_progress_msg "nmbd"

                start-stop-daemon --stop --quiet --pidfile $NMBDPID
               # Wait a little and remove stale PID file
                sleep 1
                if [ -f $NMBDPID ] && ! ps h `cat $NMBDPID` > /dev/null
                then
                        # Stale PID file (nmbd was succesfully stopped),
                        # remove it (should be removed by nmbd itself IMHO.)
                        rm -f $NMBDPID
                fi

                if [ "$RUN_MODE" != "inetd" ]; then
                        log_progress_msg "smbd"
                        start-stop-daemon --stop --quiet --pidfile $SMBDPID
                        # Wait a little and remove stale PID file
                        sleep 1
                        if [ -f $SMBDPID ] && ! ps h `cat $SMBDPID` > /dev/null
                        then
                                # Stale PID file (nmbd was succesfully stopped),
                                # remove it (should be removed by smbd itself IMHO.)
                                rm -f $SMBDPID
                        fi
                fi

                log_end_msg 0

                ;;
        reload)
                log_daemon_msg "Reloading /etc/samba/smb.conf" "smbd only"

                start-stop-daemon --stop --signal HUP --pidfile $SMBDPID

                log_end_msg 0
                ;;
        restart|force-reload)
                $0 stop
                sleep 1
                $0 start
                ;;
        status)
                status="0"
                NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' 2>/dev/null`
                if [ "$NMBD_DISABLED" != "Yes" ]; then
                        status_of_proc -p $NMBDPID /usr/sbin/nmbd nmbd || status=$?
                fi
                if [ "$RUN_MODE" != "inetd" ]; then
                        status_of_proc -p $SMBDPID /usr/sbin/smbd smbd || status=$?
                fi
                if [ "$NMBD_DISABLED" = "Yes" -a "$RUN_MODE" = "inetd" ]; then
                        status="4"
                fi
                exit $status
                ;;
        *)
                echo "Usage: /etc/init.d/samba {start|stop|reload|restart|force-reload|status}"
                exit 1
                ;;
esac

exit 0

Давайте разберем данный скрипт... В самом начале ( BEGIN INIT INFO) задается некая информация для управления автозапуском демона (например, с помощью команды update-rc.d). Далее, задаются некоторые переменные. Тут мы сталкиваемся с первым важным моментом, который нас не устраивает - неверно указаны пути к расположению pid-файлов. Кроме того, как показала практика, если используется нестандартный конфиг, то pid-файл создается с именем имядемона-имяконфига.pid, (например, в нашем случае с конфигом smb-files.conf  и демоном smbd - smbd-smb-files.conf.pid). Соответственно, это второй важный момент - несоответствие имени pid-файла.

Далее, проверяется наличие и читается конфигурационный файл из /etc/default, происходит разименование переменной TMPDIR (для чего???), проверяется наличие исполняемых файлов демонов и включается в конфиг некоторые LSB log_* функции из пакета lsb-base. Как видно, тут нигде не задается переменная со значением конфигурационного файла. Это третий важный момент, который нас не устраивает.

Далее идет чтение переданной позиционной переменной $1 и в зависимости от ее значения происходит, запуск, остановка, перезагрузка, перезапуск, вывод статуса или просто вывод сообщения на консоль. Давайте каждый пункт рассмотрим:

start) = запуск демона

  • Сначала выводится сообщение о начале запуска SAMBA с помощью функции  log_daemon_msg, которая берется из файла init-functions.
  • Далее командой install устанавливается владелец, группа и права на каталог с pid-файлами.
  • Далее, с помощью программы testparm проверяется, не установлен ли параметр  disable netbios в конфигурационном файле по умолчанию (!!! /etc/samba/smb.conf). Опять же, у нас будут свои конфиги и в данной проверке конфиг не указан. Это четвертый важный момент, который нас не устраивает.
  • Если  disable netbios в конфиге задан в yes, то nmbd запущен не будет за ненадобностью. Если же nmbd запускается, то выводится сообщение "nmbd" и запускается демон nmbd с помощью программы start-stop-daemon. Если почитать man start-stop-daemon, то становится видно, что тут тоже есть недостатки, которые так же нас не устраивают: 1. не проверяется создание pid файла, 2. не указывается конфигурационный файл, который необходимо использовать для запуска.
  • Если запуск происходит неудачно, про происходит выход с выводом сообщения об ошибке со статусом 1.
  • Далее, если переменная  $RUN_MODE не установлена в значение inetd, то выводится сообщение "smbd" и запускается демон smbd. С теми же недостатками, что и nmbd. Так же, если запуск не удался, то происходит выход с выводом сообщения об ошибке со статусом 1.

stop) = остановка демона

  • при остановке демона выводится сообщение об остановке, выводится сообщение "nmbd" и с помощью программы start-stop-daemon на основе pid-файла демон nmbd останавливается.
  • Через 1 секунду проверяется существование pid файла и если он существует - удаляется.
  • Далее, если переменная $RUN_MODE не установлена в значение inetd, то выводится сообщение "smbd" и останавливается демон smbd.
  • Через 1 секунду проверяется существование pid файла и если он существует - удаляется.

reload) = перечитать конфиг

  • В данном случае выводится сообщение о релоаде smbd и и посылается сигнал HUP демону smbd.

restart) = перезапуск

  • перезапуск заключается в последовательном запуске stop и start.

status) = проверка статуса процесса

  • в данном случае, с помощью функции status_of_proc из init-functions проверяется запущен ли smbd, nmbd

*) = вывод текстового сообщения

  •  Данный пункт отвечает за вывод текстового сообщения в случае ошибки при вводе start, stop,....

Итак, разобравшись с init-скриптом мы можем приступить к модификации оригинального скрипта в тот вид, который необходимый нам. С учетом всех описанных недостатков выше:

root@debian:~# # копируем оригинальный скрипт в модифицируемый
root@debian:~# cp -v /etc/init.d/samba /etc/init.d/samba-server
«/etc/init.d/samba» -> «/etc/init.d/samba-server»
root@debian:~# # запрещаем доступ всем к реальному скрипту
root@debian:~# chmod 000 /etc/init.d/samba
root@debian:~# # редактируем скрипт для SERVER
root@debian:~# vim /etc/init.d/samba-server
root@debian:~# # копируем модифицированный скрипт в скрипт для FILES и редактируем
root@debian:~# cp -v /etc/init.d/samba-server /etc/init.d/samba-files
«/etc/init.d/samba-server» -> «/etc/init.d/samba-files»
root@debian:~# vim /etc/init.d/samba-files
root@debian:~# # делаем скрипты исполняемыми
root@debian:~# chmod -v +x /etc/init.d/samba-*
права доступа «/etc/init.d/samba-files» оставлены как 0755 (rwxr-xr-x)
права доступа «/etc/init.d/samba-server» оставлены как 0755 (rwxr-xr-x)
root@debian:~# # добавляем оба скрипта в автозагрузку
root@debian:~# update-rc.d samba-server defaults
update-rc.d: using dependency based boot sequencing
root@debian:~# update-rc.d samba-files defaults
update-rc.d: using dependency based boot sequencing

Итого, у нас получились следующие скрипты (модификации отмечены цветом):

Показать init для SERVER »

root@debian:~# cat /etc/init.d/samba-server
#!/bin/sh

### BEGIN INIT INFO
# Provides:          samba-server
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Should-Start:      slapd
# Should-Stop:       slapd
# Short-Description: start Samba daemons (nmbd and smbd)
### END INIT INFO

# изменим поле Provides в соответствии с именем скрипта,
#  иначе будет ругаться при добавлении в автозагрузку

# Defaults
RUN_MODE="daemons"

# Reads config file (will override defaults above)
# у себя я отключил данный конфиг, т.к. настраиваю все тут
#[ -r /etc/default/samba ] && . /etc/default/samba

# изменяем путь на тот, что в конфиге:
PIDDIR=/var/run/samba-server
# изменяем имена pid
NMBDPID=$PIDDIR/nmbd-smb-server.conf.pid
SMBDPID=$PIDDIR/smbd-smb-server.conf.pid
# задаем переменную, хранящую путь к конфигу
CONF=/etc/samba/smb-server.conf

# clear conflicting settings from the environment
unset TMPDIR

# See if the daemons are there
test -x /usr/sbin/nmbd -a -x /usr/sbin/smbd || exit 0

. /lib/lsb/init-functions

case "$1" in
        start)
                # изменяем строку лога на подходящую нам
                log_daemon_msg "Starting Samba for SERVER and workgroup WINDOWS"
                # Make sure we have our PIDDIR, even if it's on a tmpfs
                install -o root -g root -m 755 -d $PIDDIR

                # указываем в testparm конфиг
                NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' $CONF  2>/dev/null`
                if [ "$NMBD_DISABLED" != 'Yes' ]; then
                        log_progress_msg "nmbd"
                        # указываем для nmbd конфиг и задаем проверку pid
                        if ! start-stop-daemon --start --quiet --oknodo --pidfile $NMBDPID --exec /usr/sbin/nmbd -- -D -s $CONF
                        then
                                log_end_msg 1
                                exit 1
                        fi
                fi

                if [ "$RUN_MODE" != "inetd" ]; then
                        log_progress_msg "smbd"
                        # указываем для smbd конфиг  и задаем проверку pid
                        if ! start-stop-daemon --start --quiet --oknodo --pidfile $SMBDPID --exec /usr/sbin/smbd -- -D -s $CONF; then
                                log_end_msg 1
                                exit 1
                        fi
                fi

                log_end_msg 0
                ;;
        stop)
                log_daemon_msg "Stopping Samba for SERVER and workgroup WINDOWS"
                log_progress_msg "nmbd"

                start-stop-daemon --stop --quiet --pidfile $NMBDPID
                # Wait a little and remove stale PID file
                sleep 1
                if [ -f $NMBDPID ] && ! ps h `cat $NMBDPID` > /dev/null
                then
                        # Stale PID file (nmbd was succesfully stopped),
                        # remove it (should be removed by nmbd itself IMHO.)
                        rm -f $NMBDPID
                fi

                if [ "$RUN_MODE" != "inetd" ]; then
                        log_progress_msg "smbd"
                        start-stop-daemon --stop --quiet --pidfile $SMBDPID
                        # Wait a little and remove stale PID file
                        sleep 1
                        if [ -f $SMBDPID ] && ! ps h `cat $SMBDPID` > /dev/null
                        then
                                # Stale PID file (nmbd was succesfully stopped),
                                # remove it (should be removed by smbd itself IMHO.)
                                rm -f $SMBDPID
                        fi
                fi

                log_end_msg 0

                ;;
        reload)
                # изменяем строку лога на подходящую нам
                log_daemon_msg "Reloading /etc/samba/smb-server.conf" "smbd only"

                start-stop-daemon --stop --signal HUP --pidfile $SMBDPID

                log_end_msg 0
                ;;
        restart|force-reload)
                $0 stop
                sleep 1
                $0 start
                ;;
        status)
                status="0"
                # указываем для testparm конфиг
                NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' $CONF 2>/dev/null`
                if [ "$NMBD_DISABLED" != "Yes" ]; then
                        status_of_proc -p $NMBDPID /usr/sbin/nmbd nmbd || status=$?
                fi
                if [ "$RUN_MODE" != "inetd" ]; then
                        status_of_proc -p $SMBDPID /usr/sbin/smbd smbd || status=$?
                fi
                if [ "$NMBD_DISABLED" = "Yes" -a "$RUN_MODE" = "inetd" ]; then
                        status="4"
                fi
                exit $status
                ;;
        *)
                # изменяем сообщение на подходящее нам
                echo "Usage: /etc/init.d/samba-server {start|stop|reload|restart|force-reload|status}"
                exit 1
                ;;
esac

exit 0

и

Показать init для FILES »

root@debian:~# cat /etc/init.d/samba-files
#!/bin/sh

### BEGIN INIT INFO
# Provides:          samba-files
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Should-Start:      slapd
# Should-Stop:       slapd
# Short-Description: start Samba daemons (nmbd and smbd)
### END INIT INFO

# изменим поле Provides в соответствии с именем скрипта,
#  иначе будет ругаться при добавлении в автозагрузку

# Defaults
RUN_MODE="daemons"

# Reads config file (will override defaults above)
# у себя я отключил данный конфиг, т.к. настраиваю все тут
#[ -r /etc/default/samba ] && . /etc/default/samba

# изменяем путь на тот, что в конфиге:
PIDDIR=/var/run/samba-files
# изменяем имена pid
NMBDPID=$PIDDIR/nmbd-smb-files.conf.pid
SMBDPID=$PIDDIR/smbd-smb-files.conf.pid
# задаем переменную, хранящую путь к конфигу
CONF=/etc/samba/smb-files.conf

# clear conflicting settings from the environment
unset TMPDIR

# See if the daemons are there
test -x /usr/sbin/nmbd -a -x /usr/sbin/smbd || exit 0

. /lib/lsb/init-functions

case "$1" in
        start)
                # изменяем строку лога на подходящую нам
                log_daemon_msg "Starting Samba for FILES and workgroup SAMBA"
                # Make sure we have our PIDDIR, even if it's on a tmpfs
                install -o root -g root -m 755 -d $PIDDIR

                # указываем в testparm конфиг
                NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' $CONF  2>/dev/null`
                if [ "$NMBD_DISABLED" != 'Yes' ]; then
                        log_progress_msg "nmbd"
                        # указываем для nmbd конфиг и задаем проверку pid
                        if ! start-stop-daemon --start --quiet --oknodo --pidfile $NMBDPID --exec /usr/sbin/nmbd -- -D -s $CONF
                        then
                                log_end_msg 1
                                exit 1
                        fi
                fi

                if [ "$RUN_MODE" != "inetd" ]; then
                        log_progress_msg "smbd"
                        # указываем для smbd конфиг  и задаем проверку pid
                        if ! start-stop-daemon --start --quiet --oknodo --pidfile $SMBDPID --exec /usr/sbin/smbd -- -D -s $CONF; then
                                log_end_msg 1
                                exit 1
                        fi
                fi

                log_end_msg 0
                ;;
        stop)
                log_daemon_msg "Stopping Samba for FILES and workgroup SAMBA"
                log_progress_msg "nmbd"

                start-stop-daemon --stop --quiet --pidfile $NMBDPID
                # Wait a little and remove stale PID file
                sleep 1
                if [ -f $NMBDPID ] && ! ps h `cat $NMBDPID` > /dev/null
                then
                        # Stale PID file (nmbd was succesfully stopped),
                        # remove it (should be removed by nmbd itself IMHO.)
                        rm -f $NMBDPID
                fi

                if [ "$RUN_MODE" != "inetd" ]; then
                        log_progress_msg "smbd"
                        start-stop-daemon --stop --quiet --pidfile $SMBDPID
                        # Wait a little and remove stale PID file
                        sleep 1
                        if [ -f $SMBDPID ] && ! ps h `cat $SMBDPID` > /dev/null
                        then
                                # Stale PID file (nmbd was succesfully stopped),
                                # remove it (should be removed by smbd itself IMHO.)
                                rm -f $SMBDPID
                        fi
                fi

                log_end_msg 0

                ;;
        reload)
                # изменяем строку лога на подходящую нам
                log_daemon_msg "Reloading /etc/samba/smb-files.conf" "smbd only"

                start-stop-daemon --stop --signal HUP --pidfile $SMBDPID

                log_end_msg 0
                ;;
        restart|force-reload)
                $0 stop
                sleep 1
                $0 start
                ;;
        status)
                status="0"
                # указываем для testparm конфиг
                NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' $CONF 2>/dev/null`
                if [ "$NMBD_DISABLED" != "Yes" ]; then
                        status_of_proc -p $NMBDPID /usr/sbin/nmbd nmbd || status=$?
                fi
                if [ "$RUN_MODE" != "inetd" ]; then
                        status_of_proc -p $SMBDPID /usr/sbin/smbd smbd || status=$?
                fi
                if [ "$NMBD_DISABLED" = "Yes" -a "$RUN_MODE" = "inetd" ]; then
                        status="4"
                fi
                exit $status
                ;;
        *)
                # изменяем сообщение на подходящее нам
                echo "Usage: /etc/init.d/samba-files {start|stop|reload|restart|force-reload|status}"
                exit 1
                ;;
esac

exit 0

Ну что ж, на данном этапе можно считать, что все готово к запуску и проверке....

Запуск и тестирование SAMBA на двух интерфейсах

Запускаем FILES в рабочей группе SAMBA, который должен запуститься только на интерфейсе с подсетью 192.168.0.1/24

root@debian:~# /etc/init.d/samba-files start
Starting Samba for FILES and workgroup SAMBA: nmbd smbd.
root@debian:~# ps aux | grep mbd
root      3430  0.0  0.5  10780  1976 ?        Ss   02:24   0:00 /usr/sbin/nmbd -D -s /etc/samba/smb-files.conf
root      3432  0.0  0.2  10388   872 ?        S    02:24   0:00 /usr/sbin/nmbd -D -s /etc/samba/smb-files.conf
root      3434  0.0  0.7  17832  2892 ?        Ss   02:24   0:00 /usr/sbin/smbd -D -s /etc/samba/smb-files.conf
root      3440  0.0  0.3  17832  1200 ?        S    02:24   0:00 /usr/sbin/smbd -D -s /etc/samba/smb-files.conf
root@debian:~# netstat -nap | grep mb
tcp        0      0 192.168.0.1:139         0.0.0.0:*               LISTEN      3434/smbd
tcp6       0      0 fe80::a00:27ff:fe7f:139 :::*                    LISTEN      3434/smbd
udp        0      0 192.168.0.255:137       0.0.0.0:*                           3430/nmbd
udp        0      0 192.168.0.1:137         0.0.0.0:*                           3430/nmbd
udp        0      0 0.0.0.0:137             0.0.0.0:*                           3430/nmbd
udp        0      0 192.168.0.255:138       0.0.0.0:*                           3430/nmbd
udp        0      0 192.168.0.1:138         0.0.0.0:*                           3430/nmbd
udp        0      0 0.0.0.0:138             0.0.0.0:*                           3430/nmbd
unix  2      [ ]         DGRAM                    11989    3430/nmbd
root@debian:~# smbclient -L //FILES -U%
params.c:OpenConfFile() - Unable to open configuration file "/etc/samba/smb.conf":
        No such file or directory
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
Domain=[SAMBA] OS=[Unix] Server=[Samba 3.5.6]

        Sharename       Type      Comment
        ---------       ----      -------
        samba-files     Disk
        IPC$            IPC       IPC Service (Samba 3.5.6)
Domain=[SAMBA] OS=[Unix] Server=[Samba 3.5.6]

        Server               Comment
        ---------            -------
        FILES                Samba 3.5.6
        LINUX-KURS

        Workgroup            Master
        ---------            -------
        SAMBA                FILES
root@debian:~# smbclient -L //SERVER -U%
params.c:OpenConfFile() - Unable to open configuration file "/etc/samba/smb.conf":
        No such file or directory
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
Connection to SERVER failed (Error NT_STATUS_CONNECTION_REFUSED)

Можно кричать УРА! SAMBA запустилась с нужным конфигом и только на нужном интерфейсе (??? зачем на 0.0.0.0), при подключении клиентом мы видим общие ресурсы ресурсы, а на WinXP видим нужный файловый сервер.

работа самба на сетевом интерфейсе eth1

Пробуем запустить второй экземпляр SAMBA - SERVER в рабочей группе WINDOWS, который должен запуститься только на интерфейсе с подсетью 10.0.0.10/24:

root@debian:~# /etc/init.d/samba-files stop
Stopping Samba for FILES and workgroup SAMBA: nmbd smbd.
root@debian:~# /etc/init.d/samba-server start
Starting Samba for SERVER and workgroup WINDOWS: nmbd smbd.
root@debian:~# ps aux | grep mbd
root      3681  0.1  0.5  10736  1932 ?        Ss   02:49   0:00 /usr/sbin/nmbd -D -s /etc/samba/smb-server.conf
root      3683  0.0  0.2  10388   864 ?        S    02:49   0:00 /usr/sbin/nmbd -D -s /etc/samba/smb-server.conf
root      3684  0.2  0.7  17832  2888 ?        Ss   02:49   0:00 /usr/sbin/smbd -D -s /etc/samba/smb-server.conf
root      3690  0.0  0.3  17832  1200 ?        S    02:49   0:00 /usr/sbin/smbd -D -s /etc/samba/smb-server.conf
root      3692  0.0  0.2   3328   780 pts/0    S+   02:49   0:00 grep mbd
root@debian:~# netstat -nap | grep mbd
tcp        0      0 10.0.0.1:139            0.0.0.0:*               LISTEN      3684/smbd
tcp6       0      0 fe80::a00:27ff:fe36:139 :::*                    LISTEN      3684/smbd
udp        0      0 10.0.0.255:137          0.0.0.0:*                           3681/nmbd
udp        0      0 10.0.0.1:137            0.0.0.0:*                           3681/nmbd
udp        0      0 0.0.0.0:137             0.0.0.0:*                           3681/nmbd
udp        0      0 10.0.0.255:138          0.0.0.0:*                           3681/nmbd
udp        0      0 10.0.0.1:138            0.0.0.0:*                           3681/nmbd
udp        0      0 0.0.0.0:138             0.0.0.0:*                           3681/nmbd
unix  2      [ ]         DGRAM                    12797    3681/nmbd
root@debian:~# smbclient -L //SERVER -U%
params.c:OpenConfFile() - Unable to open configuration file "/etc/samba/smb.conf":
        No such file or directory
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
Domain=[WINDOWS] OS=[Unix] Server=[Samba 3.5.6]

        Sharename       Type      Comment
        ---------       ----      -------
        win-serv        Disk
        IPC$            IPC       IPC Service (Samba 3.5.6)
Domain=[WINDOWS] OS=[Unix] Server=[Samba 3.5.6]

        Server               Comment
        ---------            -------
        SERVER               Samba 3.5.6
        WINXP

        Workgroup            Master
        ---------            -------
        WINDOWS              SERVER
root@debian:~# smbclient -L //FILES -U%
params.c:OpenConfFile() - Unable to open configuration file "/etc/samba/smb.conf":
        No such file or directory
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
Connection to FILES failed (Error NT_STATUS_CONNECTION_REFUSED)

Аналогично,  все прошло удачно.

Запуск samba на интерфейсе eth2

Стартуем оба экземпляра:

root@debian:~# /etc/init.d/samba-files start
Starting Samba for FILES and workgroup SAMBA: nmbd smbd.
root@debian:~# chmod 777 /shares/obmen/
root@debian:~# smbclient -L //FILES -U%
params.c:OpenConfFile() - Unable to open configuration file "/etc/samba/smb.conf":
        No such file or directory
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
Domain=[SAMBA] OS=[Unix] Server=[Samba 3.5.6]

        Sharename       Type      Comment
        ---------       ----      -------
        samba-files     Disk
        IPC$            IPC       IPC Service (Samba 3.5.6)
Domain=[SAMBA] OS=[Unix] Server=[Samba 3.5.6]

        Server               Comment
        ---------            -------
        FILES                Samba 3.5.6
        LINUX-KURS

        Workgroup            Master
        ---------            -------
        SAMBA                FILES
root@debian:~# smbclient -L //SERVER -U%
params.c:OpenConfFile() - Unable to open configuration file "/etc/samba/smb.conf":
        No such file or directory
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
Domain=[WINDOWS] OS=[Unix] Server=[Samba 3.5.6]

        Sharename       Type      Comment
        ---------       ----      -------
        win-serv        Disk
        IPC$            IPC       IPC Service (Samba 3.5.6)
Domain=[WINDOWS] OS=[Unix] Server=[Samba 3.5.6]

        Server               Comment
        ---------            -------
        SERVER               Samba 3.5.6
        WINXP

        Workgroup            Master
        ---------            -------
        WINDOWS              SERVER

и видим в своих рабочих группах наличие только заданных в конфигурации master-серверов.

Совсем забыл указать еще один нюанс. При установке samba создается так же файл /etc/network/if-up.d/samba, который запускает samba при старте сети. В нашем случае это не совсем актуально, т.к. для каждого интерфейса используется свой экземпляр SAMBA. Поэтому я вижу 2 выхода, если есть необходимость запускать/перезапускать SAMBA при изменении настроек сети: 1. Перезапускать SAMBA вручную, 2. Добавить команду запуска в /etc/network/interfaces, пример:

root@debian:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth1 eth2
iface eth1 inet static
        address 192.168.0.1
        netmask 255.255.255.0
        up /etc/init.d/samba-files start

iface eth2 inet static
        address 10.0.0.1
        netmask 255.255.255.0
        up /etc/init.d/samba-server start

Но сам файл   /etc/network/if-up.d/samba необходимо удалить.

Если используется winbind

Если SAMBA будет взаимодействовать с доменом, то необходимо будет использовать демон winbindd. Собственно, в статье все настройки для winbind учтены. Что необходимо сделать дополнительно:

  1. Модифицировать  init-скрипт /etc/init.d/winbind. Этот скрипт абсолютно идентичен /etc/init.d/samba и содержит те же недостатки и переделывается аналогично.
  2. При настройке сети необходимо учесть нюансы настроек файлов /etc/nsswitch.conf и других, указанных в статье SAMBA как член домена AD.

Резюме

На этом можно считать HOWTO завершенной. По аналогии, можно запустить демонов хоть на 3,4...20 сетевых интерфейсов, создав соответствующие файлы smb.conf и init скрипты. При обновлении SAMBA наши конфиги не должны пострадать. Но все же стоит после обновления проконтролировать, не заменился ли /etc/init.d/samba на оригинальный. Так же, при настройке данной схемы, я предпочитаю удалять оригинальные каталоги  /var/log/samba, /var/run/samba и /var/cache/samba, чтобы не возникало путаницы. Буду рад вашим комментариям и дополнениям! Удачных внедрений!

  С Уважением, Mc.Sim!




Теги: , , , , , ,

22 комментария к “HOWTO SAMBA на 2 интерфейса и 2 сети с разными smb.conf”

  1. Lefont
    26 июня, 2013 at 12:18
    1

    Огромное спасибо! Помогло:)

  2. Admin
    7 октября, 2013 at 20:17
    2

    На работе встала точно такая же задача. Прочитав эту статью, кинулся было реализовывать, но честно говоря, не понял зачем необходимо два конфига. Я настроил Samba для сети 192.168.1.10/24 (в моем случае) а на втором интерфейсе (192.168.2.10/24) включил проброс портов Samba (139,445 кажется) на первый интерфейс. Юзера не жалуются, вроде все работает.

    • 26 октября, 2013 at 12:07
      3

      В вашем случае, вообще можно было обойтись одним интерфейсом, задав 2 подсетки.
      2 конфига нужны для конфигурации, в которой один интерфейс смотрит в домен, а другой интерфейс смотрит в рабочую группу. Ну то есть когда сервер смотрит в две сети с разными конфигурациями.

  3. strateg
    22 января, 2014 at 06:44
    4

    Я правильно понимаю, что при условии корректных настроек 2-х дэмонов winbind можно реализовать авторизацию в 2-х доменах ? Кстати, уровень леса Windows (2008 или 2012), не будет ли создавать «граблей» winbind-у ?

    • 28 января, 2014 at 10:05
      5

      >Я правильно понимаю, что при условии корректных настроек 2-х дэмонов winbind можно реализовать авторизацию в 2-х доменах ?
      Верно
      > Кстати, уровень леса Windows (2008 или 2012), не будет ли создавать «граблей» winbind-у ?
      Я не имел каких-либо проблем при внедрении samba в домене до 2008R2.

  4. strateg
    30 января, 2014 at 05:19
    6

    Спасибо огромное за всё. За статью, и за доп. инфу. Все реализовалось как по маслу. С 2-мя доменами — чуть позже обкатаю. А Debian- реально, проще даже чем Убунта, когда поймешь логику системы.

  5. oooo1
    20 марта, 2014 at 23:48
    7

    Есть 1 интерфейс 192.168.0.254/255.255.255.0.
    Необходимо, чтобы было два получается псевдо сервера и каждый «принадлежал» своей группе, например:
    сервер mint — группа MSHOME;
    сервер server — группа WORK.
    А еще лучше, чтобы был одни сервер, и принадлежал он бы двум группам, то есть сервер mint, как в группе MSHOME, так и в WORK.
    Возможно таео сделать с Samba3 / Samba4 standalone server mode ?

    • 26 марта, 2014 at 00:20
      8

      Это некорректная конфигурация.

  6. oooo1
    27 марта, 2014 at 08:28
    9

    Почему некорректная ?

    • 27 марта, 2014 at 20:59
      10

      Для запуска службы создается сетевой сокет на определенном порту. Открыть 2 сокета на одном IP не получится. Можно указать samba, чтобы второй экземпляр работал на нестандартных портах, но тогда клиенты на смогут обращаться к данному экземпляру samba.

      • Missing
        7 ноября, 2014 at 13:21
        11

        interfaces = eth1 / eth2
        bind interfaces only = Yes

        По идее как раз и разруливают этот момент.

        • 18 декабря, 2014 at 14:21
          12

          все верно.
          Но на одном интерфейсе только один процесс может занять 139 порт. При запуске второго процесса произойдет ошибка.

  7. stend
    30 декабря, 2014 at 10:28
    13

    Вся проблема Samba — это сама Samba.
    Примерный перевод описания продукта (которое ранее было на главной странице) гласил следующее: продукт использующий протокол tcp/ip для эмуляции Active Directory, т.к. протоколы использующиеся в Active Directory проприеритарные и закрытые, то мы реализовали так, как понимаем как это должно работать и так, что бы это работало.
    Смахивает на подтычки и подпорки. Скажу откровенно, мне не нравится Samba. Особенно когда права Windows накладываются на Linux/Unix права файловой системы. Если стоял вопрос о настройке клиенту Samba сервера, то я всегда рекомендовал клиенту воздержаться, не парить себе мозг о внедрении данного продукта и купить Windows small business server.

    • 9 апреля, 2015 at 16:44
      14

      В определенный период моей карьеры, когда директор какой-нибудь фирмы видел цены продукции Mictosoft, он предпринимал все доступные меры, чтобы эти деньги не отдавать. )))
      В общем-то да, Microsoft проще в обслуживании, поэтому и стоит денег.

  8. joe
    4 апреля, 2016 at 20:00
    15

    Кто-то сталкивался с таким?

    Сделал всё по гайду, только менял SAMBA и WINDOWS на WORKGROUP, при запуске получаю окно, где нужно ввести пользователя и пароль.

    И да, поднимаю на Убунте

    • 3 августа, 2016 at 23:20
      16

      Ну вы бы конфиг показали и сети описали…

  9. grignix
    23 ноября, 2017 at 12:09
    17

    Раздачу разных папок/шар на разных IP адресах можно реализовать вот так:

    В samba начиная с версии 4.0.0 можно воспользоваться ключиком %i (ключ содержит IP адрес к которому подключился клиент)

    В smb.conf добавляем строчку
    Include = /etc/samba/host-ip-configs/%i.conf

    если один из интерфейсов имеет IP адрес 192.168.0.1 то создаем файлик /etc/samba/host-ip-configs/192.168.0.1.conf

    содержимое файла 192.168.0.1.conf

    [public]
    comment = Public Folder
    path = /opt/public
    public = yes
    force user = nobody
    guest ok = yes
    read only = yes

    • 10 февраля, 2019 at 10:06
      18

      Круто.
      Это очень удобно. В целом, samba в 4 версии много нового приобрела.

  10. Константин
    21 июля, 2020 at 12:17
    19

    Если оба экземпляра smb1/2.conf имеют одинаковые рабочие группы и взаимодействуют с одним доменом с помощью winbindd, не будет ли конфликтов между winbindd?

    • 25 июля, 2020 at 00:54
      20

      Я думаю, что в такой конфигурации сервис будет работать криво. Например, вангую что регулярно будут появляться ошибки доступа.
      Я так понимаю, что Вам нужно сделать 2 интерфейса, чтобы быстрей работало?
      Тогда посмотрите в сторону port-channel или bonding в терминологии Linux.

      • Константин
        6 августа, 2020 at 14:32
        21

        Есть ли в такой реализации ( по 2 экземпляра), возможность поднять 2 сервера самба на одной машине с авторизацией через 2 экземпляра winbind с разными netbios name, с разными ip, но с одинаковыми рабочими группами и с одним доменом? Либо какая то возможность поднять один сервер (по одному экземпляру smbd, nmbd, winbind), но так чтобы были разные ip и разные netbios name, или один ip но разные netbios name? Netbios alias не подходит, либо как то не правильно им пользуюсь, авторизация через winbind происходит только по одному из netbios name.

        • 27 августа, 2020 at 23:53
          22

          Если сервер с 2мя сетевыми картами и с разными IP (либо на сервере 2 виртуальных интерфейса с 2мя разными IP) и эти интерфейсы в разных подсетях, то вообще никаких проблем.
          Если будут 2 ip в одной подсети, то я предвижу проблемы на сетевом уровне, то есть отвечать сервер будет с какого-то одного интерфейса. Это будет проблемой в том числе и для сервисов SAMBA.
          Сходу я не могу представить, как явно задать, чтобы сервер отвечал на запросы с того же интерфейса, с которого пришел запрос.
          Может Вашу задачу можно решить другим путем?
          Для чего нужна такая конфигурация?

Написать комментарий