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

Май 11th, 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!




Теги: , , , , , ,

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

  1. Lefont
    Июнь 26th, 2013 at 12:18
    1

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

  2. Admin
    Октябрь 7th, 2013 at 20:17
    2

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

    • Октябрь 26th, 2013 at 12:07
      3

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

  3. strateg
    Январь 22nd, 2014 at 06:44
    4

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

    • Январь 28th, 2014 at 10:05
      5

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

  4. strateg
    Январь 30th, 2014 at 05:19
    6

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

  5. oooo1
    Март 20th, 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 ?

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

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

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

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

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

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

      • Missing
        Ноябрь 7th, 2014 at 13:21
        11

        interfaces = eth1 / eth2
        bind interfaces only = Yes

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

        • Декабрь 18th, 2014 at 14:21
          12

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

  7. stend
    Декабрь 30th, 2014 at 10:28
    13

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

    • Апрель 9th, 2015 at 16:44
      14

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

  8. joe
    Апрель 4th, 2016 at 20:00
    15

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

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

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

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

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

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