HOWTO SAMBA на 2 интерфейса и 2 сети с разными smb.conf
Доброго времени, читатели и гости моего блога. На днях довелось реализовать вот такую необычную схему на SAMBA, установленной из пакетного менеджера Debian squeezy. Делюсь данным решением с Вами.
Введение
Итак, стояла задача организовать обменник между двумя сетям не связанными между собой. При этом, объем файлов был довольно большой и использовать файловые хостинги или почту для данной задачи неудобно. Было решено поставить между сетями слабенькую машинку с большим объемом дискового пространства и попробовать настроить SAMBA. При этом, 2 конфига будут указывать на один и тот же каталог в файловой системе, это позволит видеть измененные/добавленные файлы обоим подсетям в онлайне. За основу статьи был взят материал из wiki samba.
Особенностью конфигурации samba для работы в нескольких сетях (читай – с разными конфигами) заключается в том, что необходимо хранить tdb – файлы раздельно для каждого запущенного экземпляра smbd/nmbd. Эти файлы содержат некоторую техническую информацию о работе демонов, такую как сопоставление пользователей, пароли и др. (более подобно о файлах tdb можно почитать в man smbd). Чтобы обеспечить хранение tdb-файлов в разных каталогах, можно пойти двумя путями:
- перекомпилировать SAMBA с указанием путей размещения файлов
- указать размещение – в конфигурационном файле 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
- Для настройки данной статьи необходимо наличие установленного пакета samba (и winbind, если используется доменная аутентификация), на момент написания статьи версия – 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
Итого, у нас получились следующие скрипты (модификации отмечены цветом):
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
и
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 видим нужный файловый сервер.
Пробуем запустить второй экземпляр 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)
Аналогично, все прошло удачно.
Стартуем оба экземпляра:
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 учтены. Что необходимо сделать дополнительно:
- Модифицировать init-скрипт /etc/init.d/winbind. Этот скрипт абсолютно идентичен /etc/init.d/samba и содержит те же недостатки и переделывается аналогично.
- При настройке сети необходимо учесть нюансы настроек файлов /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!
Огромное спасибо! Помогло:)
На работе встала точно такая же задача. Прочитав эту статью, кинулся было реализовывать, но честно говоря, не понял зачем необходимо два конфига. Я настроил Samba для сети 192.168.1.10/24 (в моем случае) а на втором интерфейсе (192.168.2.10/24) включил проброс портов Samba (139,445 кажется) на первый интерфейс. Юзера не жалуются, вроде все работает.
В вашем случае, вообще можно было обойтись одним интерфейсом, задав 2 подсетки.
2 конфига нужны для конфигурации, в которой один интерфейс смотрит в домен, а другой интерфейс смотрит в рабочую группу. Ну то есть когда сервер смотрит в две сети с разными конфигурациями.
Я правильно понимаю, что при условии корректных настроек 2-х дэмонов winbind можно реализовать авторизацию в 2-х доменах ? Кстати, уровень леса Windows (2008 или 2012), не будет ли создавать “граблей” winbind-у ?
>Я правильно понимаю, что при условии корректных настроек 2-х дэмонов winbind можно реализовать авторизацию в 2-х доменах ?
Верно
> Кстати, уровень леса Windows (2008 или 2012), не будет ли создавать «граблей» winbind-у ?
Я не имел каких-либо проблем при внедрении samba в домене до 2008R2.
Спасибо огромное за всё. За статью, и за доп. инфу. Все реализовалось как по маслу. С 2-мя доменами – чуть позже обкатаю. А Debian- реально, проще даже чем Убунта, когда поймешь логику системы.
Есть 1 интерфейс 192.168.0.254/255.255.255.0.
Необходимо, чтобы было два получается псевдо сервера и каждый “принадлежал” своей группе, например:
сервер mint – группа MSHOME;
сервер server – группа WORK.
А еще лучше, чтобы был одни сервер, и принадлежал он бы двум группам, то есть сервер mint, как в группе MSHOME, так и в WORK.
Возможно таео сделать с Samba3 / Samba4 standalone server mode ?
Это некорректная конфигурация.
Почему некорректная ?
Для запуска службы создается сетевой сокет на определенном порту. Открыть 2 сокета на одном IP не получится. Можно указать samba, чтобы второй экземпляр работал на нестандартных портах, но тогда клиенты на смогут обращаться к данному экземпляру samba.
interfaces = eth1 / eth2
bind interfaces only = Yes
По идее как раз и разруливают этот момент.
все верно.
Но на одном интерфейсе только один процесс может занять 139 порт. При запуске второго процесса произойдет ошибка.
Вся проблема Samba – это сама Samba.
Примерный перевод описания продукта (которое ранее было на главной странице) гласил следующее: продукт использующий протокол tcp/ip для эмуляции Active Directory, т.к. протоколы использующиеся в Active Directory проприеритарные и закрытые, то мы реализовали так, как понимаем как это должно работать и так, что бы это работало.
Смахивает на подтычки и подпорки. Скажу откровенно, мне не нравится Samba. Особенно когда права Windows накладываются на Linux/Unix права файловой системы. Если стоял вопрос о настройке клиенту Samba сервера, то я всегда рекомендовал клиенту воздержаться, не парить себе мозг о внедрении данного продукта и купить Windows small business server.
В определенный период моей карьеры, когда директор какой-нибудь фирмы видел цены продукции Mictosoft, он предпринимал все доступные меры, чтобы эти деньги не отдавать. )))
В общем-то да, Microsoft проще в обслуживании, поэтому и стоит денег.
Кто-то сталкивался с таким?
Сделал всё по гайду, только менял SAMBA и WINDOWS на WORKGROUP, при запуске получаю окно, где нужно ввести пользователя и пароль.
И да, поднимаю на Убунте
Ну вы бы конфиг показали и сети описали…
Раздачу разных папок/шар на разных 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
Круто.
Это очень удобно. В целом, samba в 4 версии много нового приобрела.
Если оба экземпляра smb1/2.conf имеют одинаковые рабочие группы и взаимодействуют с одним доменом с помощью winbindd, не будет ли конфликтов между winbindd?
Я думаю, что в такой конфигурации сервис будет работать криво. Например, вангую что регулярно будут появляться ошибки доступа.
Я так понимаю, что Вам нужно сделать 2 интерфейса, чтобы быстрей работало?
Тогда посмотрите в сторону port-channel или bonding в терминологии Linux.
Есть ли в такой реализации ( по 2 экземпляра), возможность поднять 2 сервера самба на одной машине с авторизацией через 2 экземпляра winbind с разными netbios name, с разными ip, но с одинаковыми рабочими группами и с одним доменом? Либо какая то возможность поднять один сервер (по одному экземпляру smbd, nmbd, winbind), но так чтобы были разные ip и разные netbios name, или один ip но разные netbios name? Netbios alias не подходит, либо как то не правильно им пользуюсь, авторизация через winbind происходит только по одному из netbios name.
Если сервер с 2мя сетевыми картами и с разными IP (либо на сервере 2 виртуальных интерфейса с 2мя разными IP) и эти интерфейсы в разных подсетях, то вообще никаких проблем.
Если будут 2 ip в одной подсети, то я предвижу проблемы на сетевом уровне, то есть отвечать сервер будет с какого-то одного интерфейса. Это будет проблемой в том числе и для сервисов SAMBA.
Сходу я не могу представить, как явно задать, чтобы сервер отвечал на запросы с того же интерфейса, с которого пришел запрос.
Может Вашу задачу можно решить другим путем?
Для чего нужна такая конфигурация?
Для отказоустойчивости. Есть 2 сервера свмба, на разных машинах, в одной подсети. С обеих раздаются шары, обе введены в домен, в какой то момент с одной из них что то случилось(например питание отрубилось). Есть возможность вытащить диск из мертвой и вставить в живую, на ней соответственно импортировать пул/файловую систему, в итоге поднять шару с первой машины на второй. Нужно чтобы клиентам при таком сценарии не пришлось отключать шару и подключать ее с другим именем.(Если использовать ip адреса то все работает, но хотелось бы использовать netbios name) Проблема в том что вторая живая машина введена в домен со своим netbios name и нужна какая то возможность чтобы одна машина была доступна(введена в домен) под 2 именами и доступ через прежние имена был к обеим шарам.
Для Вашего варианта идеальным решением будет DFS.
Просто синхронизируете данные между серверами, в DFS NAmespace указываете 2 имени, если одно недоступно – клиенты идут к другому и наоборот.
Спасибо, буду пробовать.
Еще вопрос про вход в домен с помощью net ads join, может быть подскажите, возможно ли как то в явном виде указать сетевой интерфейс или ip адрес с которого осуществлять вход или в любом случае будет браться первый подходящий.
Команда net использует конфигурацию из smb.conf.
А в smb.conf уже можно указывать нужный интерфейс.
Нет, так не работает.
Там указывается адрес для трафика смб. Вход в домен осуществляется через первый с которого доступен домен.
Не согласен, что не работает. net берет конфиг по-умолчанию, который лежит в /etc/samba/smb.conf (но в разных дистрибутивах может быть иной путь).
Возможно, в вашем случае – net подхватывает конфиг, в котором не указаны интерфейсы.
Если net выбирает неверный файл конфигурации, то можно ему насильно указать файл командой
-s|--configfile=
В крайнем случае, есть ключ -d 10, который позволит провести более глубокую диагностику.
Как раз с помощью “то можно ему насильно указать файл командой -s|–configfile=” и указываю нужный файл, домен и прочее оттуда подхватывается. А вот интерфейс берется первый подходящий.
Проверял: есть 2 интерфейса из одной подсети, отключал (и физически и софтово) интерфейс с адресом указанным в конф файле. Входить в домен получается по второму интерфейсу с другим адресом, который не прописан в конфе. Так же пробовал дергать интерфейс из конфа, когда уже в домен вошли, связь продолжалась. Возвращал на место, дергал второй (не из конфа), связь обрывалась.
“В крайнем случае, есть ключ -d 10, который позволит провести более глубокую диагностику.” – попробую.