Пример настройки NAT, DNS, Samba для небольшой сети
11.03.2006 | admin

На сегодняшний момент есть огромное количество различных статей по FreeBSD и по установке полноценного сервера для малого офиса на 10-50 рабочих станций, но, как правило, все они не так уж актуальны т.к. большинство их написано несколько лет назад. Имеются определенные претензии и к авторам,  к примеру 90% всех статей по установке mysql полностью дублируют друг друга и в этом случае абсолютно непонятно, если не ставится mysql (просит сокеты) после установки  и  начинающий специалист не зная как решить эту проблему обращается к другой статье и там возникает та же проблема.

По этой и еще по многим причинам я решил написать статью по установке полноценного сервера на FreeBSD 5.4  для малого офиса. Все сервисы, мы с вами будем поднимать  на одной машине. Для примера возьмем P4 -3.0Ghz; 1Gb памяти и  80Gb  HDD. Эту конфигурацию вполне потянет любая компания (ведь это будет их единственный сервак).

Хочу  добавить,  что  все  примеры  которые  я буду описывать являются полностью  рабочими.  Если  у  вас  что-то не получилось, это означает только то, что вы сами сделали, что-то не так.

Для нашей (вашей) компании нужны следующие сервисы:
1. NAT
2. DNS
3. Samba  (в  нашем  случае  она  будет  использоваться  для базы 1C. Выглядит экзотично, но крайне действенно)

От вас требуется: иметь FreeBSD 5.. и знать редактор vi или ee (я  лично использую  vi он более практичен). У нашего сервака есть 2 сетевые карты, одна смотрит в Интернет (она интеловская) fxp0 c адресом  81.222.156.16  и другая дешевая (реалтековская) rl0 с адресом 10.10.1.1 она смотрит в локал.

Ставим NAT (быстро и просто)

Для начала нам нужно довавить в ядро несколько опций

cd /sys/i386/conf  – заходим в каталог где лежит конфиг ядра
cp  GENERIC  CUSTOM – делаем копию нашего нового ядра называя ее CUSTOM

Ни  в  коем  случае не нужно пытаться изменять или добавлять новые параметры  в  файл GENERIC т.к. это не приведет не к чему хорошему.

Заменяем строку ident  GENERIC на ident CUSTOM (не нужно пытаться что-то  удалять из конфига ядра если вы не знаете что именно вы хотите удалить)

Опускаемся в самый конец большого конфига и добавляем в него строки:

- options IPFIREWALL (включаем поддержку самого firewall’a)
– options  IPFIREWALL_VERBOSE  (это  нужно,  что  бы  наш  firewall смог записывать логи)
– options   IPFIREWALL_VERBOSE_LIMIT=10   (данная   опция   ограничивает поподающие  в  firewall  логи,  это крайне полезная опция, она не даст сгенерироваться  большому  числу  пакетов  которое  может  привести  к переполнению  жесткого  диска,  и  вам  самим  можно будет более точно оценивать, что происходит, не капаясь в больших логах)
– options IPDIVERT (обязательна для работы NAT)
– options TCP_DROP_SYNFIN (эта опция нам не нужна, но ее включение будет гарантировать полное отбрасывание таких нехороших TCP пакетов с одновременно установленными флагами начала и завершения соединения, из собственной практики я знаю, что такие пакеты очень часто любят использовать хакеры)
– options ICMP_BANDLIM  (сильно  снижает  число  генерируемых  машиной сообщений  об  ошибках  TCP/IP, крайне полезная опция в отбиваниях DOS атак)

После конфигурирования нашего нового ядра сохраняем все изменения и идем дальше:

cd /usr/src/
make buildkernel KERNCONF=CUSTOM

Если в момент компиляции ядра у вас возникнут ошибки, то в этом случае  вернитесь к файлу CUSTOM и посмотрите правильно ли вы все написали.

make installkernel KERNCONF=CUSTOM (устанавливаем наше новое ядро)

В принципе обе команды можно обединить в одну

make kernel KERNCONF=CUSTOM

После сборки и установки нового ядра надо перезагрузиться

shutdown -r now

Теперь когда наше новое ядро собрано и установлено с поддержкой ipfw (ipfirewall) можно начинать ставить полноценный NAT.

vi /etc/rc.conf (открываем главный сетевой конфигурационный файл)

ищем в нем строки и задаем соответствующие параметры:

