19 ноября 2010

Сервер для небольшого офиса "всё в одном" на FreeBSD 8.1

Основные функции:
- Firewall, DNS forwarder, NTP для локалки
- SMTP/POP3
- Прокси (SQUID)
- Firebird
- Samba как член домена
- ну и по мелочи - бесперебойник, Apache, FTP, MySQL...

Многое из описанного здесь почерпнуто на бескрайних просторах тырнета, за что ему огромное спасибо. Ни на какой копирайт я не претендую. Мои специальные благодарности: lissyara.su, opennet.ru. Подразумевается, что читатель знает основы того, о чем идет речь, поэтому особых комментариев нет. Если Вы решили делать сервер по этой статье, ее обязательно надо сначала прочитать полностью. Порядок установки может иметь значение, я ставил и настраивал всё в том порядке, в каком описано в статье.
Разбиение диска:
/	2gb
swap	32gb
/var	64gb
/tmp	2gb
/usr	128gb
/c	остальное
Интерфейсы:
re0	192.168.0.170/24
	192.168.0.171/24 (alias, так как раньше было 2 разных сервера, а перенастраивать всех клиентов неохота)
fxp0	хх.хх.хх.хх/30
Имена:
fqdndomain.tld			внешний, FQDN
server.localdomain.local	внутренний, Active Directory

Подготовка

Пересоберем ядро с нужными опциями:
# cd /sys/i386/conf
# cp GENERIC MYDOMAIN
# ee MYDOMAIN
ident		MYDOMAIN
options		IPFIREWALL
options		IPDIVERT
options		VESA		# возможность работать в графических и VESA режимах
options		VGA_WIDTH90
options		SC_PIXEL_MODE

# cd /usr/src
# make kernel KERNCONF=MYDOMAIN
# reboot

Настроим доступ по SSH:
# ee /etc/ssh/sshd_config
PermitRootLogin yes		# так делать не рекомендуется!
PasswordAuthentication yes
Subsystem  sftp  /usr/libexec/sftp-server
В качестве клиента я пользую Mindterm. Чтобы он понимал KOI8-R, надо чуть подправить ему конфиг:
C:\Documents and Settings\admin\mindterm\192.168.0.170.mtp
encoding=koi8-r

Русификация, мне она нужна для корректного отображения русских имен файлов в самбе:
# ee /etc/ttys
ttyv0  "/usr/libexec/getty Pc"  cons25r on  secure
ttyv1  "/usr/libexec/getty Pc"  cons25r on  secure
ttyv2  "/usr/libexec/getty Pc"  cons25r on  secure
ttyv3  "/usr/libexec/getty Pc"  cons25r on  secure
ttyv4  "/usr/libexec/getty Pc"  cons25r on  secure
ttyv5  "/usr/libexec/getty Pc"  cons25r on  secure
ttyv6  "/usr/libexec/getty Pc"  cons25r on  secure
ttyv7  "/usr/libexec/getty Pc"  cons25r on  secure
# vipw
root:.....:0:0:russian:0:0:Charlie &:/root:/bin/csh
# ee /root/.cshrc
setenv EDITOR		ee	# потому что vi для фанатов/изврощенцев
setenv	LC_MESSAGES	“C”	# как-то несерьезно видеть на сервере 
setenv	LC_NUMERIC	“C”	# русские меню и сообщения ;)
setenv	LC_MONETARY	“C”
setenv	LC_TIME		“C”

Пока сервер в настройке (висит за другим гейтом):
# ee /etc/make.conf
FETCH_CMD=wget 			# скорее всего, это не понадобится
FETCH_ENV= FTP_PROXY=http://адрес:порт/
FETCH_ENV= HTTP_PROXY=http://адрес:порт/
# setenv HTTP_PROXY 192.168.0.70:3128
# setenv FTP_PROXY 192.168.0.70:3128
Не забудь потом убрать!

Обновление портов:
# portsnap fetch
# portsnap extract

Midnight Commander:
# cd /usr/ports/misc/mc
# make install
# rehash

Пригодится:
# cd /usr/ports/archivers/rar
# make install

Firebird SQL Server

От имени рута он не ставится, поэтому надо дать права на /usr/ports другому юзеру и выполнить установку под ним.
В процессе будет много переключений на рута с запросом пароля.
# chmod –R g+w /usr/ports
# su admin
# cd /usr/ports/databases/firebird20-server
# make install

Почта

POP3, SMTP с авторизацией. Почта хранится в /c/mail/virtual/user@host/Maildir/. Аккаунты в базе MySQL.
Логика работы MTA:
- с localhost принимается всё;
- прошедшие авторизацию, могут слать со своего ящика на любой;
- не прошедшие авторизацию, подвергаются тщательным проверкам (dns-bl, blacklist и пр.), 
  после чего могут слать только на имеющиеся локальные ящики;
