11 ноября 2008 г.

Виртуальные пользователи и домены, почтовый сервер на основе Postfix, Courier, MySQL и SquirrelMail (Ubuntu 8,04 LTS)

Руководствуясь статьей, выложенной на форуме убунты, настроил почтовый сервер.
Единственное НО: в этой статье рекомендуется использовать phpmyadmin для внесения данных в почтовую систему. Но почему бы не использовать postfixadmin?
Скачал, поставил.
Но он использует свою собственную базу, со своими таблицами. Таблицы более информативные, есть аналоги, для используемых в руководстве.
Учитывая, что сервер еще по боевому не использовался, было принято решение перевести Postfix на работу с новой базой.

Пришлось сделать изменения в следующих файлах:
1. /etc/postfix/mysql-virtual_domains.cf
/etc/postfix/mysql-virtual_email2email.cf
/etc/postfix/mysql-virtual_forwardings.cf
/etc/postfix/mysql-virtual_mailboxes.cf
/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
/etc/postfix/mysql-virtual__transports.cf
Причем, таблицы, аналогичной transport в базе mail, изпользуемой в /etc/postfix/mysql-virtual__transports.cf, я в базе postfixadmina не увидел, поэтому просто тупо скопировал ее. Решил, что если она мне понадобиться, я ее буду использовать без помощи postfixadmina.
2. /etc/pam.d/smtp
3. /etc/postfix/sasl/smtpd.conf
4. /etc/courier/authmysqlrc

Ну, в принципе, и все.

27 октября 2008 г.

Простой способ переноса больших файлов по частям

Бывает, что необходимо перенести большой файл, например, на flash с файловой системой FAT16/32 или загрузить на сервер по частям. На помощь придут две программы, которые, как правило, присутствуют в любом дистрибутиве Linux и Mac OS.

Команда split

$ split -a 1 -d -b 4000M sample.iso sample.iso.part

разобьет исходный файл sample.iso на части по 4 Гбайта (максимальный размер файла в FAT), каждая из которых будет именоваться как sample.iso.partN, где N = 0, 1, 2,… .
Собрать части воедино на целевой системе поможет команда cat:

$ cat sample.iso.part* > sample.iso

Применение маски приведет к тому, что утилита cat переберет все файлы по порядку, начиная с sample.iso.part0.

Этот наглядный пример показывает, как можно перенести большой файл. Более подробную информацию по использованию cat и split можно получить в справке (--help) и руководствам (man) к программам.

от Хабрахабр: автор: Decoy

iptables + torrent

Поправлено

#Конфигурация локальной сети
LOCAL_IP = "192.168.x.x"

#
# Создаем отдельную пользовательскую цепочку для торрента
#

$IPTABLES -N torrents

#
# Заполняем пользовательские цепочки
#

# torrents chain
#

$IPTABLES -A torrents -p tcp --destination-port 44218 --dst $LOCAL_IP -j ACCEPT
$IPTABLES -I FORWARD -j torrents


# PREROUTING chain
#

# Вносим в таблицу PREROUTING данные о торрент-цепочке

$IPTABLES -t nat -N torrents
$IPTABLES -t nat -A torrents -i $INET_IFACE -p tcp --dport 44218 -j DNAT --to $LOCAL_IP:44218
$IPTABLES -t nat -A PREROUTING -j torrents


После этого все хорошо.
Порт указываем тот, что установлен у нас в торрент клиенте.

17 октября 2008 г.

Разрешение на доступ из локальной сети в глобальную сеть на определенные порты

# 4.1.5 FORWARD chain
#

#
# Bad TCP packets we don't want
#

$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets

#
# Accept the packets we actually want to forward
#

$IPTABLES -A FORWARD -p tcp --dport 21 -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 80 -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 110 -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#
# Log weird packets that don't match the above.
#

$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "IPT FORWARD packet died: "

загрузка правил iptables при включении

Как составленные команды для iptables поставить в автозагрузку?

1 вариант:
выполни iptables-save > [/.../file]
далее в /etc/rc.local добавь строку (до exit 0):
iptables-restore < [/.../file]

путь к файлу должен быть полный. Выбирай произвольно

2 вариант:
лично я использую скрипт, в котором прописаны команды iptables, прописанный в автозагрузку.

iptables & vpn-server в локальной сети

Есть гейт (linux) с интерфейсами:
eth0 - глобальная сеть
eth1 - локальная сеть - 192.168.0.x
В локальной сети есть комп VPN server (windows) нужно прокинуть pptp+gre с любого ip из глобальной сети в локальную

