Packet Filter (PF) — фаервол разработанный для OpenBSD и позже портированный на FreeBSD и NetBSD. По сравнению с тем же ipfw, имеет более понятный для чтения и написания правил синтаксис, имеет встроенный NAT, очереди и другие вкусности. Примеры конфигов можно увитеть тут: /usr/share/examples/pf.
В ОС FreeBSD он поставляется в виде подгружаемых модулей ядра, добавим его поддержку:

[root@router /]# cat /etc/rc.conf | grep pf
 pf_enable="YES"
 pf_rules="/etc/pf.conf"
 pf_flags=""
 pflog_enable="YES"
 pflog_logfile="/var/log/pflog"
 pflog_flags=""
 gateway_enable="YES"

Если FreeBSD используется в качестве маршрутизатора, следует разрешить проброс пакетов, добавить в файл /etc/sysctl.conf:

net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

Сам конфиг у нас находиться в /etc/pf.conf и имеет организованную структуру:
1. Макросы: Определяемые пользователем переменные, которые могут содержать адреса IP, имена интерфейсов, и т.д.
2. Таблицы: Применяются для хранения списков IP адресов.
3. Опции: Параметры, влияющие на работу pf.
4. Параметры нормализации Scrub: Подготовка пакета к нормализации и дефрагментации.
5. Приоретизация и очереди ALTQ: Обеспечивает управление полосой пропускания и установку приоритетов пакета.
6. Трансляции: Контроль NAT и перенаправление пакетов.
7. Правила фильтрации: Осуществляют выборочную фильтрацию пакетов на интерфейсах.

Для ясности происходящего приведу пример включения PF в сеть:

pf

[root@router /]# cat /etc/pf.conf
####МАКРОСЫ####
# Внешний виртуальный сетевой интерфейс созданный PPPoE.
ext_if="tun0"# WAN ISP
int_isp="vr1"# Сетевой интерфейс который смотрит в мою домашнюю сеть.
int_if="vr0"router="192.168.1.1"
LAN="192.168.1.0/24"# Разрешенные типы icmp сообщений
allowed_icmp_types="{ echoreq, unreach }"

# Открытые порты со стороны интернет
servises_ext = "{ 21 80 3389 4899 5900 }"

# Cписок немаршрутизируемых адресов, с которых к нам будут долбиться на внешний интерфейс
non_route_nets_inet="{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"

####ТАБЛИЦЫ####
# Те, кто ходит у меня через NAT.
table <it> persist { 192.168.1.5 }

# Всем с сети 192.168.2.0/24 кроме 192.168.2.200.
#table <clients> { 192.168.2.0/24, !192.168.2.200 }

####CONTROL PF####
# Тем, кто лезет туда куда не нужно вежливо сообщаем что нельзя
#set block-policy return

# Если Вас досят, есть смысл поставить вместо "return".
set block-policy drop

# Не проверяем на lo0
set skip on lo0

# Изменяем время для состояния установленного tcp соединения, которое по-умолчанию чересчур большое (24часа).
set timeout { frag 10, tcp.established 3600 }

# Собирать пакеты перед отправкой
scrub in all

#Очереди, полоса - 2мбит, режем исходящий трафик от сервера с стороны внешнего интерфейса tun0.
altq on $ext_if cbq bandwidth 1980Kb queue { qssh, qhttp, qdns, qack, qftp }
queue qhttp bandwidth 70% priority 6 cbq (default borrow)
queue qssh bandwidth 15% priority 5 cbq (borrow)
queue qdns bandwidth 5% priority 5 cbq (borrow)
queue qack bandwidth 5% priority 6 cbq (borrow)
queue qftp bandwidth 5% priority 2 cbq (red)

#### NAT ####
# Тем, кто в таблице <it> разрешаем ходить в интернет через NAT, кроме 25 порта.
nat on $ext_if inet from <it> to any port != smtp -> ($ext_if)

# Для примера, NAT всех разрешенных портов, кроме www
#nat on $ext_if from $int_if:network to any port { ntp, nntp, domain } -> $ext_if