- graylisting не используется, ибо ацтой.
Кстати, приведенная ниже настройка SMTP позволила навсегда забыть, что такое вирусы в почте.

Для начала отключение опций, относящихся к sendmail:
# touch /etc/periodic.conf
# ee /etc/periodic.conf
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"

# cd /usr/ports/security/openssl
# make install
Если планируется SAMBA, то нужна опция MD2.
# rehash

# cd /usr/ports/databases/mysql51-server
# setenv WITH_CHARSET cp1251
# setenv WITH_OPENSSL yes
# setenv BUILD_OPTIMIZED yes
# make install
# rehash
# cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf
# ee /etc/my.cnf 
[mysqld] 
log=/var/log/mysql.log
bind-address=127.0.0.1

# touch /var/log/mysql.log
# chown mysql:mysql /var/log/mysql.log
# /usr/local/etc/rc.d/mysql-server start
# cat /var/log/mysql.log

# cd /usr/ports/databases/mysql51-scripts
# make install
# rehash
# mysql_secure_installation

# cd /usr/ports/security/cyrus-sasl2
# make install
# rehash
# touch /usr/local/lib/sasl2/smtpd.conf
# ee /usr/local/lib/sasl2/smtpd.conf 
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: CRAM-MD5 DIGEST-MD5 PLAIN LOGIN
sql_engine: mysql
sql_user: postfix
sql_passwd: postfix
sql_hostname: 127.0.0.1
sql_database: mailbase
sql_select: select password from accounts where login='%u'
sql_verbose: no
log_level: 1 

# cd /usr/ports/security/courier-authlib
# make install
# rehash
# ee /usr/local/etc/authlib/authdaemonrc 
authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"
LOGGEROPTS="" 

Создадим пользователя virtual:
# pw group add virtual -g 1984
# pw user add virtual -g virtual -s /sbin/nologin -u 1984
# mkdir /c/mail
# chown virtual:virtual /c/mail/
# chmod -R 777 /c/mail/
# ee /usr/local/etc/authlib/authmysqlrc 
MYSQL_SERVER            localhost
MYSQL_USERNAME          postfix
MYSQL_PASSWORD          postfix
MYSQL_SOCKET            /tmp/mysql.sock
MYSQL_PORT              3306
MYSQL_OPT               0
MYSQL_DATABASE          mailbase
MYSQL_USER_TABLE        accounts
MYSQL_CLEAR_PWFIELD     password
MYSQL_UID_FIELD         '1984'
MYSQL_GID_FIELD         '1984'
MYSQL_LOGIN_FIELD       login
MYSQL_HOME_FIELD        '/c/mail'
MYSQL_NAME_FIELD        realname
MYSQL_MAILDIR_FIELD     mailbox
MYSQL_QUOTA_FIELD       quota
MYSQL_WHERE_CLAUSE      active='1' 
# shutdown -r now

Убедимся:
# cat /var/log/maillog | grep “authdaemon”
Oct 20 12:08:52 authdaemond: modules="authmysql", daemons=5
Oct 20 12:08:52 authdaemond: Installing libauthmysql
Oct 20 12:08:52 authdaemond: Installation complete: authmysql

Сервер pop3:
# cd /usr/ports/mail/courier-imap
# make install
# ee /usr/local/etc/courier-imap/pop3d
PIDFILE=/var/run/pop3d.pid
MAXDAEMONS=40
MAXPERIP=4
POP3AUTH="CRAM-MD5 PLAIN LOGIN CRAM-SHA1 CRAM-SHA256"
POP3AUTH_ORIG="CRAM-MD5 PLAIN LOGIN CRAM-SHA1 CRAM-SHA256"
POP3AUTH_TLS=""
POP3AUTH_TLS_ORIG=""
POP3_PROXY=0
PORT=110
ADDRESS=0
TCPDOPTS="-nodnslookup -noidentlookup"
LOGGEROPTS="-name=pop3d"
POP3DSTART=YES
MAILDIRPATH=Maildir

# reboot
Проверим:
# sockstat | grep 110
root     couriertcp 924   3  tcp4   *:110       *:*

Сервер SMTP:
# cd /usr/ports/mail/postfix
# make install
Опции: PCRE, SASL2, TLS, MYSQL, VDA
# ee /usr/local/etc/postfix/main.cf
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
html_directory = /usr/local/share/doc/postfix
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = /usr/local/share/doc/postfix
queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix

alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases
home_mailbox = Maildir/

mail_owner = postfix
setgid_group = maildrop
default_privs = nobody

myhostname = fqdndomain.tld			# оба этих имени должны резольвится извне,
mydomain = fqdndomain.tld			# иначе есть хороший шанс быть посланным
smtpd_banner = $myhostname ESMTP PREVED		# приветствие сервера
inet_interfaces = all				# слушать везде
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8
relay_domains = $mydestination

default_destination_recipient_limit = 10	# глобальные пользовательские ограничения
message_size_limit = 32000000
virtual_mailbox_limit = 64000000