IF_DEV=eth0
vpnserver="192.168.0.201"
/sbin/iptables -N pptp
/sbin/iptables -A pptp -p tcp --destination-port 1723 --dst $vpnserver -j ACCEPT
/sbin/iptables -A pptp -p 47 --dst $vpnserver -j ACCEPT
/sbin/iptables -I FORWARD -j pptp
/sbin/iptables -t nat -N pptp
/sbin/iptables -t nat -A pptp -i $IF_DEV -p tcp --dport 1723 -j DNAT --to $vpnserver:1723
/sbin/iptables -t nat -A pptp -i $IF_DEV -p 47 -j DNAT --to $vpnserver
/sbin/iptables -t nat -A PREROUTING -j pptp

google и forum.opennet.ru - великие изобретения человечества

16 октября 2008 г.

на серваке стоял squid с ntlm авторизацией из домена Active Directory.
все прекрасно работало.
роутер с функционалом фаейрволла был настроен на железяке DFL-800.
потом железяка сдохла.
решено было настроить все это на том же самом серваке.
хотя сама идея выставлять в качестве маршрутизатора компьютер-член домена мне глубоко не нравится
но тем не менее.
кстати, все даже работало.
но в один прекрасный момент перестало.
путем долгих манипуляций было выяснено, что проблема в DNS.
в /etc/resolv.conf прописаны dns как внутренние - локальные, так и внешние - инетовские.
в какой то момент, winbind перестал получать информацию о пользователях с контроллера домена.
компьютеры - члены домена, тоже не пинговались по доменным именам.
путем простого переноса в /etc/resolv.conf инетовского dns в конец, эта проблема была решана )))
но вообще, надо бы отдельную машинку под роутер-файерволл.

3 октября 2008 г.

firewall

Пришел на работу, а там сдох Dlink DFL-800. Неплохая машинка, но как и все у длинка - отрабатывает только гарантийный срок.
Пришел к выводу, что надо на убунте поднять также маршрутизацию и файерволл.
С iptables возится лень, точнее не лень, а нет времени, потом повожусь.
Поставил shorewall, потихоньку настраиваю.
Тем более, что это просто надстройка.

Но на этой же машине стоит squid, с авторизацией по ntlm. А в файерволле я изначально открыл доступ с этой машины только наружу, а внутрь не подумал )) соответственно, winbind не мог получить данные с AD и squid постоянно просил авторизацию.
Причем, поначалу, winbind по-ходу помнил юзеров, а потом время вышло. Это вот тоже внесло свою лепту, когда я не мог понять, что же я такого сделал, что авторизация отвалилась.

Вот такие вот мелочи иной раз могут подпортить жизнь.

26 сентября 2008 г.

Прокси

Дааа, все же политика "что не запрещено, то разрешено" бесит =)
Надо будет нацарапать официальные бумажки да подписать их у руководства, где будет указано, кому куда можно ходить.
А то наооборот запариваешься вечно что-то блокировать.
Опять же онлайн-рсс-ридеры...

Клонирование виртуальных машин в VirtualBox

"C:\Program Files\Sun\xVM VirtualBox\VBoxManage.exe" clonevdi F:\VM\ubuntu-server\ubuntu-server.vdi F:\VM\copy-ubuntu-server\copy-ubuntu-server.vdi
- это пример для клонирования диска 1 в диск 2 VBoxManage.exe - лежит в корне папки виртуал бокс после клонирования создаем машинку и подключаем второй диск.

Пример, естественно, как видно по команде, для windows.

3 сентября 2008 г.

Авторизация пользователей домена Windows 2003 в Squid (черновик)

Долго думал, какую авторизацию прикрутить к сквиду.
И каким образом это настроить.

В итоге получилось что то типа нижеследующего. Руководствовался этой статьей.

Ставим squid.
# aptitude install squid

Теперь проверяем работу хелпера отвечающего за группы. Это несложный перловый скрипт идущий в комплекте со сквидом - он тупо вызывает wbinfo на тему поиска СИДа группы, и ещё разок на тему принадлежности юзера к группе с найденным SID. Всё просто, но по три форка на запрос. Будет ли он кэшировать найденные значения - выясниться позже, когда запустим и посмотрим на скорость изменения PID`ов в шапке top`a (могу сразу успокоить - кэширует :))). Итак, проверяем хелпер:

nx-admin@altair-nx:~$ echo proba inet | /usr/lib/squid/wbinfo_group.pl
OK
nx-admin@altair-nx:~$ echo ssa inet | /usr/lib/squid/wbinfo_group.pl
OK
nx-admin@altair-nx:~$ echo trifonov inet | /usr/lib/squid/wbinfo_group.pl
ERR


Работает. Тока косяк - не удалось ему впарить группу (или юзера) с пробелом в названии - что для меня не очень существенно, всё равно для разруливания прав будут созданы отдельные группы - разумеется без пробелов. Заметим, что сам wbinfo - прекрасно обрабатывает и группы и имена пользователей с пробелами.

Сквид запускается не от рута и у него не хватит прав на доступ к сокету winbindd - поэтому, заранее исправляем сиё досадное упущение:

squid$ chown root:proxy /var/run/samba/winbindd_privileged/




Теперь рисуем конфиг сквида:

# порт где слушаем
http_port 3128

# список слов, которые будучи обнаруженными в URL вызывают обработку без кэширования
hierarchy_stoplist cgi-bin ?

# список ACL которые вызывают несовпадение с кэшем, и, запрос с ответом кэшироваться не будут
acl QUERY urlpath_regex cgi-bin \?

# собственно - правило что не кэшируем
no_cache deny QUERY

# сколько отдаём ему памяти (реально пожрёт втрое больше)
cache_mem 128 MB

# Директория для кэша, числа - размер кэша в Mb, число директорий первого уровня, число директорий второго уровня в каждой директории первого.
cache_dir ufs /var/spool/squid 4096 16 256

# лог доступа - первый параметр путь, второй - формат, форматы описаны в дефолтовом файле.
access_log /var/log/squid/access.log squid

# лог активности менеджера хранилища. Показывает, какие объекты были сохранены/удалены из кэша и как долго.
# мне он не нужен, а места занимает прилично.
cache_store_log none

# файл hosts, проверяемый при запуске. Из него берётся доменное имя и добавляется к неполным адресам (которые не содержат ни одной точки в имени)
hosts_file /etc/hosts

# домен добавляемый к неполным именам
append_domain .jscguideh.ru

# директория где хранятся HTML c текстами ошибок
error_directory /usr/share/squid/errors/Russian-1251


# программа редиректор (у меня сквидгард) для более простой и тонкой настройки правил использования инета
#redirect_program /usr/local/bin/squidGuard -c \
# /usr/local/etc/squid/squidguard.conf
# число процессов редиректора
#redirect_children 20

#cache_log /usr/local/squid/logs/cache.log
#debug_options ALL,5

# авторизация
# нативная авторизация ослика
auth_param ntlm program /usr/bin/ntlm_auth \
--helper-protocol=squid-2.5-ntlmssp
# число детишек для авторизации - сколько процессов запускать
auth_param ntlm children 50
# базовая авторизация для тех, кто не может нативную
auth_param basic program /usr/bin/ntlm_auth \
--helper-protocol=squid-2.5-basic
# Число процессов для базовой аворизации - значительно меньше чем для основной, т.к. таких юзеров/программ немного
auth_param basic children 10
# Заголовок окна выводимый при запросе авторизации
auth_param basic realm Squid proxy-caching web server
# время жизни авторизации - сколько кэшировать данные (для базовой авторизации)
auth_param basic credentialsttl 2 hours



#refresh_pattern ^ftp: 1440 20% 10080
#refresh_pattern ^gopher: 1440 0% 1440
#refresh_pattern . 0 20% 4320

# внешняя ACL для разруливания по группам
external_acl_type nt_group %LOGIN \
/usr/lib/squid/wbinfo_group.pl


# пользователи у которых просто интернет - с ограничениями
acl inet_users external nt_group inet_users
# пользователи у которых есть тока аська
acl inet_icq external nt_group inet_icq
# пользователи с полными правами на доступ в инет
acl inet_full external nt_group inet_full
# пользователи с ограниченным доступом в инет - тока определённый набор ресурсов и всё.
acl inet_restrict external nt_group inet_restrict
# Пользователи которым разрешён метод CONNECT
#acl inet_connect external nt_group inet_connect
# ACL авторизации на проксе
acl JSCGUIDEH proxy_auth REQUIRED


# Описываем порты на которые разрешено лазить
acl SSL_ports port 443 563
acl SSL_for_client_banks port 910 8443 4500
# порты на которые можно ходить юзерам
acl safe_ports port 80 # http
acl safe_ports port 21 # ftp
acl safe_ports port 443 # ssl
acl ICQ_ports port 5190 # ICQ
# надо ли? 1025-65535
acl CONNECT method CONNECT
# для /usr/ports/www/sqstat/
# копируете конфиг, ставите вместо 'host' - 'user'
# и начальство не оторвать от экрана :))
acl manager proto cache_object