defaultrouter=»81.222.156.1″  (сюда вписываем адрес шлюза который дал вам ваш оператор)
ifconfig_fxp0=»inet 81.222.156.16  netmask  255.255.255.0″
(тут пишем ip адрес который дал вам ваш оператор и маску подсети)
ifconfig_rl0=»inet 10.10.1.1 netmask 255.255.255.0″
(тут пишем адрес будущего шлюза нашей локальной сети и соответственно маску)
ifconfig_fxp0_alias0=»inet  192.168.6.165  netmask 255.255.240.0″
(Эту строчку вы можете написать если вам нужно заходить, к примеру, на
страничку  вашей личной статистики и она с адресом 192.168.0.1 для этого
вам необходимо получить внутренний адрес и соответственно номер маски,
мы  назначаем  нашей интеловской сетевой карте два IP-адреса)
gateway_enable=»YES» (говорим, что наш сервер будет шлюзом в Интернет)
natd_enable=»YES» (включаем NAT)
natd_flags=»-a  81.222.156.16″  (говорим  демону  natd, что все пакеты
заворачиваются на адрес, который нам выдал наш провайдер)
firewall_enable=»YES» (включаем firewall)
firewall_type=»/etc/firewall.conf»   (говорим   firewall’у  где  будет
лежать конфигурационный файл  с правилами фильтрации)

Сохраняем все настройки и выходим из rc.conf

Запускаем скрипт который перезагрузит все наши сетевые настройки (добавлю,  что этого не следует делать с удаленной машины, к примеру, по ssh или по telnet)

/etc/netstart

На этом все приготовления для запуска нашего NAT сервера почти закончены. Нам  осталось только сконфигурировать правила firewall и можно запускать.

cd /etc
vi firewall.conf (создаем файл firewall.conf и заходим в него)

Пишем там следующее:

add  100  divert natd  all from 10.10.1.0/24 to any out recv rl0 xmit fxp0           (данная  опция  будет  маскировать все пакеты из внутренний сети 10.10.1.0/24 на внешний адрес 81.222.156.16)

add  200  divert  natd all from not 10.10.1.0/24 to 81.222.156.16 recv fxp0       (это правило будет делать в точности наоборот то, что делает первое).

И наконец пишем стандартное:

add 65000 allow all from any to any

Перезагружаемся и пингуем с нашей машины www.ru и с клиентской www.ru пинг есть! Значит все работает корректно!

Так  же  мы  можем  писать для каждого ip конкретное правило если надо будет кого-то отключить от интернета:

add 100 divert natd all from 10.10.1.6 to any out recv rl0 xmit fxp0
add 200 divert natd all from not 10.10.1.6 to 81.222.156.16 recv fxp0