nat on $ext_if inet from 192.168.1.100 to any port smtp -> ($ext_if) #DBSERV

#### PORTMAPING ####
# Указываем какие порты редиректить и куда.
rdr on $ext_if inet proto tcp from any to any port 3389 -> 192.168.1.10 port 3389 #RDP
rdr on $ext_if inet proto tcp from any to any port 4899 -> 192.168.1.11 port 4899 #RADMIN
rdr on $ext_if inet proto tcp from any to $ext_if port 5900 -> 192.168.1.12 port 5900 #VNC

#### ПРАВИЛА ФИЛЬТРАЦИИ ####
# Блокируем всяких нехороших людей стандартный антиспуфинг средствами pf.
antispoof log quick for { lo0, $int_if, $ext_if }

#### $ext_if ####
#Блокируем все входящие на внешнем интерфейсе (ext_if) tun0
block in on $ext_if

#Рубаем Мультикастовые рассылки (Данные, предназначенные для приемом группой машин. В отличие от unicast и broadcast)
block in on $ext_if from any to 240.0.0.0/4

#Блокируем приватные сети на внешний интерфейс
block drop in quick on $ext_if from $non_route_nets_inet to any
block drop out quick on $ext_if from any to $non_route_nets_inet

#Разрешаем пинги на внешний интерфейс
pass in on $ext_if inet proto icmp all icmp-type $allowed_icmp_types

#Разрешаем ssh на внешнем интерфейсе
pass in quick on $ext_if inet proto tcp from any to any port 2222 keep state

#Разрешаем открытые порты на внешнем интерфейсе
pass in on $ext_if inet proto { tcp,udp } from any to any port $servises_ext flags S/SA keep state

#IN ALTQ
pass in on $ext_if inet proto { tcp,udp } from any to $ext_if port 2222 queue ( qssh, qack )
pass in on $ext_if inet proto { tcp,udp } from any to $ext_if port 80 queue qhttp
pass in on $ext_if inet proto { tcp,udp } from any to $ext_if port 53 queue qdns
pass in on $ext_if inet proto { tcp,udp } from any to $ext_if port { 21 30000:35000 } queue qftp

#OUT ALTQ
pass out on $ext_if inet proto { tcp,udp } from $ext_if to $ext_if port 2222 queue ( qssh, qack )
pass out on $ext_if inet proto { tcp,udp } from $ext_if to $ext_if port 80 queue qhttp
pass out on $ext_if inet proto { tcp,udp } from $ext_if to $ext_if port 53 queue qdns
pass out on $ext_if inet proto { tcp,udp } from $ext_if to $ext_if port { 21 30000:35000 } queue qftp

#Разрешить все исходящие на внешнем интерфейсе
pass out on $ext_if keep state

#### $int_isp ####
# Разрешаем все на этом интерфейсе.
pass in quick on $int_isp all
pass out quick on $int_isp all

#### $int_if ####
# Наша локалка
# Блокируем все входящие на внутр. интерфейсе (int_if)
block in on $int_if all

#Разрешаем пинги на внутр. интерфейсе
pass in on $int_if inet proto icmp all icmp-type $allowed_icmp_types

#Разрешаем открытые порты на внутр. интерфейсе
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 21 flags S/SA keep state #ftp
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 30000:35000 flags S/SA keep state #ftp-pasive
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 25 flags S/SA keep state #smtp
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 53 flags S/SA keep state #domain
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 67 flags S/SA keep state #dhcps
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 80 flags S/SA keep state #http
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 110 flags S/SA keep state #pop3
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 123 flags S/SA keep state #synctime (ntp)
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 137:139 flags S/SA keep state #samba
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 143 flags S/SA keep state #imap
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 445 flags S/SA keep state #microsoft-ds
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 465 flags S/SA keep state #ssmtp
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 993 flags S/SA keep state #imaps
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 995 flags S/SA keep state #pop3s
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 2222 flags S/SA keep state #SSH
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 3128 flags S/SA keep state #proxy
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 5222:5223 flags S/SA keep state #jabber
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 8000 flags S/SA keep state #stream-radio
pass in on $int_if inet proto { tcp,udp } from $LAN to $router port 9090 flags S/SA keep state #jabber-www-adminka