# Описываем все сети все IP
acl all src 0.0.0.0/0.0.0.0
# описываем локалхост
acl localhost src 127.0.0.1/255.255.255.255
# acl до сайтов которые разрешены всем]
acl guideh.com dstdomain \
"/usr/share/squid/db/allow_all.txt"
# запрещённые в URL выражения (для всего УРЛа)
acl bad_url url_regex \
"/usr/share/squid/db/deny_url.txt"
# запрещённые в URL выражения (для самого урла, без домена)
#acl bad_url_2 urlpath_regex \
# "/usr/share/squid/db/deny_url_2.txt"
# запрещённые доменные имена
acl deny_domains dstdomain \
"/usr/share/squid/db/deny_domains.txt"
# acl для клиент-банков и прочих кому надо напрямую ходить
acl client_banks dst \
"/usr/share/squid/db/client_banks.txt"
# сети в которые ходить не надо (ICQ и прочия)
acl bad_networks dst \
"/usr/share/squid/db/bad_networks.txt"
# те кто ходят без авторизации
acl not_autorized src \
"/usr/share/squid/db/not_autorized.txt"
# список сайтов для тех у кого их определённый набор
acl domains_for_restrict dstdomain \
"/usr/share/squid/db/domains_for_restrict.txt"

### настройки доступа ####

# вводим свои определения для сообщений о
# отказе по ACL - пригодиться когда кто-то
# воет что не может попасть на определённый сайт
#deny_info ERR_BAD_URL bad_url
#deny_info ERR_BAD_NETWORKS bad_networks
#deny_info ERR_DENY_DOMAINS deny_domains
#deny_info ERR_SAFE_PORTS safe_ports
#deny_info ERR_SSL_PORTS SSL_ports


# пропускаем sqstat
http_access allow manager localhost
http_access deny manager

# выпускаем на неавторизуемые сайты
http_access allow client_banks
# выпускаем тех кто не авторизуется в принципе
# т.к. они не в домене и т.п.
http_access allow not_autorized
# Разрешаем всем доступ на сайт конторы
# Этим же правилом срубаются все неавторизованные
http_access allow JSCGUIDEH guideh.com
# Разрешаем доступ ко всему группе 'inet_full'
http_access allow inet_full all
# Зарубаем запрещённые куски url
http_access deny bad_url
# Разрешаем асечный порт тем у кого есть аська
http_access allow inet_icq ICQ_ports
# зарубаем запрещённые сети
http_access deny bad_networks
# зарубаем запрещённые домены
http_access deny deny_domains
# Зарубаем коннект кроме как к SSL (надо ли группе отдельной?)
http_access deny CONNECT !SSL_ports
# зарубаем все порты проме safe_ports
http_access deny !safe_ports
# разрешаем инет обычным пользователям
http_access allow inet_users
# разрешаем инет ограниченным пользователям на разрешённые сайты
http_access allow inet_restrict domains_for_restrict


# зарубаем всё нах :)
# Для начала кустомизируем сообщение о ошибке.
# ERR_INET_NO_ALLOW - это имя файла в
# /usr/share/squid/errors/Russian-1251
# синтаксис описан
# http://wiki.squid-cache.org/SquidFaq/MiscFeatures
#deny_info ERR_INET_NO_ALLOW all
http_access deny all



http_port 3128


Сам конфиг хорошо прокомментирован, поэтому, дополнительные камменты не делаю, тока привожу файлики которые в нём фигурируют:

Здесь будут примеры


После рисовки всех конфигов, делаем сквида владельцем директории с кэшем, и создаём субдиректории:

squid$ chown -R squid:wheel /var/spool/squid
squid$ squid -z

Ввод машины с Ubuntu Server 8.04 в домен Active Derectory Win2003

Предупрежу сразу - делается это только для того, чтобы настроить работу Squid с авторизацией пользователей из домена. Т.е. залогиниться доменный пользователь на этой машине не сможет.

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

Итак.
Редактируем часовой пояс
# vim /etc/default/rcS
cтавим UTC=no

Настраиваем сеть.
Проверяем наличие пинга до домен-контроллера(DC) по полному доменному имени (FQDN), еcли проблемы - настраиваем /etc/resolv.conf.
# ping dc.domain.ru

Настраиваем машину на синхронизацию времени с контроллером домена.
# vim /etc/default/ntpdate

