ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Метки статьи: ‘FreeBSD’

Добро пожаловать в блог! Надеемся, что Вы еще вернетесь.

В помощь новичкам.

Итак, перед вами встала задача раздать Инет на компы за сервером FreeBSD.

Как и множество других вещей во FreeBSD эту задачу можно решить несколькими способами.

Кратко покажу как это можно сделать используя в кач-ве NAT`а процесс natd.

Запускать natd можно несколькими способами, я покажу тот который обычно использую я сам.

Для работы нам потребуются 2 вещи:

  1. firewall ipfw с его возможностью divert
  2. natd

Для того, чтобы приступить необходимо пересобрать ядро с опциями:

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPDIVERT

Так же можно добавить опции:

options IPFIREWALL_FORWARD
options IPFIREWALL_VERBOSE_LIMIT=1000
options IPFIREWALL_DEFAULT_TO_ACCEPT

Либо подгрузить ipfw как модуль:
/sbin/kldload /boot/kernel/ipfw.ko

Скажем что:

  • сетевая карта в сторону провайдера em0 c IP 10.10.1.2/30
  • сетевая карта в сторону локалки em1 с IP 192.168.1.1/24

Запустим процесс natd:

/sbin/natd -s -m -a 10.10.1.2

Процесс natd должен «висеть» на внешнем интерфейсе ВСЕГДА !

Добавим необходимые правила в ipfw, для того, чтобы трафик попадал в natd:

/sbin/ipfw add 300 divert 8668 ip from any to 10.10.1.2
/sbin/ipfw add 310 divert 8668 ip from 192.168.1.0/24 to any
/sbin/ipfw add 350 allow ip from any to 192.168.1.0/24
/sbin/ipfw add 360 allow ip from 192.168.1.0/24 to any

Этих 4-х правил достаточно, чтобы дать доступ в интернет подсети 192.168.1.0/24.

Для того, что бы после ребута, все это поднялось, можно сделать следущее.

1. отредактировать файл /etc/rc.conf добавив:

firewall_enable=»YES»
firewall_script=»/etc/rc.firewall»
firewall_type=»/usr/local/etc/firewall.conf»
firewall_quiet=»YES»
firewall_logging=»YES»
firewall_flags=»»

2. написать наши правила в /usr/local/etc/firewall.conf:

add 100 allow ip from me to me via lo0
add 105 deny ip from any to any via lo0
add 300 divert 8668 ip from any to 10.10.1.2
add 310 divert 8668 ip from 192.168.1.0/24 to any
add 350 allow ip from any to 192.168.1.0/24
add 360 allow ip from 192.168.1.0/24 to any
add 65000 allow ip from any to any

3. создать файл /usr/local/etc/rc.d/natd.sh:

#!/bin/sh
/sbin/natd -s -m -a 10.10.1.2

4. сделать файл /usr/local/etc/rc.d/natd.sh исполняемым:

/bin/chmod a+x /usr/local/etc/rc.d/natd.sh

Можно поступить и немного по другому, запустив natd на интерфейсе, а не на IP-адресе:

отредактировать файл /etc/rc.conf добавить:

natd_program=»/sbin/natd» # path to natd, if you want a different one.
natd_enable=»YES» # Enable natd (if firewall_enable == YES).
natd_interface=»em0″ # Public interface or IPaddress to use.
natd_flags=»» # Additional flags for natd.

изменить правило номер 300 на:

add 300 divert 8668 ip from any to any via em0

Для полного понимания загляните в мануалы:

man natd
man ipfw
Там есть подробное описание и примеры.

З.Ы. В FreeBSD 7.x можно использовать kernel nat, но лб этом как нить потом или кратко если в разделе "Советы" на сайте.
З.З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 4, среднее: 4,25 из 5)
Загрузка...
Отправить на почту Отправить на почту

Наткнулся в Инете, возьмем на заметочку. Надо будет как нить попробовать 🙂

И еще раз переписал firewall …

1. Зачем это надо?
1.1 Уменьшение русрсов процессора, «поедаемого» tasq, поцессом отвечающим за обработку трафика проходящим ч/з интерфейсы em
1.2 Отимизация правил IPFW
1.3 Возможность изменять список безлимитных клиентов без перезагрузки списка правил полностью.
1.4 Снятие ограничений на варианты возможных тарифных планов.
1.5 Устранение задержки при прохождении пакетами через pipe и queue при использовании ipfw.

Извините друзья — спать хочу, комментариев будет мало:
2. Как работает:
2.1 Для каждого абонента должна быть создана отдельная нода в netgraph с заданной пропускной способностью;
2.2 Абоненты «загоняются» в соответствующие ноды, по номерам хуков (tablearg) в таблицах. Последнее возможно без особых трудностей, поскольку ipfw имеет собственную ноду в netgraph.

Пока рассматривается случай только с одним абонентом в таблице — тариф 64Kbit/s.
>cat /etc/rc.firewall
#!/bin/sh
# 1. Global variables
# 1.1 My Interfaces
# 1.1.1 Uplink interface
uif=»fxp1″
unet=»194.128.23.252/30″
uip=»194.128.23.253″

# 1.1.2 Client Interface
cif=»fxp0″
cnet=»172.16.2.252/30″
cip=»172.16.2.253″

# 1.1.3 Contol Interface
mif=»vr0″
mnet=»192.168.23.0/24″
mip=»192.168.23.71″

# 1.2 IPFW executable
fwcmd=’/sbin/ipfw -q’

# 2. Functions (empty by now)
# Suck in tables
if [ -r /etc/rc.firewall.d/unlim64.conf ]; then
. /etc/rc.firewall.d/unlim64.conf
fi

# 3. Default ruleset
# 3.1 Flushing all rules
echo «Flushing all rules.»
${fwcmd} -f flush
${fwcmd} -f pipe flush

# 3.2 Shaper
# 3.2.1 Rules :: Shape IT
# Outgoing traffic — NG_CAR Upstream
${fwcmd} add netgraph tablearg ip from «table(11)» to any out via ${uif}
# Incoming traffic — NG_CAR Downstream
${fwcmd} add netgraph tablearg ip from any to «table(10)» out via ${cif}

>ipfw table 10 list
172.16.2.248/29 14

>ipfw table 11 list
172.16.2.248/29 15

Конфигурируем ноду в netgraph:
>kldload ng_ipfw
>kldload ng_car
>ngctl:
mkpeer ipfw: car 14 upper
name ipfw:14 rate_64
connect rate_64: ipfw: lower 15


Конфигурируем пропускную способность ноды:
# Аналог Cisco Rate-Limit
msg rate_64: setconf { upstream={ cbs=8192 ebs=8192 cir=65536 greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=8192 ebs=8192 cir=65536 greenAction=1 yellowAction=1 redAction=2 mode=2 } }

# Аналог Cisco Traffic Shape:
msg rate_64: setconf { upstream={ cbs=8192 ebs=8192 cir=65536 greenAction=1 yellowAction=1 redAction=2 mode=3 } downstream={ cbs=8192 ebs=8192 cir=65536 greenAction=1 yellowAction=1 redAction=2 mode=3 } }

В первом случае:
если полоса не забита:
>ping -s 1472 -i 0.2 -c 200 -S 172.16.2.250 194.128.23.254

200 packets transmitted, 200 packets received, 0% packet loss
round-trip min/avg/max/stddev = 1.246/1.340/1.576/0.048 ms


при переполнении полосы:
>ping -s 1472 -i 0.1 -c 200 -S 172.16.2.250 194.128.23.254

200 packets transmitted, 117 packets received, 41% packet loss
round-trip min/avg/max/stddev = 1.150/1.309/1.495/0.061 ms

То есть как и положено — срезаются пики нагрузки при использовании RateLimit.

Во втором случае:

если полоса не забита:
>ping -s 1472 -i 0.2 -c 200 -S 172.16.2.250 194.128.23.254

200 packets transmitted, 200 packets received, 0% packet loss
round-trip min/avg/max/stddev = 1.246/1.340/1.576/0.048 ms


при переполнении полосы:
>ping -s 1472 -i 0.1 -c 200 -S 172.16.2.250 194.128.23.254

PING 194.128.23.254 (194.128.23.254) from 172.16.2.250: 1472 data bytes
1480 bytes from 194.128.23.254: icmp_seq=0 ttl=63 time=1.585 ms
1480 bytes from 194.128.23.254: icmp_seq=1 ttl=63 time=1.247 ms
1480 bytes from 194.128.23.254: icmp_seq=2 ttl=63 time=1.211 ms
1480 bytes from 194.128.23.254: icmp_seq=3 ttl=63 time=1.306 ms
1480 bytes from 194.128.23.254: icmp_seq=4 ttl=63 time=1.269 ms
1480 bytes from 194.128.23.254: icmp_seq=5 ttl=63 time=1.233 ms
1480 bytes from 194.128.23.254: icmp_seq=6 ttl=63 time=1.319 ms
1480 bytes from 194.128.23.254: icmp_seq=7 ttl=63 time=1.289 ms
1480 bytes from 194.128.23.254: icmp_seq=8 ttl=63 time=1.246 ms
1480 bytes from 194.128.23.254: icmp_seq=9 ttl=63 time=1.217 ms
1480 bytes from 194.128.23.254: icmp_seq=10 ttl=63 time=5.671 ms
1480 bytes from 194.128.23.254: icmp_seq=11 ttl=63 time=87.592 ms
1480 bytes from 194.128.23.254: icmp_seq=12 ttl=63 time=170.640 ms
1480 bytes from 194.128.23.254: icmp_seq=13 ttl=63 time=252.565 ms
1480 bytes from 194.128.23.254: icmp_seq=14 ttl=63 time=334.611 ms
1480 bytes from 194.128.23.254: icmp_seq=15 ttl=63 time=416.532 ms
1480 bytes from 194.128.23.254: icmp_seq=16 ttl=63 time=499.581 ms
1480 bytes from 194.128.23.254: icmp_seq=17 ttl=63 time=581.503 ms
1480 bytes from 194.128.23.254: icmp_seq=18 ttl=63 time=663.551 ms
1480 bytes from 194.128.23.254: icmp_seq=19 ttl=63 time=745.473 ms
1480 bytes from 194.128.23.254: icmp_seq=20 ttl=63 time=828.516 ms

То есть как и положено — растет задержка при использовании Traffic Shape.

Как все это автоматизировать — пока понятия не имею, в netgraph не разобрался до конца.

3. Что читать чтобы до конца разобраться:
Про классовые и бесклассовые дисциплины обслуживания очередей.
man 8 ipfw
Все о Netgraph
man 4 netgraph
man 4 ng_ipfw
Cisco — QOS для начинающих
man 4 ng_car
Заголовочные файлы к коду ng_car

Автор: Дмитрий Шевченко

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 5, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Недавно возникла задача сохранять письма уходящие и приходящие на mail сервер.

Было решено, что по входящим письмам буду сохраняться, только те, которые приходят к существующим на mail сервере ящикам, а исходящие будут сохраняться все.

Входящие:

Вариант backup`а через копирование во «второй ящик»:

1. Имеем ящик root@domain.ru и соответственно папку ящика

/var/qmail/popboxes/domain-ru/root/Maildir/

2. создаем backup папку для ящика

/var/qmail/popboxes/domain-ru/root_BAK/Maildir/

3. в файле /var/qmail/popboxes/domain-ru/root/.qmail основного ящика пишем:

|/var/qmail/bin/mailquotacheck
./../root_BAK/Maildir/
./Maildir/

где:

  • первая строка это проверка квоты ящика
  • второй строкой как раз кладем копию письма в backup папку
  • и третья доставка письма в основной ящик

4. в файле .qmail backup ящика можно вообще уже ничего не писать

Итог: получаем точную копию письма в backup папке, которое приходит и доставляется для root@domain.ru

Исходящие:

В Qmail FAQ можно прочитать:

Что такое QUEUE_EXTRA?

QUEUE_EXTRA - статическая переменная, которая определяет дополнительного получателя,
который будет добавлен к каждой доставке. Это используется, прежде всего, для логов.
Например, FAQ описывает, как использовать QUEUE_EXTRA, чтобы сохранить копии всех
приходящих и уходящих сообщений.Дляљ использования QUEUE_EXTRA, отредактируйте файл
extra.h определив дополнительного получателя в формате "Trecipient\0", и длину строки
QUEUE_EXTRA в QUEUE_EXTRALEN ( "\0" считается за один символ).
Например:

#define QUEUE_EXTRA "Tlog\0"
#define QUEUE_EXTRALEN 5

Остановите qmail, если он запущен.

Если вы установили скрипт qmail из раздела <Установка> то можете выполнить:
/usr/local/sbin/qmail stop

Если у вас нет скрипта qmail, Вы должны использовать свой скрипт включения/выключения
или послать процессу qmail-send сигнал TERM
Для компиляции qmail:
make setup check
Заполните ~alias/.qmail-log в зависимости от того, что хотите регистрировать.
Например, для регистрации Message-ID:|
 awk '/^$/ { exit } /^[mM][eE][sS][sS][aA][gG][eE]-/ { print }'

И наконец, перезапустите qmail.

Поясню, т.к. лично я "наступил на грабли":

#define QUEUE_EXTRA «Tlog\0» — локальный (!) ящик log для копии письма
#define QUEUE_EXTRALEN 5 — длина QUEUE_EXTRA:

Т(равно 1 символ) + log (равно 3 символа) + \0 (равно 1 символ) = 5 символов

В файл .qmail (/var/qmail/popboxes/domain-ru/log/.qmail), локального ящика log, помещаем вызов внешнего скрипта с передачей письма ему :

| /root/save_mail.pl

Ну и сам скрипт:

#!/usr/bin/perl
my $in=join(" ",<STDIN>);
open F,">/path/sample.txt";
print F $in;
close F;