#for NAT
pass in on $int_if inet proto { tcp,udp } from <it> to any flags S/SA keep state
#Разрешить все исходящие на внутр. интерфейсе
pass out on $int_if keep state

PF имеет некоторые ключи для работы:
Включить pf:

[root@router /]#  pfctl -e

Выключить pf:

[root@router /]#  pfctl -d

Загрузить pf.sh:

[root@router /]#  pfctl -f /etc/pf.conf

Анализировать, но не загружать конфиг:

[root@router /]#  pfctl -nf /etc/pf.conf

Загрузить только правила NAT:

[root@router /]#  pfctl -Nf /etc/pf.conf

Загрузить только правила фильтрации:

[root@router /]#  pfctl -Rf /etc/pf.conf

Просмотр:
Показать текущие правила NAT:

[root@router /]#  pfctl -sn

Показать текущие правила фильтрации:

[root@router /]#  pfctl -sr

Показать текущее состояние таблиц:

[root@router /]#  pfctl -ss

Показать статистику правил и состояние счетчиков:

[root@router /]#  pfctl -si

Показать все:

[root@router /]#  pfctl -sa

Просмотр очередей ALTQ в реалтайме:

[root@router /]#  pfctl -vvsq

Подсчет трафика с помощью pf на определенных интерфейсах:

[root@router /]# pfctl -sI -vv -i tun0

Подсчет трафика с помощью pf на всех интерфейсах:

[root@router /]# pfctl -sI -vv

Сброс всех правил PF, полный клир:

[root@router /]#  pfctl -F all

Логирование трафика
Для просмотра логов, которые находятся в /var/log/pflog и не читабельны простым редактором используют tcpdump:

[root@router /]# tcpdump -n -e -ttt -r /var/log/pf.log

В реальном времени:

[root@router /]# tcpdump -n -e -ttt -i pflog0

Для просмотра пакетов, которые прошли через определенный порт, в данном случае smtp порт:

[root@router /]# tcpdump -n -e -ttt -r /var/log/pflog port 25

Можно ограничить показ пакетов комбинацией указанных адреса хоста и порта:

  [root@router /]#  tcpdump -n -e -ttt -r /var/log/pflog port 80 and host 192.168.1.10

Такой же способ применим при чтении информации из интерфейса pflog0:

  [root@router /]# tcpdump -n -e -ttt -i pflog0 host 192.168.1.10

Ставим в крон и отправляем себе на почту например каждый день в 8.00:

#!/bin/sh
tcpdump -n -e -r /var/log/pflog | mail admin(at)adminunix.ru && cat /dev/null > /var/log/pflog

Теперь пробуем проанализировать ваш конфиг:

[root@router /]#pfctl -nf /etc/pf.conf

если ошибок нет, значит все в порядке и можна загружать его в PF:

[root@router /]#pfctl -f /etc/pf.conf

Для большей безопасности я пересобираю ядро с поддержкой PF:

# Package Filter
options ALTQ
options ALTQ_CBQ
options ALTQ_RED
options ALTQ_RIO
options ALTQ_HFSC
options ALTQ_PRIQ
options ALTQ_NOPCC
device pf
device pflog
device pfsync

Вот вроде и всё.

Первоочередная возможность компьютера, находящегося в сети, будь то сервер, или просто рабочая станция, которая должна быть реализована — общий доступ к файлам. В Ubuntu это можно реализовать посредством различных протоколов. В этой заметке я расскажу о настройке SAMBA-сервера в Ubuntu Server 12.04 LTS для работы в домашней сети.