И теперь нам только остаеться закомментировать строку (#) c которой начинается правило для конкретного ip.

DNS

Установка DNS сервера не сложнее установки ната. Наш DNS сервер поднимается  с целью только для вазможно дальнейшего использования его для  нашей будущей почты, ну и использовать свой DNS просто достаточно хорошее дело (в том числе и для простой экономии трафика), критики на счет  подобного  шага  могут много чего сказать, но надо понимать, что минусов от работы обычного форвардящего сервера ноль, т.к. нагрузка на него минимальная и никак не влияет на работу системы в целом, мы будем поднимать bind9, который более хорошо защищен от хакеров, чем его предшественники!

В  этой  статье мы рассмотрим только пример поднятия форвордящего DNSа он не будет обслуживать не одну зону и не будет являться приоритетным.(Вопрос поднятия dns сервера масштаба предприятия (хостинг – компании) мы  рассмотрим  в  следующей  статье.  Т.к. это дело очень серьезное и требует серьезной подготовки и работы.Пакет bind ставится по умолчанию в каждой версии FreeBSD.

Для начала нам надо, перейти в каталог:

cd /etc/namedb/

откроем главный конфигурационный файл нашего bind’a

vi  /named.conf

(не  нужно в нем ничего удалять, если вы хотите запретить какую-то опцию, то лучше всего просто поставить на начало строки  комментарий  вида  //  этого  более чем достаточно, все строки начинающиеся с  # это комментарии их для удобства работы с конфигом можно удалить, главное пользуясь редактором vi не поудаляйте лишнего.

Теперь  привиду  пример  самого простого файла named.conf  (он нам для наших целей более чем подходит)

acl «corpnets» { 10.10.1.0/24; 127.0.0.1; };
options {
directory       «/etc/namedb»;
pid-file        «/var/run/named/pid»;
dump-file       «/var/dump/named_dump.db»;
statistics-file «/var/stats/named.stats»;
//      listen-on       { 127.0.0.1; };
//      listen-on-v6    { ::1; };
forwarders {
81.222.32.252; 192.168.4.250;
};
query-source address * port 53;
};

zone «.» {
type hint;
file «named.root»;
};

zone «0.0.127.IN-ADDR.ARPA» {
type master;
file «localhost.rev»;
};

//zone «1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA» {
//      type master;
//      file «master/localhost-v6.rev»;
//};
//
//zone «1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.INT» {
//      type master;
//      file «master/localhost-v6.rev»;
//};

zone «example.net» {
type master;
file «db.example.net»;
};

//key «exampleorgkey» {
//        algorithm hmac-md5;
//        secret «sf87HJqjkqh8ac87a02lla==»;
//};

//zone «example.org» {
//      type master;
//      allow-update {
//              key «exampleorgkey»;
//      };
//      file «dynamic/example.org»;
//};

zone «example.com» {
type slave;
file «slave/example.com»;
};

zone «1.168.192.in-addr.arpa» {
type slave;
file «slave/1.168.192.in-addr.arpa»;
masters {
127.0.0.1;
};
};

Давайте в темпе блиц пробежимся по этому конфигу и посмотрим по порядку, что это все значит:

acl  «corpnets» { 10.10.1.0/24; 127.0.0.1; };  -эта опция задается для того  чтобы  наш nds сервер знал с каких адресов разрешено посылать на него  запросы,  вписываем  туда  нашу  подсеть  и  локальный адрес dns сервера.

options {
directory       «/etc/namedb»;
pid-file        «/var/run/named/pid»;
dump-file       «/var/dump/named_dump.db»;
statistics-file «/var/stats/named.stats»;
//      listen-on       { 127.0.0.1; };
//      listen-on-v6    { ::1; };
forwarders {
81.222.32.252; 192.168.4.250;
};
query-source address * port 53;
};

Эта  секция  под названием options говорит серверу в каких директориях расположены  файлы  bind’a  и  позволяет  настроить  в  какой  то мере глобальные параметры работы DNS.

Предписание  listen-on  предназначено  на  прослушивание  определенных сетевых  интерфейсов,  в принципе это предписание может выполнять туже функцию,  что  и  acl «corpnets», но в тоже время она более серьезна и лучше настраивется, к примеру можно для определенного адреса назначить определенный  порт  прослушивания  вот  пример:  listen-on port 5353 {10.10.1.0/24; }; или для каждого сетевого сетевого интерфейса отдельно можно  назначить  отдельно порт, вот пример:

listen-on {10.10.1.2 port 5353; 10.10.1.3 port 1053; };

listen-on-v6 предназначена соответственно для IPv6.

forwarders {
81.222.32.252; 192.168.4.250;
};

Эта  опция  для  нас  самая главная в нашем сервере DNS она говорит на какие именно сервера будет форфордить наш DNS сервер, тут мы указываем DNS сервера нашего провайдера.

query-source  address  *  port  53;  -это  предписание  говорит нашему серверу,  что  он  должен  работать  на  53  порту. Данное предписание отключено по умолчанию, его включение полезно при работе firewall’a

zone «.» {
type hint;
file «named.root»;

Оператор  zone  «.»  говорит,  что наш DNS сервер должен читать адреса корневых  указателей  из  файла  named.root. (Ранее в 4-м bind’e нужно было   ставить   указатель   in   в  этом  операторе,  но  теперь  оно проставляется на программном уровне)

//key «exampleorgkey» {
//        algorithm hmac-md5;
//        secret «sf87HJqjkqh8ac87a02lla==»;
//};
//zone «example.org» {
//      type master;
//      allow-update {
//              key «exampleorgkey»;
//      };
//      file «dynamic/example.org»;
//};

Это  не  шифрованная  зона  как  можно  себе  представить,  а зона для удаленного администрирования с помощью rndc (я подробно опишу работу с этой  утилитой  в  следующей статье, замечу, что в стародавние времена использовался  ndc  и только сигналы, это были версии более ранние чем 8.2).

zone «example.com» {
type slave;
file «slave/example.com»;
};

Стандартное  обозначение зоны.  Эта страка ставиться по умолчанию, приинсталляции binda.

zone «1.168.192.in-addr.arpa» {
type slave;
file «slave/1.168.192.in-addr.arpa»;
};

И
zone «0.0.127.IN-ADDR.ARPA» {
type master;
file «localhost.rev»;
};

А  эти  зона  используется  для Loopback  -они используется хостом для перенаправления пакетов самому себе, в нашем случае используется адрес для  loopback-сети  1.168.192  это  адрес  без  последнего актека, это специально  сделано  для обратных поисков. Поскольку никто не отвечает за  эту  сеть, каждый отвечает за нее самостоятельно. Можно обойтись и без  этой  зоны,  и  DNS сервер будет работать, однако поиск по адресу 127.0.0.1  не  даст результатов, по скольку корневой DNS сервер не был настроен  таким образом, чтобы отображать адрес 127.0.0.1 в конкретное имя. Чтобы избежать сюрпризов, это отображение мы должны обеспечить.

Идем дальше, и создадим несколько файликов для нашего bind’a

cd /usr/namedb
vi db.example.net

Напишим в нем следующее, и разберем, что чего значит:

$TTL 86400
example.net.    IN      SOA     ns.example.net. root.example.net. (
2001220201      ; Порядковый номер
3h                      ; Обновление через 3 часа
1h                       ;  Повторение  попытки через 1 час
1w                      ; Устаревание через 1 неделю
1h )                     ;Отрицательное TTL в 1 час
IN      NS      ns.example.net.
IN      MX      root.example.net.
ns         IN      A       10.10.1.1
sun        IN      A       10.10.1.1
moon       IN      A       10.10.1.1
maan       IN      CNAME   moon

TTL  -позволяет  задавать  время  жизни  для всех записей в файле. DNS сервер  передает  указанное значение TTL вместе с ответами на запросы, что  позволяет другим серверам DNS кэшировать полученную информацию на указанный интервал времени.

SOA  запись  показывает,  что  наш  DNS сервер является самым надежным источником  информации  в  пределах этой зоны. Наш DNS сервер является авторитативным  для  зоны  example.net  по причине наличия SOA записи. Перед  SOA  есть  буквы  IN  обозначают  Internet. Это один из классов данных, существуют и другие но они менее распространены.

NS   Мы  добавляем  по  одной  NS записи на каждый DNS сервер, который является авторитативным для нашей зоны.

MX это строго почтовая запись.

Один  файлик  мы  создали,  выходим  и  сохраняем его, теперь создадим второй:

в тойже директории

vi localhost.rev

$TTL    3600
@       IN      SOA     gv5.evrazia.com. root.gv5.evrazia.com.  (
20040603        ; Serial
1h            ; Refresh
1h             ; Retry
1w            ; Expire
1h )          ; Minimum
IN      NS      gv5.evrazia.com.
1       IN      PTR     localhost.evrazia.com.

Вот так он может выглядить.

Тут  появилась такая запись как PTR -она используеться для отображение адресов в имена узлов для сети. Для этого отображения используеться RR записи которые носят название PTR.

Сохраняемся и выходим.

Теперь осталось создать example.com в каталоге slave

cd /etc/namedb/slave/
vi example.com

$TTL 86400
@       IN      SOA     ns.example.com. admin.example.com. (
2001220200
2h
1h
1w
1h)
IN      NS      ns.example.com.
100     IN      PTR     admin1.example.com.
101     IN      PTR     admin2.example.com.

Сохраняемся и выходим.

Все, что нам осталось теперь сделать, это проверить наш DNS и изменить resolv.conf

Пишем в командной строке:

dig @127.0.0.1 www.ru

в ответ мы должны получить буквально следующее:

; <<>> DiG 9.3.1 <<>> @127.0.0.1 www.ru
; (1 server found)
; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18557
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; QUESTION SECTION:
;www.ru.                                IN      A
;; ANSWER SECTION:
www.ru.                 85464   IN      A       194.87.0.50
;; AUTHORITY SECTION:
www.ru.                 85464   IN      NS      ns.demos.su.
www.ru.                 85464   IN      NS      ns1.demos.net.
;; ADDITIONAL SECTION:
ns.demos.su.            19313   IN      A       194.87.0.9
ns.demos.su.            19313   IN      A       194.87.0.8
ns1.demos.net.          20039   IN      A       194.58.241.26
;; Query time: 4 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Oct 17 21:11:04 2005
;; MSG SIZE  rcvd: 140

Если ответа нет, то в этом случае идем смотреть /etc/namedb/named.conf

Потому  что  именно  в нем может заключаться ошибка. Если вы точно все сделали    правильно,    то    можно   глянуть   логи,   набрав

cat /var/log/messages и посмотреть что пишет bind.

Если  ответ  есть то ваш сервер может спокойно обслуживать вашу сетку, тут проблем не должно быть, нам осталось только настроить саму FreeBSD на использование вашего DNS’a  делаем следующее:

vi /etc/resolv.conf

комментируем  #  там  сервера  вашего провайдера и вписываем наш, ну и пока у вас нет почты и web’a пишим любой домен!

domain example.com
nameserver 127.0.0.1

Все, DNS полнолстью готов. Вы можите и не создавать зоны example.net и example.com  в  этом случае ваш DNS все равно будет работать, я просто хотел на примере этих зон показать вам, что чего там обозначает.

Samba

Самба  является  наверное  одним  из  самых простых, но в тоже время и самых  полезным  сетевым  сервисом.  Ведь  у  нее  даже  есть свой web интерфейс,  правда им мало кто пользовался, т.к. на него можно попасть только с локалхоста, а для этого надо ставить GNOME или KDE.

Не много о данном продукте (поклонником которого я являюсь):

Samba  – это  не  коммерческий проект с открытом исходным кодом начатый Эндрю  Триджеллом.  Эта  система  обеспечивает UNIX-машине возможность воспользоваться  всеми  преимуществами  совместного  доступа  к файлам Windows,  включая  появление  машины  в  списке  ресурсов сети, защиту подключения  на  основе  доменов  и регистрации пользователей, и также поддержку  сетевых  служб  печати.  Также  в комплект самбы входит ряд инструментальных   средств,  которые  обеспечивают  выполнение  многих административных функций сервера Windows. Огромным плюсом является то, что  после  установки портированной реализации файловой системы smbfs, получается  полный  набор  программного  обеспечения,  дающий машине с FreeBSD   в   сетевой   среде   Windows  те  же  самые  функциональные возможности, что и настоящей Windows машине.

Уникальность  Samb’ы  в  том, что ее команды посылаются поверх базовых сетевых  протоколов,  таких  как IPX, NetBEUI, Banyan VINES, DECnet (я прекрастно   понимаю,   что  скорее  всего  они  не  знакомы  рядовому пользователю).  Эти протоколы работают на сетевом уровне стека, на том же  уровне,  что  и  IP  и  поэтому не ограничены только транспортными протоколами  стека  TCP/IP. Однако чаще всего в качестве транспортного протокола  SMB используеться реализация NetBIOS по верх IP, работающая с  компонентами  как  TCP,  как и UDP. Именно это и обеспечивает самбе полную интеграцию в сети Windows.

Как  правило  самба  ставится  вместе  с  системой, но если вы ее при инсталляции не поставили, то можно через порты

cd /usr/port/net/samba
make all install && clean

вот  и  все,  что  нужно  сделать,  самба  готова  к работе. Я не буду особенно углубляться в настройку smb, так-как наша задача, это просто, добиться  того, что виндовое семейство будет видеть расшариную папку в которой  будет  валяться  db  1С  .   В принципе теоритически их можно прикрутить к mysql, но данную операцию я не проделывал.

После того как самба установилась, мы проделываем  элементарные операции

cd /usr/local/etc
cp smb.conf.default smb.conf
vi smb.conf

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

[global]
workgroup = ваша рабочая группа
server string = Samba Server
hosts   allow  =  10.10.1.2  10.10.1.3   ip  тех  кто  имеет  доступ
load  printers  =  yes   разрешает  использование принтера (его надо настраивать)
log file = /var/log/log.%m логи
max log size = 50 максимальный обем логов
security  =  user  безопасность на уровне user можно и на domain (но вам это не нужно)
encrypt passwords = yes Шифрование паролей (опция для вас не нужная)
socket  options  =  TCP_NODELAY  Очень  сильно  увеличивает скорость работы
dns proxy = no Эта опция только если вы ставите AD
client code page=866 Поддержка кирилици

[homes]
comment = Home Directories
browseable = no
writeable = yes

[tmp]
comment = Temporary file space
path = /shared
read only = no
public = yes

В  директории  [tmp] мы видим строку patch =/shared   shared эта папка которую  вы и будете видеть с клиентской машины, можно создать любую в любом месте и назначить ей соответствующие права, к примеру:

mkdir /usr/local/1C

chmod  777  /usr/local/1C   -теперь с этим каталогом можно делать все, что угодно и доступен он будет только с определенных машин.

Автор: Andrey

Просмотров новости: 4 199  <, , , , >


-->