NTPSERVERS="dc.domain.ru" <--- меняем эту cтроку указывая домен контроллер

В домене с несколькими домен контроллерами главным сервером времени является эмулятор PDC. Остальные dc берут время у него.

Даем команду на синхронизацию
#/etc/network/if-up.d/ntpdate

Данный вариант может не сработать, тогда настраиваем с помощью утилиты smbclient'a - net.

#vim /etc/cron.daily/timesync
#chmod +x /etc/cron.daily/timesync
#cat /etc/cron.daily/timesync

   #!/bin/sh

   /usr/bin/net time set -S domain.controller

Пропиcываем полное FQDN для настраиваемой машины workstation

# vim /etc/hosts
127.0.0.1 workstation.domain.ru localhost workstation

проверка

# ping workstation.domain.ru

Начнем ставить пакеты для работы в домене:

# sudo apt-get install samba smbfs winbind libpam-mount

smbfs нужен для монтирование сетевых папок. Он делает два файла в /sbin/(u)mount.cifs

А теперь конфигурируем SAMBA для работы в домене
создадим папку для пользователей домена
# mkdir /home/DOMAIN

Правим конфиг
# vim /etc/samba/smb.conf

[global]
unix charset = UTF-8
dos charset = CP866
display charset = UTF-8
workgroup = DOMAIN
server string = %h server (Samba, Ubuntu)
dns proxy = no

#wins support = no
#wins server = 192.168.3.4

#### Debugging/Accounting ####

log file = /var/log/samba/log.%m
max log size = 1000
syslog = 0
panic action = /usr/share/samba/panic-action %d

####### Authentication #######

security = ads

password server = *
realm = DOMAIN.RU

encrypt passwords = true
passdb backend = tdbsam
obey pam restrictions = yes
invalid users = root
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n *passwd:*password\supdated\ssuccessfully* .

############ Misc ############

socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

domain master = no
local master = no
preferred master = no
os level = 0

idmap uid = 10000-20000
idmap gid = 10000-20000
template shell = /bin/bash
winbind enum groups = yes
winbind enum users = yes

template homedir = /home/%D/%U
client use spnego = yes
winbind use default domain = yes
winbind refresh tickets = yes
restrict anonymous = 2

wins support = no


Проверяем конфигурацию SAMBA командой testparm.

Даем команду чтобы демоны перечитали конфигурацию:
# /etc/init.d/winbind stop && /etc/init.d/samba restart && /etc/init.d/winbind start

Подключаем машину в домен
# net ads join –U administrator
Далее будет запрос пароля доменного админа. Вместо доменного админа можно указать любую пользовательскую учетку. Да, у пользователя есть право ввести ПК в домен, но ограниченное кол-вот раз .

В случае успеха видим:
Using short domain name – DOMAIN
Joined ‘namepc' to realm ‘DOMAIN.RU'

Если такая машина уже существует увидим
Failed to set password for machine account (NT_STATUS_ACCESS_DENIED)
Failed to join domain !
Если будет такая ошибка содержащая что то про principal name, а в AD появится учетка, но со знаком красного крестика значит смотри и проверяй /etc/hosts
При рассинхронизации времени с DC возможно появление ошибки из-за несовпдаения времени на DC и на workstation
Перегрузитесь для синхронизации времени с DC и повторно попытайтесь ввести в домен Ubuntu 7.10

О планах на этот блог

Заметил, что последнее время я стал использовать этот блог для того, чтобы сохранить какие-то интересные статьи..
На самом деле надо просто привести в порядок свои закладки, коих накопилось очень много.
Но пожалуй, сюда буду также выкладывать описание своих собственных эксперементов, дабы потом не забыть, как и что я делал ))

1 сентября 2008 г.

Проблемы с кириллицей в Ubuntu Server 8.04

Собственно проблема там не в переключении, а в том, что отображаются русские буквы следующим образом:

А♦В♦♦Е♦♦♦♦♦К♦МНО♦РСТ♦♦Х♦♦♦♦♦♦♦♦♦♦
а♦♦♦♦её♦♦♦♦♦♦♦♦о♦рс♦у♦х♦♦♦♦♦♦♦♦♦♦

Мне помогло следующая команда:
sudo dpkg-reconfigure console-setup

причем для переключения между языками указал правый control, но можно, насколько я понимаю, и другие клавиши, проблемы могут возникнуть, если указывать сочетание клавиш.
также надо выбрать правильный шрифт =) меня стоит CyrKoi (кириллица из KOI8-R и KOI8-U).
после этого все сразу стало замечательно.