SAMBA — это open-source реализация протокола SMB/CIFS, который имеет Windows корни. Собственно поэтому наилучшим образом подходит для доступа к файлам с Windows-компьютеров. Все необходимое о настройке SAMBA и даже больше можно узнать в из статьей на сайте IBM developerWorks:

  1. [urlspan]Основные принципы[/urlspan],
  2. [urlspan]Управление учетными записями пользователей и групп[/urlspan],
  3. [urlspan]Управление доступом к файловой системе и общим ресурсам Linux[/urlspan],
  4. [urlspan]Аутентификация и авторизация[/urlspan],
  5. [urlspan]Конфигурация Samba[/urlspan],
  6. [urlspan]Файловые службы[/urlspan].

Итак, по порядку.

Установка

Делается командой:

sudo apt-get install samba

Подготовка и основные принципы

Прежде всего на сервере необходимо создать учетные записи пользователей, которые будут им пользоваться. Создавать их нужно дважды: учетную запись Linux и учетную запись Samba. Затем необходимо определить какие папки предоставлять для общего доступа, установить желаемые права доступа к файлам и пользоваться. Все просто, если не лезть в глубины конфигурации.
Для того чтобы все работало необходимо навести порядок с правами доступа к файлам на сервере. Чтобы сделать это нужно создать на сервере пользователей, соответствующих пользователям на компьютерах с которых будет производиться доступ к файлам сервера.

Добавляем учетную запись пользователя UNIX:

sudo useradd -c 'комментарий' -m user_name -g group_name

Здесь:
user_name — имя пользователя;
— g group_name — основная группа пользователя, от лица которой он будет производиться все действия пользователя, группа должна существовать;
— c 'комментарий' — комментарий к учетной записи;
— m указывает на необходимость создания домашней директории пользователя, если ее не существует (обычно это /home/user-name).

Создать группу можно командой groupadd:

sudo groupadd group_name

где group_name — имя создаваемой группы.

Если понадобиться изменять учетную запись пользователя, то делается это командой usermod, удаление — командой userdel. Аналогично и с группами: нужно использовать команды groupadd и groupadd соответственно, главное случайно не удалить всех пользователей из групп, имеющих права пользоваться командой sudo.

Добавляем учетную запись пользователя SAMBA

SAMBA умеет хранить информацию об учетных записях пользователей различными способами, мы будем использовать базу данных tdbsam. И если количество учетных записей на сервере меньше 250, то этого нам будет достаточно с головой.
Тут все делается командой smbpasswd. Для добавления учетной записи пользователя user_name:
sudo smbpasswd -a user_name
для удаления учетной записи пользователя пользователя user_name:
sudo smbpasswd -x user_name
После добавления учетной записи пользователя user_name, ее надо активировать командой:
sudo smbpasswd -e user_name
для деактивации учетной записи пользователя user_name:sudo smbpasswd -d user_name
После того, как с пользователями мы разобрались можно приступать непосредственно к настройке сервера.

Я написал bash-скрипт для добавления учетных записей UNIX и SAMBA:

#Добавляет пользователя в группу, группа должна существовать.
echo «Для добавления учетных записей пользователя Linux и SAMBA введите Имя Пользователя и Название его рабочей группы (группа должна существовать).»
user_name=""
while [ "${user_name}" = "" ]
do
echo Введите имя добавляемого пользователя:
read user_name
done
echo Введите название группы, в которую добавить пользователя:
read group_name
if [ "`cat /etc/group | grep ${group_name}`" = "" ]
then
Группы с таким именем не существует.
else
echo Добавление учетной записи пользователя ${user_name} в группу ${group_name}...
sudo useradd -m -g ${group_name} ${user_name}
echo Добавление учетной записи пользователя ${user_name} SAMBA...
sudo smbpasswd -a ${user_name}
echo Включение учетной записи SAMBA ${user_name}...
sudo smbpasswd -e ${user_name}
fi

bash-скрипт для добавления учетных записей UNIX и SAMBA

Запустить его можно командой:

sudo bash /path/script

где /path/script путь к скрипту.

Просмотр информации о пользователях и группах

Полезно знать как посмотреть информацию о всех учетных записях пользователей существующих в системе.
Информацию об учетной записи пользователя можно получить с помощью команды id:

id user_name