transport_maps=mysql:/usr/local/etc/postfix/transport.cf
virtual_mailbox_base = /
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mailbox.cf
virtual_uid_maps = static:1984			# это наш пользователь virtual
virtual_gid_maps = static:1984

smtpd_disable_vrfy_command = yes
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
smtpd_reject_unlisted_sender = yes
smtpd_reject_unlisted_recipient = yes
show_user_unknown_table_name = no
local_recipient_maps = mysql:/usr/local/etc/postfix/mailbox.cf

smtpd_sasl_type = cyrus
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain =
smtpd_sasl_authenticated_header = no
smtpd_sender_login_maps = mysql:/usr/local/etc/postfix/boxowner.cf

smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch,
                        permit_sasl_authenticated,
                        permit_mynetworks,
                        reject_unauth_destination
smtpd_recipient_restrictions = permit_sasl_authenticated,
                        permit_mynetworks,
                        reject_unauth_destination
smtpd_helo_restrictions = permit_sasl_authenticated,
                        permit_mynetworks,
                        reject_invalid_hostname,
                        reject_unknown_hostname,
                        reject_non_fqdn_hostname
smtpd_client_restrictions = permit_sasl_authenticated,
                        permit_mynetworks,
			check_client_access hash:/usr/local/etc/postfix/access,
                        reject_unknown_client,
			check_client_access regexp:/usr/local/etc/postfix/access2,
                        reject_rbl_client dnsbl.sorbs.net,
			reject_rbl_client dul.dnsbl.sorbs.net,
                        reject_rbl_client bl.spamcop.net,
                        reject_rbl_client dnsbl.njabl.org,
                        reject_rbl_client cbl.abuseat.org,
                        reject_rbl_client dul.ru

Исключения из правил на основе адресов (есть еще хорошие люди, у которых админят лохи):
# touch /usr/local/etc/postfix/access
# ee /usr/local/etc/postfix/access
vasya.pupkin.local	OK
81.17.0.8 	    	OK
80.78.114.7	    	REJECT
# postmap /usr/local/etc/postfix/access

Исключения из правил на основе регэкспов (гасим большинство диалапщиков):
# touch /usr/local/etc/postfix/access2
# ee /usr/local/etc/postfix/access2 
/dsl.*\..*\..*/i            553 Invalid host
/[ax]dsl.*\..*\..*/i        553 Invalid host
/pool.*\..*\..*/i           553 Invalid host
/pppo.*\..*/i               553 Invalid host
/ppp.*\..*\..*/i            553 Invalid host
/dial.*\..*/i               553 Invalid host
/cable.*\..*\..*/i          553 Invalid host
/gprs\..*\..*/i             553 Invalid host
/dynamic.*\..*/i            553 Invalid host
/static.*[0-9].*\..*\..*/i  553 Invalid host
/broadband.*\..*/i          553 Invalid host
/gateway.*\..*\..*/i        553 Invalid host
/host[0-9].*\..*\..*/i      553 Invalid host
/host\-[0-9].*\..*\..*/i    553 Invalid host
/sub[0-9].*\..*\..*/i       553 Invalid host
/net[0-9].*\..*\..*/i       553 Invalid host
/([0-9]{,4}\-[0-9]{,4}\-[0-9]{,4}).*/i  553 Invalid host
/([0-9]{,4}\.[0-9]{,4}\.[0-9]{,4}).*/i  553 Invalid host
/ip[0-9][0-9].*\..*\..*/i   553 Invalid host
/[0-9]8,12.*\..*\..*/i      553 Invalid host
/ip\-[0-9].*\..*\..*/i      553 Invalid host 

# postmap /usr/local/etc/postfix/access2 

# newaliases
# postfix check

# touch /usr/local/etc/postfix/mailbox.cf
# ee /usr/local/etc/postfix/mailbox.cf 
host = localhost
user = postfix
password = postfix
dbname = mailbase
query = select mailbox from accounts where email='%s' and active='1'

# touch /usr/local/etc/postfix/boxowner.cf
# ee /usr/local/etc/postfix/boxowner.cf 
host = localhost
user = postfix
password = postfix
dbname = mailbase
query = select login from accounts where email='%s' and active='1' 

# touch /usr/local/etc/postfix/transport.cf
# ee /usr/local/etc/postfix/transport.cf 
host = localhost
user = postfix
password = postfix
dbname = mailbase
query = select transport from transport where location='%s' 

# mysql -u root -p
mysql> create database mailbase;
mysql> use mailbase;
mysql> create table accounts (
    -> login varchar(32) unique not null, 
    -> password varchar(32) not null, 
    -> email varchar(128) unique not null, 
    -> realname varchar(128), 
    -> mailbox varchar(256) not null, 
    -> quota varchar(16) not null,
    -> active varchar(1) not null);