Он сохранит письмо в текстовый файл /path/sample.txt. Вы можете дописать скрипт, чтобы он разбирал письмо, копировал письмо в соответствующую подпапку и .т.д. и т.п. Вообщем творим, что хотим.

На /path нужно выставить права owner ящика, смотрим owner`а:

ls -la /var/qmail/popboxes/domain-ru/log
total 8
drwx------  3 popuser  qmail  512 Dec  4 13:01 .
drwxr-xr-x  6 popuser  qmail  512 Dec  4 18:39 ..
-rw-------  1 popuser  qmail   41 Dec  4 13:01 .qmail
drwx------  5 popuser  qmail  512 Jul 11 10:15 Maildir

Выставляем права:

chown -R popuser:qmail /path

Вот и все.

=================

Заметка

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

Допустим что ящик для всей почты домена mydomain.ru будет называться «default». Для этого добавим в файл /usr/symlinks/qmail/users/assign строчку:

+mydomain-ru-:popuser:888:82:/var/qmail/popboxes/mydomain-ru/default:::

Обратите внимание на символ «» в конце.

Затем создадим файл dot-qmail /usr/symlinks/qmail/popboxes/yamaika-ru/default/.qmail-default с адресом почты, куда пересылать письма:
&mailbox@someotherdomain.ru

Теперь вся почта (на любой ящик) домена mydomain.ru будет сначала попадать в ящик default@mydomain.ru, а затем пересылаться на  mailbox@someotherdomain.ru.

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Авторы: Николаев Дмитрий (virus (at) subnets.ru) и Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 2, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Реализация простого автоответчика, хранящего ответ в MySQL. Всякого рода защиты отсутствуют, возможно добавлю для чистоты.

Если адрес присуствует в таблице autoreply и на этот адрес поступит почта, то отправителю будет отправлено уведомление, текст которого берется из таблицы message.

MySQL:

CREATE TABLE IF NOT EXISTS `autoreply` (
`id` int(100) NOT NULL AUTO_INCREMENT,
`recipient` varchar(50) NOT NULL DEFAULT '',
`message` longtext CHARACTER SET cp1251 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM
;

exim.conf

Transport:

userautoreply:
driver = autoreply
from = ${local_part}@${domain}
reply_to = ${local_part}@${domain}
to = ${sender_address}
subject = AutoReply Re: ${rfc2047:$h_Subject:}
text = ${lookup mysql{SELECT message FROM autoreply WHERE recipient='${local_part}@${domain}'}}

Router:

userautoreply:
driver = accept
condition = ${if eq{} {${lookup mysql{SELECT recipient FROM autoreply \
WHERE recipient='${local_part}@${domain}'}}}{no}{yes}}
senders = " ! ^.*-request@.*:\
! ^owner-.*@.*:\
! ^postmaster@.*:\
! ^listmaster@.*:\
! ^mailer-daemon@.*\
! ^root@.*\
! ^noreply@.*"
no_expn
no_verify
transport = userautoreply
unseen

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: makky
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 3, среднее: 4,33 из 5)
Загрузка...
Отправить на почту Отправить на почту

По-моему мнению, рассылки внутри компании и не только? очень удобная вещь.

Я приведу организацию простейшего случая, но весьма нужного (всем кому давал — очень понравилось =))

Поставьте в acl_check_rcpt:

deny    !authenticated  = *
local_parts     = all

А то спамить удобно будет =)

Router:

virtual_allusers:
driver = redirect
allow_fail
allow_defer
condition = ${if eq {$local_part}{all}{yes}{no}}
data = ${lookup mysql{SELECT CONCAT(login,"@",domain) FROM users}}

секция rewrite:

all@domain $1@domain F

Таким образом, посылая письмецо на all@domain, его получат все. Перебивать заголовки необязательно, но тогда при ответе на такое письмо, ответ получат все, что иногда приводило к появлению неприятных ситуаций.

Enjoy it! ;)

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: makky
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 2, среднее: 4,00 из 5)
Загрузка...
Отправить на почту Отправить на почту