Информация об учетных записях UNIX хранится в файле /etc/passwd, каждая строка файла содержит информацию об одной из учетных записей, посмотреть его можно, например, командой:

cat /etc/passwd

Информация о группах UNIX хранится в файле /etc/group, посмотреть файл можно командой:

cat /etc/passwd

Информация об учетных записях SAMBA, хранящихся в базе данных получается командой:

sudo pdbedit -L

Настройка SAMBA-сервера

Настройки хранятся в файле smb.conf в папке /etc/samba. Для его редактирования можно воспользоваться командой:

sudo nano /etc/samba/smb.conf

Файл smb.conf  состоит из разделов, которые начинаются с названия, заключенного в квадратные скобки. Существуют три специальных раздела: global, homes и printers. Приведу цитату из статьи 5:

  • global. Все параметры, содержащиеся в этом разделе, влияют на работу всего сервера. При необходимости параметры раздела global можно переопределить на уровне общего ресурса.
  • homes . Этот раздел является шаблоном для домашних директорий пользователей; Samba самостоятельно сопоставляет имена пользователей в соответствии с настройками этого раздела, избавляя от необходимости настраивать отдельный общий ресурс каждый раз, когда необходимо предоставить пользователю доступ к его домашней директории.
  • printers. Этот раздел аналогичен разделу homes, но используется для принтеров.

Разделы с другими именами относятся к общим файловым ресурсам или принтерам.

В каждом разделе могут находиться те или иные параметры, список которых можно посмотреть на [urlspan]man-странице smb.conf[/urlspan].

Давайте посмотрим на файл smb.conf, который использовал я:

[global]
log file = /var/log/samba/log.%m
max log size = 2000
log level = 2
syslog = 2

passdb backend = tdbsam
passwd program = /usr/bin/passwd %U

obey pam restrictions = yes
pam password change = yes
unix password sync = yes
domain master = no
hosts allow = 192.168.1. 127.
dns proxy = no
workgroup = WORKGROUP
security = user
panic action = /usr/share/samba/panic-action %d

[HOMES]
; комментарий
comment = Home directories
; Доступ к директории только самим пользователям
valid users = %U
; запись разрешена?
writable = yes
; права создаваемых файлов и папок
create mask = 0600
directory mask = 0700
; отображать в списке ресурсов в сетевом окружении?
browseable = no

; общая папка SharedSpace, доступная всем для записи и чтения, гостевого доступа нет.
[SharedSpace]
; комментарий к создаваемой папке
comment = Public files
; путь к папке
path = /home/SharedFiles
; разрешаем запись всем
writable = yes
; права создаваемых файлов и папок
create mask = 0777
directory mask = 0777
; скрывать файлы, недоступные для чтения
hide unreadable = yes
; пользователи, которые имеют административные привилегии над ресурсом
admin users = admin_user

В данной конфигурации каждый пользователь будет видеть два общих ресурса: его домашнюю папку на сервере, доступную только ему и ресурс с именем SharedSpace, доступный всем пользователям. Символы с % являются заменяемыми переменными, и, например, %m заменяется на имя клиентского компьютера.
Далее указаны параметры на которые следует обратить особое внимание:
Раздел global:
passdb backend = tdbsam — указывает, что информацию об учетных записях пользователей будет храниться в базе данных tdbsam.
security = user — означает, что для пользования сервером пользователь должен «залогиниться» под имеющейся на сервере учетной записью для получения доступа к соответствующим общим ресурсам.
workgroup = WORKGROUP — рабочая группа, членом которой будет SAMBA-сервер.
Разделы homes и SharedSpace:
path = /path/to/resource — путь к общему ресурсу.
create mask, directory mask = 0777 — файлы и директории, соответственно, будут создаваться как минимум с указанными правами. Именно эти параметры устанавливают будут ли файлы и папки доступны для всех пользователей, только хозяев или их групп (подробнее о правах доступа к файлам в статье номер 3).
admin users = admin_user — пользователи, которые могут делать с ресурсом любые действия, независимо от установленных разрешений.