mysql> create table transport (
    -> location varchar(128) unique not null,
    -> transport varchar(128) not null default `virtual:’);
mysql> commit;
mysql> insert into accounts values (
    -> 'testuser',
    -> 'testpassword',
    -> 'testuser@fqdndomain.tld',
    -> 'The Best User',
    -> '/c/mail/virtual/testuser@fqdndomain.tld/Maildir/',
    -> '100000000',
    -> '1');
mysql> insert into transport values (
    -> 'fqdndomain.tld',
    -> 'virtual:');
mysql> commit;
mysql> grant select on mailbase.* to postfix identified by 'postfix';
mysql> commit;
mysql> \q

# reboot

Apache, PHP

# cd /usr/ports/www/apache13-modssl
# make install
# ee /usr/local/etc/apache/httpd.conf 
ServerType standalone
ServerRoot "/usr/local"
PidFile /var/run/httpd.pid
ScoreBoardFile /var/run/httpd.scoreboard
Timeout 300
KeepAlive On
MaxKeepAliveRequests 50
KeepAliveTimeout 15
MinSpareServers 2
MaxSpareServers 5
StartServers 2
MaxClients 50
MaxRequestsPerChild 0
Port 80
User www
Group www
ServerAdmin postmaster@fqdndomain.tld
ServerName fqdndomain.tld
DocumentRoot "/c/www/data"
LoadModule php5_module libexec/apache/libphp5.so
AddModule mod_php5.c
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
DirectoryIndex index.php index.html 

# mkdir /c/www
# chown www:www /c/www
# chmod 755 /c/www

# cd /usr/ports/lang/php5
# make install
С опциями: CGI, LCI, APACHE, SUHOSIN
# cd /usr/local/etc
# cp php.ini-production php.ini

# cd /usr/ports/lang/php5-extensions
# make clean
# make config
# make install
Опции по вкусу, если что, всегда можно переставить.

SQUID

# cd /usr/ports/www/squid31
# make install
# mkdir /c/cache
# chown squid:squid /c/cache/
# ee /usr/local/etc/squid/squid.conf
include /usr/local/etc/squid/acl.conf
http_port 3128
hierarchy_stoplist cgi-bin ?
cache_dir ufs /c/cache 16384 16 256
maximum_object_size 1024 MB
access_log /c/cache/access.log squid
coredump_dir /c/cache
ftp_list_width 48
ftp_passive on
ftp_sanitycheck off
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern .		0	20%	4320
quick_abort_min 0 KB
quick_abort_max 0 KB
quick_abort_pct 95
visible_hostname fqdndomain.tld
forwarded_for transparent
httpd_suppress_version_string on 

Чтобы не засирать конфиг, вынес контролы в отдельный файл:
# ee /usr/local/etc/squid/acl.conf 
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
http_access allow manager localhost
http_access deny manager
http_access deny to_localhost

acl pass url_regex .*openstreetmap.*
acl pass url_regex .*bannerClickStatistic.*
acl pass url_regex .*bannerfilter.*
acl pass url_regex .*checkbanner.*
http_access allow pass

acl lns url_regex http:\/\/line4auto\.ru.*			# достали эти форумные линейки
acl lns url_regex http:\/\/www\.autometric\.ru\/lines\/.*
acl lns url_regex http:\/\/forum-lines\.ru\/rez\/.*
acl lns url_regex http:\/\/nomer\.avtobeginner\.ru\/.*
acl lns url_regex http:\/\/www\.klavogonki\.ru\/sign\/.*
acl lns url_regex http:\/\/s-u\.su\/s\/.*
acl lns url_regex http:\/\/lines\..*
acl lns url_regex http:\/\/line\..*
acl lns url_regex http:\/\/www\.forum-lines\.ru\/rez\/.*
acl lns url_regex http:\/\/www\.minidog\.info\/lines\/.*
acl lns url_regex http:\/\/puzyaka\.ru\/metric.*

acl cnt url_regex .*\.spylog\.com\/cnt.*			# и счётчики
acl cnt url_regex .*\.hotlog\.ru
acl cnt url_regex .*top100\/.*
acl cnt url_regex .*\/logos\/.*
acl cnt url_regex .*rambler\.gif
acl cnt url_regex .*an\.yandex\.ru.*
acl cnt url_regex .*hotlog\.ru.*
acl cnt url_regex .*top\.mail\.ru.*
acl cnt url_regex .*host-tracker\.com\/uptime-img.*
acl cnt url_regex .*yandex\.ru\/metrika\/watch.*

acl ad2 url_regex http:\/\/promo\.1000zakazov\.ru\/img_.*	# реклама само собой
acl ad2 url_regex .*reklam.*
acl ad2 url_regex .*auto\.lbn\.ru\/\/cgi-bin\/banner\/.*
acl ad2 url_regex .*googleads.*.doubleclick.*
acl ad2 url_regex .*pagead.*
acl ad2 url_regex .*\/adfox\/.*
acl ad2 url_regex .*advert.*
acl ad2 url_regex .*infox\.ru\/img\/temp00.*
acl ad2 url_regex .*infox\.ru\/img\/head.*
acl ad2 url_regex .*infox\.ru\/img\/logo.*
acl ad2 url_regex .*lbn\.ru.*
acl ad2 url_regex .*\/ban\/.*
acl ad2 url_regex .*liveinternet\.ru\/click.*
acl ad2 url_regex .*banner.*
acl ad2 url_regex .*banners.*
acl ad2 url_regex .*mastertraffic\.cn\/.*
acl ad2 url_regex .*1under.ru\/.*
acl ad2 url_regex .*2under.ru\/.*
acl ad2 url_regex .*tizru\.com\/.*
acl ad2 url_regex .*pop-bazar.net\/.*
acl ad2 url_regex .*lycosy.com\/.*
acl ad2 url_regex .*adbureau\.net.*
acl ad2 url_regex http:\/\/[0-9].*\.[0-9].*\..*\/image.*
acl ad2 url_regex ...*.\/.*[0-9]x.*[0-9]\.gif
acl ad2 url_regex .*rs\.mail\.ru\/..*\.swf
acl ad2 url_regex .*rs\.mail\.ru\/b..*\.jpg
acl ad2 url_regex .*rs\.mail\.ru\/b..*\.gif
acl ad2 url_regex .*123strahovka\.ru\/portals\/.*

acl nah url_regex .*agent\.mail\.ru.*				# а тут в рабочее время делать нефиг
acl nah url_regex .*windowsupdate\..*
acl nah url_regex .*crl\.microsoft\.com.*
acl nah url_regex .*sitecheck\.opera\..*

http_access deny lns
http_access deny ad2
http_access deny cnt
http_access deny nah

http_access allow all 

# squid –z
# squid check
# shutdown -r now
# cd /usr/local/etc/squid/errors/ru
# cp ERR_ACCESS_DENIED ERR_ACCESS_DENIED.original
# ee ERR_ACCESS_DENIED
Очистить содержимое файла (оставить пустую строку, CRLF), чтобы блокированный контент 
не лез юзерам на экран в виде сообщений сквида.

Средства мониторинга и статистики для SQUID

# cd /usr/ports/www/sarg
# make install
# ee /usr/local/etc/sarg/sarg.conf 
# sarg.conf
language Russian_koi8
charset Koi8-r
access_log /c/cache/access.log
graphs yes
title "fqdndomain.tld Squid User Access Reports"
output_dir /c/www/sarg
resolve_ip no
user_ip no
exclude_hosts /usr/local/etc/sarg/exclude_hosts
date_format e
lastlog 36
remove_temp_files yes
index yes
overwrite_report yes
records_without_userid ip
usertab /etc/hosts
displayed_values abbreviation
www_document_root /c/www 

Исключения, обычно это localhost и админская воркстейшен ;)
# touch /usr/local/etc/sarg/exclude_hosts

Еженощное автоматическое посторение статистики, состоит из двух скриптов:
# touch /usr/local/etc/sarg/sarg_daily.sh
# ee /usr/local/etc/sarg/sarg_daily.sh 
#!/bin/sh
#
DATE2=$(date -v1d -v+1m -v-1d "+%d/%m/%Y") 
DATE1=$(date -v-1d "+01/%m/%Y")
/usr/local/bin/sarg -d $DATE1-$DATE2 

Во втором, кроме прочего, архивирование всего кэша за прошлый месяц.
# touch /usr/local/etc/sarg/sarg_monthly.sh
# ee /usr/local/etc/sarg/sarg_monthly.sh  
#!/bin/sh
#
DATE2=$(date -v-1d "+%d/%m/%Y")
DATE1=$(date -v-1m "+01/%m/%Y")
DATE3=$(date -v1d -v-1m -v-1d "+%Y%m%d")
/usr/local/bin/sarg -d $DATE1-$DATE2
/usr/local/sbin/squid -k rotate
rm /c/cache.rar
/usr/local/bin/rar a -r -s -m1 -ta$DATE3 /c/cache.rar /c/cache 

# ee /usr/local/etc/apache/httpd.conf 
Alias /sarg/ "/c/www/sarg/"
< Directory "/c/www/sarg">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order Deny,Allow
    Deny from all
    Allow from 192.168.0.10
< /Directory> 

# ee /etc/crontab 
1       0     2-31   *      *     root   /usr/local/etc/sarg/sarg_daily.sh
1       0     1      *      *     root   /usr/local/etc/sarg/sarg_monthly.sh 

# mkdir /c/www/sarg
Завтра смотрим статистику: http://192.168.0.170/sarg/index.html
Кстати, кроме статистики, sarg умеет еще много чего, поэтому советую почитать мануал.

Коннекты SQUID почти в реальном времени:
# cd /usr/ports/www/sqstat
# make install
# cd /usr/local/share/sqstat
# cp config.inc.php.defaults config.inc.php
# ee config.inc.php
$resolveip[0]=true; # если надо, конечно

# ee /usr/local/etc/apache/httpd.conf 
Alias /sqstat/ "/usr/local/share/sqstat/"
< Directory "/usr/local/share/sqstat">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order Deny,Allow
    Allow from 192.168.0.10
< /Directory> 

Смотрим: http://192.168.0.170/sqstat/sqstat.php

Бесперебойник APC

# cd /usr/ports/sysutils/apcupsd
# make install
# ee /usr/local/etc/apcupsd/apcupsd.conf 
## apcupsd.conf v1.1 ##
UPSNAME Smart1500
UPSCABLE smart
UPSTYPE usb				# намного проще, чем трахаться с COM
DEVICE
LOCKFILE /var/spool/lock
SCRIPTDIR /usr/local/etc/apcupsd
PWRFAILDIR /var/run
NOLOGINDIR /var/run
ONBATTERYDELAY 6
BATTERYLEVEL 20
MINUTES 6
TIMEOUT 0
ANNOY 0
ANNOYDELAY 60
NOLOGON disable
KILLDELAY 0
NETSERVER on
NISIP 0.0.0.0
NISPORT 3551
EVENTSFILE /var/log/apcupsd.events
EVENTSFILEMAX 100
UPSCLASS standalone
UPSMODE disable
STATTIME 0
STATFILE /var/log/apcupsd.status
LOGSTATS off
DATATIME 0 

Проверка:
# reboot
# apcaccess

Конфигурация зависимого сервера Windows:
C:\apcupsd\etc\apcupsd\apcupsd.conf
## apcupsd.conf v1.1 ##
UPSNAME Smart1500
UPSCABLE ether
UPSTYPE net
DEVICE 192.168.0.170:3551
ONBATTERYDELAY 6
BATTERYLEVEL 20
MINUTES 6
TIMEOUT 0
ANNOY 0
ANNOYDELAY 60
NOLOGON disable
NETSERVER on
NISIP 0.0.0.0
NISPORT 3551
EVENTSFILE C:\apcupsd\etc\apcupsd\apcupsd.events
EVENTSFILEMAX 10
NETTIME 10				# интервал опроса сервера
UPSCLASS standalone
STATTIME 0
STATFILE C:\apcupsd\etc\apcupsd\apcupsd.status
LOGSTATS off
DATATIME 0 

SAMBA
 
Все виндовые ACL отключены, права раздаются из консоли FreeBSD.
DOS атрибуты (кроме archive) не мапятся. 
Права доступа галками через виндовый гуй не ставятся, папки и файлы в корне шары через винду не создаются. 
Образец (шара по имени test, находится в /c/test):
drwxrwx---  3 admin      domain users   512 10 nov 10:26 allusers  доступ всем юзерам домена
drwx------  2 testuser   domain users   512 10 nov 10:24 testuser  доступ только одному юзеру
drwxrwx---  2 testuser2  domain admins  512 10 nov 10:26 testuser2 доступ одному юзеру и всем админам
Сама шара:
drwxrwxr-x  7 root       wheel          512 10 nov 11:02 test

Приступим. Если Openssl собран без MD2, надо пересобрать.
# cd /usr/ports/net/samba34
# make install
Опции: LDAP, ADS, WINBIND, SWAT, ACL, POPT
# cd /usr/ports/security/heimdal
# make install
Без опций, так как всё уже есть на Primary Domain Controller под вендой. 
По поводу heimdal - говорят, что в FreeBSD начиная с 6.2 уже есть полноценная реализация kerberos, 
и поэтому неимдал не нужен. ХЗ, я не проверял, поставил да и всё.
# touch /etc/krb5.conf
# ee /etc/krb5.conf 
[libdefaults]
ticket_lifetime = 24h
default_realm = LOCALDOMAIN.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false
forwardable = true
proxiable = true
[realms]
LOCALDOMAIN.LOCAL = {
 kdc = 192.168.0.7:88				# адрес виндового контроллера домена
 admin_server = 192.168.0.7:749
 default_domain = localdomain.local
}
[domain_realm]
.localdomain.local = LOCALDOMAIN.LOCAL
[logging]
default = FILE:/var/log/kerberos/krb5libs.log
kdc = FILE:/var/log/kerberos/krb5kdc.log
admin_server = FILE:/var/log/kerberos/kadmind.log
[pam]
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
[login]
krb4_convert = false
krb4_get_tickets = false 

# ee /etc/nsswitch.conf 
group: files winbind
group_compat: nis
passwd: files winbind
passwd_compat: nis
hosts: files wins dns
networks: files
shells: files
services: compat
services_compat: nis
protocols: files
rpc: files 

# ee /usr/local/etc/smb.conf 
[global]
 dos charset = cp866
 unix charset = koi8-r
 display charset = koi8-r
 workgroup = LOCALDOMAIN			# имя домена
 realm = LOCALDOMAIN.LOCAL
 server string = 
 security = ADS
 auth methods = winbind
 map to guest = Bad User
 password server = 192.168.0.7			# адрес контроллера
 enable privileges = No
 client NTLMv2 auth = Yes
 log file = /var/log/samba34/log.%m
 max log size = 500
 client signing = Yes
 load printers = No
 disable spoolss = Yes
 show add printer wizard = No
 local master = No
 domain master = No
 dns proxy = No
 wins server = 192.168.0.7			# адрес сервера
 host msdfs = No
 idmap uid = 10000-20000
 idmap gid = 10000-20000
 winbind enum users = Yes
 winbind enum groups = Yes
 winbind use default domain = Yes
 printer admin = root
 create mask = 0770
 directory mask = 0770
 inherit acls = Yes
 guest ok = Yes
 nt acl support = No
 case sensitive = No
 map archive = Yes
 map readonly = no
[test]
 comment = Test
 path = /c/test
 read only = No
 acl map full control = No
 inherit acls = No
 guest ok = No 

Строчки в rc.conf должны присутствовать:
smbd_enable="YES"
nmbd_enable="YES"
winbindd_enable="YES"
# reboot

Синхронизация времени:
# net time system > date
Получение билета:
# kinit admin@localdomain.local
# klist
Подключение к активной директории:
# net ads join -u admin
Проверки:
# wbinfo -p
# wbinfo -t
# wbinfo -g
# wbinfo -u
#ee /etc/pam.d/login
Насчет PAM чиста ХЗ, у меня всё работает с дефолтными параметрами, а логинить виндовых юзеров на сервер мне не надо.
Cамбу можно (и нужно, т.к. там хэлп под рукой) конфигурить через SWAT (192.168.0.170:901).
PS Потом оказалось, что DNS сервер на виндовом DC про нас не знает, что приводит к тормозам 
на первом обращении к шарам. Долго думать не стал, просто добавил самбу в виндовый DNS руками.

DNS

DNS в моем случае работает как-то так замороченно. В виндовых клиентах dns-сервером прописан контроллер домена,
все запросы идут на него. Тот настроен так, что форвардит неизвестные имена сюда, где они запрашиваются у 
провайдерского сервера(ов) и кэшируются. То есть имеем тупой DNS forwarder.
# ee /etc/resolv.conf 
domain		localdomain
nameserver	127.0.0.1

# ee /etc/namedb/named.conf 
options {
	directory	"/etc/namedb/working";
	pid-file	"/var/run/named/pid";
	dump-file	"/var/dump/named_dump.db";
	statistics-file	"/var/stats/named.stats";
	disable-empty-zone "255.255.255.255.IN-ADDR.ARPA";
	disable-empty-zone "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.0.IP6.ARPA";
	disable-empty-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";
	forwarders {
		XZ.XZ.XZ.XZ;		# это провайдерские сервера
		ZX.ZX.ZX.ZX;
	};
	forward only;
	query-source address * port 53;	# так делать не рекомендуют, но мне пох, т.к. мой DNS снаружи недоступен
};
# далее все описания зон оставлены без изменений 

# ee /etc/hosts
192.168.0.2 user02
...
127.0.0.1 localhost
127.0.0.1 server
127.0.0.1 server.fqdndomain.tld
127.0.0.1 server.localdomain

NTP

# touch /etc/ntp.conf
# ee /etc/ntp.conf 
server time.nist.gov prefer
server tick.usno.navy.mil
server rustime01.rus.uni-stuttgart.de
restrict 192.168.0.0 mask 255.255.0.0 nomodify notrap
logfile /var/log/ntpd.log

Через некоторое время в логе должны появиться записи о синхронизации.

Итоги и тенденции

Для работы Firebird и самбового Swat настроим inetd:
# ee /etc/inetd.conf 
gds_db stream tcp nowait     firebird /usr/local/bin/fb_inet_server fb_inet_server
swat   stream tcp nowait/400 root     /usr/local/sbin/swat          swat 

И окончательно настроим систему:
# ee /etc/rc.conf 
ifconfig_re0="inet 192.168.0.170  netmask 255.255.255.0"
ifconfig_re0_alias0="inet 192.168.0.171  netmask 255.255.255.0"
ifconfig_fxp0="inet xx.xx.xx.xx netmask 255.255.255.252"
hostname="server.localdomain.local"
defaultrouter="zz.zz.zz.zz"	# провайдерский гейт

firewall_enable="YES"
firewall_type="/etc/rc.firewall"
ipv6_enable="NO"
gateway_enable="YES"
tcp_extentions="NO"
tcp_drop_synfin="YES"
icmp_drop_redirect="YES"
icmp_log_redirect="NO"

keyrate="fast"
keymap="ru.koi8-r"
scrnmap="koi8-r2cp866"
font8x16="cp866-8x16"
font8x14="cp866-8x14"
font8x8="cp866-8x8"

sendmail_enable="NONE"		# кузнец нам не нужен ;)
sendmail_msp_queue_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
mta_start_script=""

moused_enqble="NO"
linux_enable="NO"
apcupsd_enable="YES"
sshd_enable="YES"
inetd_enable="YES"
ftpd_enable="YES"
ftpd_flags="-D -h -M -m"
mysql_enable="YES"
courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
postfix_enable="YES"
apache_enable="YES"
squid_enable="YES"
smbd_enable="YES"
nmbd_enable="YES"
winbindd_enable="YES"
ntpd_enable="YES"
named_enable="YES"

# touch /etc/rc.local
# ee /etc/rc.local 
vidcontrol -c blink VGA_90x30
# NAT с перенаправлением портов: для терминального сервиса windows и для торрентов мне
natd -u -s -m -p 8668 -n fxp0 -redirect_port tcp 192.168.0.7:3389 3389 -redirect_port tcp 192.168.0.10:12345 12345 

# ee /etc/rc.firewall 
#!/bin/sh -
# $FreeBSD: src/etc/rc.firewall
fc="/sbin/ipfw -q add"
extif="fxp0"
extadr="xx.xx.xx.xx"		# наш внешний адрес
lanif="re0" 
lannet="192.168.0.0/24"
/sbin/ipfw -f -q flush
/sbin/ipfw table 20 flush
# ANTI-SPOOFING etc
${fc} drop all from 192.168.0.0/16 to any recv ${extif}
${fc} drop all from any to 192.168.0.0/16 in recv ${extif}
${fc} drop all from 127.0.0.0/8 to any recv ${extif}
${fc} drop all from 127.0.0.0/8 to any recv ${lanif}
${fc} drop all from any to 172.16.0.0/12 # gray
${fc} drop all from 172.16.0.0/12 to any # gray
${fc} drop all from 169.254.0.0/16 to any
${fc} drop all from any to 169.254.0.0/16
# NAT+REDIRECT
${fc} divert 8668 all from any to ${extadr}
${fc} allow tcp from one.static.trusted.address to 192.168.0.7 3389	# форвардинг на терминальный сервис
${fc} allow tcp from any to 192.168.0.10 12345				# форвард на TORRENT клиента
${fc} divert 8668 all from ${lannet} to any out via ${extif}
${fc} allow tcp from 192.168.0.7 3389 to one.static.trusted.address	# MSTS
${fc} allow tcp from me 3389 to one.static.trusted.address		# MSTS
${fc} allow tcp from 192.168.0.10 12345 to any				# TORRENT
${fc} allow tcp from me 12345 to any					# TORRENT
# loop
${fc} allow all from any to any via lo
# DYNAMIC FROM HERE
${fc} check-state
# MTA blacklist
${fc} drop all from "table(20)" to any 
# ICMP
${fc} allow icmp from ${lannet} to any icmptypes 0,3,4,8,11 keep-state
${fc} allow icmp from 85.92.3.130 to me icmptypes 0,3,4,8,11 keep-state
${fc} allow icmp from me to any keep-state
# OUTGOING
${fc} allow tcp from me to any setup keep-state
${fc} allow udp from me to any keep-state
# INCOMING
${fc} allow tcp from any to me 25,110 setup keep-state
# TO NAT
${fc} allow tcp from ${lannet} to not me 443 setup keep-state		# https
${fc} allow tcp from ${lannet} to not me 5999 setup keep-state		# cvsup
${fc} allow tcp from ${lannet} to not me 27000-27050 setup keep-state	# STEAM
${fc} allow udp from ${lannet} to not me 27000-27050 keep-state		# STEAM
# TO NAT FROM superuser
${fc} allow tcp from 192.168.0.10 to not me 22,11965,3128 setup keep-state
# LAN
${fc} drop all from 192.168.0.7 to me 3128				# венда идет лесом
${fc} allow udp from ${lannet} to me 53,13,37,123 keep-state
${fc} allow tcp from ${lannet} to me 53,13,37,123 setup keep-state
${fc} allow tcp from ${lannet} to me 20,21,3128,3551 setup keep-state
${fc} allow tcp from 192.168.0.10 to me 22,80 setup keep-state
# SAMBA
${fc} allow udp from ${lannet} to me 137,138,139,445 keep-state
${fc} allow tcp from ${lannet} to me 137,138,139,445 setup keep-state
${fc} allow tcp from 192.168.0.10 to me 901 setup keep-state
# Firebird
${fc} allow udp from ${lannet} to me 3050 keep-state
${fc} allow tcp from ${lannet} to me 3050 setup keep-state
# finally
${fc} drop all from any to any 

Это всё, удачи ;)



В начало


Сайт управляется системой uCoz