Процессы, отвечающие за работу сервера

Работа обеспечивается двумя демонами: smbd, обеспечивающий доступ к общим ресурсам, и
nmbd, обеспечивающий работу сетевой службы имен. Для вступления в действие изменений файла smb.conf необходим их перезапуск, это делается командами:

sudo restart smbd
sudo restart nmbd

Можно воспользоваться командами start и stop.

Итого

Здесь описана лишь малая часть возможностей, предоставляемых SAMBA, узнать о которых можно на сайте [urlspan] https://www.samba.org/[/urlspan]. Тем не менее, проделав описанные действия можно  реализовать один из множества способов общего доступа к файлам. Главным его достоинством является кроссплатформенность — будь у пользователя OS X, Windows или Linux, он сможет получить доступ к общим файлам.
Скорость доступа к серверу, реализованному указанным образом, может варьироваться в широких пределах: с Winsows-компьютера, по гигабитному проводу скорость загрузки на сервер больших файлов у меня около 60 Мб/с, с мака она раз в 10 меньше. Поэтому ограничивать общий доступ к файлам лишь SAMBA сервером имеет смысл, если у Вас дома все компьютеры имеют ОС Windows.

Уже была статья как поставили Alfresco на сервер. На тот момент была установлена версия 4.2.с. Сейчас уже вышла 4.2.e. Дошел до создания бизнес процессов в альфреско. Чтоб случайно не запортить установленную на сервере решил поставить себе на компьютер на локальную рабочую станцию, для чего еще и установить Ubuntu 12.04 вначале. Перед этим была установлена ALT Linux 6.0 Centaurus. Но общее впечатление от ALT Linux — какая то она кривая и не доделанная.
Continue Reading

В статье рассказано, как объединить два физических сетевых интерфейса в один
для увеличения пропускной способности или для повышения отказоустойчивости
сети. В Linux это делается при помощи модуля bonding и утилиты ifenslave. В
большинстве новых версий дистрибутивов модуль ядра bonding уже есть и готов к
использованию, в некоторых вам придется собрать его вручную. Я настраивал
данное решение на Ubuntu 8.04 server amd64, поэтому примеры установки ПО взяты оттуда.

Установим нужное ПО:

aptitude install ifenslave ethtool

Затем добавим модуль bonding в автозагрузку и пропишем опции для его запуска,
для этого в конец файла /etc/modules добавим текст из примера ниже, примеров
будет два: для создания одного интерфейса из двух физических и для создания
двух интерфейсов из четырех физических.

Подробнее о режимах работы bonding можно почитать
здесь.

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

alias bond0 bonding
options bonding mode=0 miimon=100

Пример для создания двух интерфейсов из четырех физических:

alias bond0 bonding
alias bond1 bonding
options bonding mode=0 miimon=100 max_bonds=2

Затем загрузим модуль bonding

## Один виртуальный интерфейс
modprobe bonding mode=0 miimon=100
## Два виртуальных интерфейса
modprobe bonding mode=0 miimon=100 max_bonds=2

Настроим параметры сетевых интерфейсов bonding`a, для этого отредактируем файл
настроек интерфейсов /etc/network/interfaces. В примере шаблоны для настройки
двух виртуальных интерфейсов.

# The bond0 network interface
auto bond0
allow-hotplug bond0
iface bond0 inet static
address
netmask
network
broadcast
gateway
dns-nameservers
dns-search
up /sbin/ifenslave bond0 eth0
up /sbin/ifenslave bond0 eth1

# The bond1 network interface
auto bond1
allow-hotplug bond1
iface bond1 inet static
address
netmask
network
broadcast
gateway
dns-nameservers
dns-search
up /sbin/ifenslave bond1 eth2
up /sbin/ifenslave bond1 eth3

Более подробно по опциям файла /etc/network/interfaces можно прочитать выполнив
команду man interfaces

После того как прописаны настройки интерфейсов нужно перезапустить сеть
командой /etc/init.d/networking restart и проверить, поднялись ли интерфейсы
bond0, и если настраивали два, то bond1.