Полезное:


Главная / How-To / SysAdmin / Заметки от opennet.ru
Заметки от opennet.ru

   Администратору [4]
      Сетевая подсистема, маршрутизация [11]
         Ethernet, ARP, привязка MAC адресов. [22]
         NAT, трансляция адресов [16]
         PPP, PPTP, PPPOE [9]
         Policy routing [8]
         Wifi, настройка беспроводного доступа [6]
         Ограничение трафика [10]
         Пакетные фильтры и фаерволы [0]
            Пакетные фильтры в Linux: iptables, ipchains [23]
            Пакетный фильтр в FreeBSD: ipfw, IP-Filter [35]
         Проблемы работы сети [10]
         Туннелинг, VPN, VLAN [23]
      Сетевые сервисы [4]
         DNS [13]
         FTP [7]
         INN [2]
         Mail, почта [17]
            Безопасность и установка ограничений [12]
            Борьба со спамом, фильтрация почты [21]
            Отправка и пересылка сообщений на уровне пользователя [5]
         NFS [1]
         SNMP [2]
         Samba [23]
         Socks proxy [8]
         WWW, Apache httpd [19]
            Ограничение доступа и ресурсов, безопасность [16]
            Оптимизация и тюнинг Apache [5]
            Редирект, mod_rewrite [11]
         Прокси сервер Squid [12]
            ACL, ограничения трафика и пользователей [12]
      Система [9]
         FreeBSD специфика [48]
            Сис. информация, оптимизация и тюнинг FreeBSD [17]
            Увеличение безопасности FreeBSD [7]
            Установка и апгрейд FreeBSD и приложений. [38]
         Linux специфика [32]
            Оптимизация и тюнинг в Linux [19]
            Увеличение безопасности Linux [6]
            Установка и работа с пакетами программ в Linux [34]
         OpenBSD [3]
         Solaris специфика [9]
         Syslog, ведение логов [13]
         Диски и файлы [33]
            CD-ROM, CD-R, AudioCD: [0]
            RAID массивы [9]
            Ramdisk, tmpfs [2]
            Диагностика и Восстановление после сбоя [13]
            Квоты [3]
            Монтирование [23]
            Резервное копирование [9]
            Файловые системы [15]
         Загрузка, однопользовательский режим [8]
         Поддержка аппаратного обеспечения [33]
         Просмотр состояния и мониторинг системы [30]
         Установка и синхронизация времени [2]
   Безопасность [4]
      Ограничение доступа и безопасность Apache: [0]
      ipfw, IP-Filter: [0]
      iptables, ipchains: [0]
      Безопасность почтовой подсистемы: [0]
      Увеличение безопасности FreeBSD: [0]
      Увеличение безопасности Linux: [0]
      SSH [9]
      Виртуализация - Xen, OpenVZ, KVM, Qemu [8]
      Помещение программ в chroot [9]
      Шифрование, PGP [20]
   Маршрутизаторы Cisco, VoIP [21]
      AAA, контроль dial-up пользователей [3]
      ACL, ограничение доступа, безопасность [8]
      VoIP [4]
      Настройка маршрутизации (BGP, OSPF, RIP) [4]
      Ограничение и учет трафика на Cisco [9]
   Пользователю [6]
      Работа с электронной почтой: [0]
      CD, CD-R, DVD, AudioCD [30]
      Wine [4]
      X Window [48]
      Запись и обработка звука [7]
      Карманные ПК [5]
      Обработка изображений и видео [20]
      Особенности работы с CPU от AMD [2]
      Печать [6]
      Работа в консоли [14]
      Работа с Web и Ftp [16]
      Редактирование текстов [14]
      Русификация [28]
      Файлы, копирование, архивация [21]
   Программисту и web-разработчику [3]
      C/C++, сборка, отладка [11]
      CVS [8]
      PHP [5]
         Regex (регулярные выражения) [5]
         Конструкции языка и функции [5]
         Серверная часть и интерпретатор [9]
      Perl [8]
         CGI [9]
         Regex (регулярные выражения) [7]
         Массивы и Хэши [10]
         Отладка программ на Perl [2]
         Переменные в Perl [8]
         Полезные подпрограммы на Perl [14]
            Обработка изображений на Perl [4]
            Подпрограммы для WEB [3]
            Работа с сетью и IP адресами на Perl [7]
         Работа с файлами [5]
         Работа с электронной почтой [5]
         Работа со временем и датами [7]
         Функции и модули в Perl [10]
      SQL и базы данных [7]
         MySQL специфика [12]
            Оптимизация и администрирование MySQL [27]
         PostgreSQL специфика [22]
            PlPerl и PlSQL [5]
            Оптимизация и администрирование PostgreSQL [22]
      Shell [23]
         Готовые скрипты [18]
      Web-технологии [7]
         CGI на Perl: [0]
         CSS и оформление с использованием стилей [5]
         HTML [7]
         JavaScript [8]

   Администратору

Клонирование дисков во FreeBSD, используя снапшоты ФС   Автор: [есть мнение]
 
Создаем снапшот test1 раздела /home

   mount -v -u -o snapshot /home/snapshot/test1 /home

или другой метод:

   mksnap_ffs /home /home/snapshot/test1

Привязываем снапшот к устройству /dev/md1:

   mdconfig -a -t vnode -f /home/snapshot/test1 -u 1

При необходимости снапшот можно смонтировать и посмотреть его содержимое:

   mount -o ro /dev/md1 /mnt
   ....
   umount /mnt

Копируем содержимое раздела на второй диск:


   dd if=/dev/md1 of=/dev/ad4s1f bs=16k

Отключаем снапшот

   mdconfig -d -u 1

Выполняем fsck на новом разделе:

   fsck -f /dev/ad4s1f
 
Как избавиться от нечитаемых секторов на диске   Автор: [есть мнение]
 
В логе smartd появились подобные свидетельства наличия нечитаемых секторов на диске:

   smartd[798]: Device: /dev/ad5, 15 Currently unreadable (pending) sectors
   smartd[798]: Device: /dev/ad5, 15 Offline uncorrectable sectors

SMART тестирование подтвердило подозрения:

   Запускаем фоновый тест диска, не мешающий основной работе:
      smartctl -t long /dev/ad5
   Ждем завершения периодически просматривая статус:
      smartctl -l selftest /dev/ad5
   В итоге смотрим содержимое лога, в самом конце вывода:
      smartctl -a /dev/ad5
   Имеем:
   # 1  Extended offline  Completed: read failure  90% 2916 10373954


Выявляем полный список сбойных секторов, путем чтения всех данных с диска:

   dd if=/dev/ad5 of=/dev/null bs=512 conv=noerror,sync

В один прекрасный момент появятся надписи вида:

   dd: /dev/ad5: Input/output error
   10373954+0 records in
   10373954+0 records out
   5311464448 bytes transferred in 2427.397393 secs (2188131 bytes/sec)

В системном логе увидим:

   kernel: ad5: TIMEOUT - READ_DMA retrying (1 retry left)  LBA=10373954
   kernel: ad5: TIMEOUT - READ_DMA retrying (0 retries left) LBA=10373954
   ....
   kernel: ad5: FAILURE - READ_DMA timed out LBA=10374109
   kernel: ad5: TIMEOUT - READ_DMA retrying (1 retry left) LBA=10374113

Проверяем, каждый участок еще раз:

   dd if=/dev/ad5 of=/dev/null bs=512 count=1 skip=10373954 conv=noerror,sync

Смотрим какой файл в ФС подпадает под этот блок.

Смотрим и примерно вычисляем номер раздела на который приходится сбойный сектор (LBA 10373954):


   fdisk -s /dev/ad5

   /dev/ad5: 775221 cyl 16 hd 63 sec
   Part        Start        Size Type Flags
   1:          63   398444067 0xa5 0x80
   2:   398444130   382973535 0xa5 0x80

10373954 - 63 = 10373891

   disklabel /dev/ad5s1

   # /dev/ad5s1:
   8 partitions:
   #        size   offset    fstype   [fsize bsize bps/cpg]
     a:  2097152        0    4.2BSD     2048 16384 28552 
     b:  4194304  2097152      swap                    
     c: 398444067        0    unused    0  0 # "raw" part
     d:  2097152  6291456    4.2BSD     2048 16384 28552 
     e: 10485760  8388608    4.2BSD     2048 16384 28552 
     f: 104857600 18874368    4.2BSD     2048 16384 28552 
     g: 104857600 123731968    4.2BSD     2048 16384 28552 
     h: 162127234 228589568    4.2BSD     2048 16384 28552 

Видим, что 10373891 приходится на раздел /dev/ad5s1e
Расчитываем смещение относительно начала раздела:
10373891 - 8388608 = 1985283

Находим иноду, которой принадлежит заданный блок:
   fsdb -r /dev/ad5s1e
   findblk 1985283


повторяем для каждого сбойного сектора 
(для Linux нужно использовать debugfs - http://smartmontools.sourceforge.net/BadBlockHowTo.txt)

Пытаемся записать данные в сбойный сектор, чтобы инициировать процесс
ремапинга на диске.

    sysctl kern.geom.debugflags=16 # иначе будет dd: /dev/ad5: Operation not permitted)
    dd if=/dev/zero of=/dev/ad5 bs=512 count=1 skip=10373954 conv=noerror,sync
    sysctl kern.geom.debugflags=0

Если после записи сектор начал читаться - все ok, 

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

   man badsect

  /dev/ad5s1e примонтирован как /usr, создаем директорию /usr/BAD и выполняем
  badsect /usr/BAD 1985283
  fsck -y /dev/ad5s1e

Полезные порты:
   /usr/ports/sysutils/recoverdm 
   /usr/ports/sysutils/diskcheckd
 
Почему на нагруженных серверах лучше использовать SCSI диски, а не IDE.   Автор: [есть мнение]
 
1. Качество исполнения, запас прочности и надежность накопителей со SCSI
интерфейсом как правило выше, чем у IDE.

2. Два подключенных к одному каналу контроллера IDE накопителя, не могут
одновременно передавать данные по шине.

3. SCSI показывают значительно лучшую производительность в загруженной
многозадачной среде, при обилии разрозненных параллельных запросов за
счет более оптимального использования шины передачи данных. (конек IDE -
линейное чтение, сильная сторона SCSI - случайный доступ).

Поясняю: Специфика IDE такова, что запросы могут передаваться по одной
шине последовательно (одна труба передачи данных, однопоточный режим).
Допустим, если 100  процессов обращаются к данным на диске, запросы в
рамках одного канала контроллера будут обрабатываться один за другим, каждый
следующий после полного выполнения  предыдущего (связка: выдача
команды - получение данных).

При  использовании SCSI, допускается перекрытие запросов (организуется
очередь команд), ответы при этом  будут получены распараллеленно
(асинхронная передача), при этом устройство
заведомо зная подробности  по командам находящимся в очереди, производит
оптимизацию самостоятельно - минимизируя движение головок.
 
expect для автоматизации операций требующих ручного ввода   Автор: [обсудить]
 
#!/usr/bin/expect -f # Забор файла по FTP
spawn ftp ftp.test.ru
expect  "Name*:" { send "ftp\n"}
expect  "Password:" { send "ftp@\n"}
expect "ftp>" {send "bin\n"}
expect "ftp>" {send "prompt no\n"}
expect "ftp>" {send "cd /pub/store\n"}
expect "ftp>" {send "get arc.tar.gz\n"}
expect "ftp>" {send "exit\n"}

#!/usr/bin/expect -f # Выполнение операции используя telnet
spawn telnet cisco.test.ru
expect  "login:" { send "adm\n"}
expect  "Password:" { send "пароль\n"}
expect "#" {send "show users\n"}
expect "#" {send "exit\n"}

 

   Сетевая подсистема, маршрутизация

Подключение FreeBSD к IPv6 - поднимаем туннель через IPv4-сети провайдера (1)   Автор: Litos  [есть мнение]
 
Итак, пришло время поднять IPv4-IPv6 gateway, чтобы ходить в мир "другого интернета", коим он скоро будет.

Самым простым способом получить IPv6 адрес оказалось получить подключение от http://go6.net

Идем на этот сайт и регистрируемся http://go6.net/4105/register.asp


Тут же они предлагают скачать софт и поставить, например для Windows вида "скачай и запусти"
http://go6.net/4105/download.asp

Но это не совсем наш метод, мы будем подключать сервер на FreeBSD 7.0 к этой сети.

Ядро у нас собрано с поддержкой IPV6, т.е. с options INET6 (ядро GENERIC уже 
поддерживает этот протокол и если вы его не отключали, значит, он у вас есть)

Итак, ставим клиента, то, что они предлагают скачивать - есть в портах

   Port:   gateway6-5.0_2
   Path:   /usr/ports/net/gateway6
   Info:   Gateway6 Tunnel Setup Protocol Client - Free IPv6 tunnel
   B-deps:
   R-deps:
   WWW:    http://www.go6.net/



Приступаем к установке:

   cd /usr/ports/net/gateway6
   make install clean

Буквально через несколько минут клиент будет установлен

Отредактируйте его конфигурационный файл /usr/local/etc/gw6c.conf

   userid=
   passwd=

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

На этом начальная настройка закончена, для дальнейшей настройки читайте документацию.

Как я понял, выдается целая сеть и для авторизованных пользователей http://go6.net/4105/freenet.asp, 
тем самым можно все компьютеры дома подключить на реальные статические IPv6 адреса.

   server=broker.freenet6.net

broker.freenet6.net - это имя сервера для подключения (написано в письме при регистрации)


   # Включить использование авторизации
   auth_method=any

   # Писать логи в syslogd
   log_syslog=3

Теперь осталось запустить его

   echo 'gateway6_enable="YES"' >> /etc/rc.conf
   /usr/local/etc/rc.d/gateway6 start

И смотрим

   # tail -f /var/log/messages
   Oct 17 18:39:38 lola gw6c: Gateway6 Client v5.0-RELEASE build Oct 17 2008-14:56:32
   Oct 17 18:39:38 lola gw6c: Establishing connection to tunnel broker broker.freenet6.net using reliable UDP.
   Oct 17 18:39:42 lola gw6c: Connection to broker.freenet6.net established.
   Oct 17 18:39:45 lola gw6c: Authentication success.
   Oct 17 18:39:45 lola gw6c: Got tunnel parameters from server. Setting up local tunnel.
   Oct 17 18:39:45 lola gw6c: Executing configuration script: /bin/sh "/usr/local/share/gateway6/freebsd.sh".
   Oct 17 18:39:46 lola gw6c: Script completed successfully.
   Oct 17 18:39:46 lola gw6c: Your IPv6 address is 2001:05c0:8fff:fffe:0000:0000:0000:c243.
   Oct 17 18:39:46 lola gw6c: The tunnel type is v6udpv4.


   # ifconfig

   tun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1280
        inet6 2001:5c0:8fff:fffe::c243 --> 2001:5c0:8fff:fffe::c242 prefixlen 128
        Opened by PID 873

   # traceroute6 www.jp.freebsd.org
   ...
   # ping6 www.jp.freebsd.org
   ...

Все прекрасно работает не смотря на то, что выход осуществляется в мир через  
NAT на модеме.

Итак, осталось только понять, "зачем это надо", но ясно одно - за этим будущее. 
А еще можно посмотреть на танцующую черепаху на http://www.kame.net/ :-)

Также рекомендую прочитать документацию (главу в 
HandBook http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/network-ipv6.html) 
по поддержке протокола IPv6 в системе FreeBSD.

 
Пример настройки ng_neflow для нескольких интерфейсов.   Автор: stalex  [есть мнение]
 
#cat ng5_netflow.sh

   #!/bin/sh

   kldload ng_netflow
   kldload ng_ether
   kldload ng_tee
   kldload ng_one2many

   /usr/sbin/ngctl -f- <<-SEQ
     mkpeer em2: tee lower right
     connect em2: em2:lower upper left
     name em2:lower em2_tee
     mkpeer  em2:lower netflow  right2left iface0
     name em2:lower.right2left netflow
     msg netflow: setifindex { iface=0 index=1 }
     connect em2:lower netflow: left2right iface1
     msg netflow: setifindex { iface=1 index=1 }

     mkpeer vlan254: tee lower right
     connect vlan254: vlan254:lower upper left
     name vlan254:lower vlan254_tee
     connect vlan254:lower netflow:  right2left iface3
     msg netflow: setifindex { iface=3 index=1 }
     connect vlan254:lower netflow: left2right iface4
     msg netflow: setifindex { iface=4 index=1 }

     mkpeer vlan22: tee lower right
     connect vlan22: vlan22:lower upper left
     name vlan22:lower vlan22_tee
     connect vlan22:lower netflow:  right2left iface5
     msg netflow: setifindex { iface=5 index=1 }
     connect vlan22:lower netflow: left2right iface6
     msg netflow: setifindex { iface=6 index=1 }


     mkpeer vlan21: tee lower right
     connect vlan21: vlan21:lower upper left
     name vlan21:lower vlan21_tee
     connect vlan21:lower netflow:  right2left iface7
     msg netflow: setifindex { iface=7 index=1 }
     connect vlan21:lower netflow: left2right iface8
     msg netflow: setifindex { iface=8 index=1 }

     mkpeer netflow: ksocket export inet/dgram/udp
     msg netflow:export connect inet/127.0.0.1:20001
   SEQ
 
Прозрачный редирект порта, используя xinetd и netcat (1)   Автор: [есть мнение]
 
После переноса сервиса на новый сервер, на старом можно организовать сервис заглушку, 
осуществляющий редирект следующим образом:

/etc/xinetd.d/smtp-tcp

   service smtp
   {
        disable = no
        socket_type     = stream
        protocol        = tcp
        user            = nobody
        wait            = no
        server          = /bin/nc
        # server          = /usr/bin/netcat
        server_args     = -w 2 192.168.1.1 25
   }

где 192.168.1.1 адрес нового сервера, nc - утилита netcat, "-w 2" - таймаут в 2 сек.
 
Изменение имени сетевого интерфейса в Linux   Автор: NuclearCat  [есть мнение]
 
/sbin/ifconfig ppp1 down
/sbin/ip link set ppp1 name my_ppp
/sbin/ifconfig my_ppp up
 
Статические маршруты через isc-dhcpd   Автор: Артем Бохан  [есть мнение]
 
Согласно RFC 3442 через dhcp можно отдавать таблицу маршрутизации.
Изначально эта опция не поддерживается isc-dhcpd, но опцию можно добавить.

Пример:

  option classless-route code 121 = string;
  option classless-route 18:c0:a8:ea:c0:a8:00:05;

пример получения кода, взято с 
http://rfc3442svc.sourceforge.net/isc-dhcpd-configuration.html

#!/usr/bin/perl

use strict;

# Usage:
#   make_classless_option({ "subnet/mask" => "router", "subnet/mask" => "router", ... });
#     subnet   the subnet address, 4 dot-separated numbers
#     mask     the subnet mask length (e.g. /24 corresponds to 255.255.255.0, /8 corresponds to 255.0.0.0)
#     router   the router address, 4 dot-separated numbers
sub make_classless_option
{
    my $routes = shift;
    my ($s1, $s2, $s3, $s4, $len, @bytes, $net, $mask, $destination, $router);

    $len = 2;
    @bytes = ();
    foreach $destination(keys %{$routes}) {
        ($net, $mask) = split('/', $destination);
        $router = $routes->{$destination};
        ($s1, $s2, $s3, $s4) = split(/\./, $net);
        push(@bytes, sprintf('%02x', $mask));
        push(@bytes, sprintf('%02x', $s1));
        push(@bytes, sprintf('%02x', $s2)) if($mask > 8);
        push(@bytes, sprintf('%02x', $s3)) if($mask > 16);
        push(@bytes, sprintf('%02x', $s4)) if($mask > 24);
        ($s1, $s2, $s3, $s4) = split(/\./, $router);
        push(@bytes, sprintf('%02x', $s1));
        push(@bytes, sprintf('%02x', $s2));
        push(@bytes, sprintf('%02x', $s3));
        push(@bytes, sprintf('%02x', $s4));
    }


    return join(':', @bytes);
}

# Sample usage

print make_classless_option({
        "172.16.0.0/12" => "10.0.0.1",
        "10.0.0.0/8" => "10.0.0.1",
        "0.0.0.0/0" => "192.168.0.1",
        "192.168.234.0/24" => "192.168.0.5"
        });

На данный момент данную опцию поддерживает малое количество клиентов, например windows XP, 
только по непонятным причинам использует код 249, т.е. в конфигурации сервера надо будет использовать 

   option classless-route code 249 = string;

 
Настройка беспроводной 80211 карты под FreeBSD (1)   Автор: toxa  [есть мнение]
 
kldload bridge
sysctl net.link.ether.bridge.enable="1"
sysctl net.link.ether.bridge.config="wi0,fxp0"
sysctl net.inet.ip.forwarding="1"
ifconfig wi0 ssid toxawlan channel 11 media DS/11Mbps mediaopt hostap up stationname "toxawlan"
 
Обобщение используемых моделей ввода/вывода (1)   Автор: [обсудить]
 

Стратегии организации ввода-вывода:

  1. Блокируемый I/O - после вызова read/write происходит блокировка до завершения операции, функция завершается только после принятия или передачи блока данных.
  2. Неблокируемый I/0 - функция завершается сразу, если данные не были приняты/отправлены возвращается код ошибки (т.е. нужно вызывать функции I/O в цикле пока не получим положительный результат).
  3. Мультиплексирование через select/poll - опрашиваем список состояния сокетов, перебирая состояния определяем сокеты готовые для приема/передачи. Главный минус - затраты на перебор, особенно при большом числе неактивных сокетов.
    • select - число контролируемых сокетов ограничено лимитом FD_SETSIZE, в некоторых случаях лимит обходится пересборкой программы, в других - пересборкой ядра ОС.
    • poll - нет лимита FD_SETSIZE, но менее эффективен из за большего размера передаваемой в ядро структуры.
  4. Генерация сигнала SIGIO при изменении состояния сокета (ошибка, есть данные для приема, или отправка завершена), который обрабатывает обработчик SIGIO. В классическом виде применение ограничено и трудоемко, подходит больше для UDP.
  5. Асинхронный I/O - описан в POSIX 1003.1b (aio_open, aio_write, aio_read...), функция aio_* завершается мгновенно, далее процесс сигнализируется о полном завершении операции ввода/вывода (в предыдущих пунктах процесс информировался о готовности прочитать или передать данные, т.е. данные еще нужно было принять или отправить через read/write, в aio_* процесс сигнализируется когда данные полностью получены и скопированы в локальный буфер).
  6. Передача данных об изменении состояния сокета через генерацию событий. (специфичные для определенных ОС решения, малопереносимы, но эффективны).


 
tcpdump для просмотра содержимого пакетов по определенным портам. (1)   Автор: [есть мнение]
 
tcpdump -X -s 1500 -n -i fxp0 (tcp port 443) or (tcp port 994)
Если нужно выбрать трафик в котором не фигурируют IP 1.2.3.190 и 192.168.20.254, а также внутренние 
пересылки между адресами 192.168.20 сети, можно использовать правило фильтрации:
   not host 1.2.3.190 and not host 192.168.20.254 and not (dst net 192.168.20.0/24 and src net 192.168.20.0/24)
 
Как в FreeBSD добавить/убрать алиас для сетевого интерфейса   Автор: [есть мнение]
 
Добавить: ifconfig fxp0 inet 192.168.1.1 netmask 255.255.255.255 alias
Убрать: ifconfig fxp0 inet 192.168.1.1 netmask 255.255.255.255 -alias
 
Табличка с сетевыми масками. (1)   Автор: [есть мнение]
 
адресов в подсети, 255.255.255.x маска, /x маска, .0 - cisco acl маска.
0       .255 /32 .0
2       .254 /31 .1
4       .252 /30 .3
8       .248 /29 .7
16      .240 /28 .15
32      .224 /27 .31
64      .192 /26 .63
128     .128 /25 .127
256     .0   /24 .255
 
Маршрутизация IP сервисов в DMZ через два провайдера   Автор: Pavel V. Rochnyack  [есть мнение]
 
На форуме часто задается вопрос, по поводу маршрутизации сети, подключенной к двум провайдерам.
В частном случае проблема расширяется тем, что нужно осуществлять проброс соединений к сервисам, 
расположенным в локальной сети. Это делается с помощью DNAT, и при этом снова возникает 
проблема - по каналу какого провайдера отправлять ответ.  Проблема усугубляется тем, 
что обратное преобразование адресов выполняется уже после принятия 
решения о маршрутизации, 
т.е. примерно в районе цепочки POSTROUTING, но скрытно от пользователя.

Решить эту нерешаемую проблему поможет модуль CONNMARK.  Принцип работы маршрутизатора для
решения описанной задачи будет выглядеть примерно так:

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


В нижеописанном примере обеспечение доступности сервиса по двум каналам/провайдерам 
делалось для локального сервиса маршрутизатора. В связи с этим маркировка исходящих 
пакетов делается в цепочке OUTPUT таблицы mangle. Для проброса порта к  серверу в локальной сети
(в DMZ) проверку и восстановление маркера надо делать в цепочке PREROUTING. 
Таким образом, "обратный DNAT" будет происходить когда пакет уже будет идти по нужному маршруту.

Все не маркированные пакеты будут идти по маршруту по умолчанию. В моем случае это первый 
провайдер first и айпи интерфейса first_ip. Входящие пакеты/соединения с порта второго провайдера 
(destination <second_ip>) будут помечены маркером и к ним будет применен DNAT.
Все исходящие (обратные) пакеты  будут промаркированы значением маркера соединения 
в цепочке OUTPUT таблицы mangle.

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


   [root@test z]# iptables -t nat -nvL PREROUTING

   Chain PREROUTING (policy ACCEPT 144M packets, 9659M bytes)
    pkts bytes target     prot opt in     out     source               destination
       1    52 CONNMARK   tcp  --  *      *       0.0.0.0/0            <second_ip>      tcp    dpt:<port> CONNMARK set 0x1
       1    52 DNAT       tcp  --  *      *       0.0.0.0/0            <second_ip>      tcp    dpt:<port> to:<first_ip>:<port>



   [root@test z]# iptables -t mangle -nvL OUTPUT

   Chain OUTPUT (policy ACCEPT 6745M packets, 7048G bytes)
    pkts bytes target     prot opt in     out     source               destination
   65915 8600K CONNMARK   tcp  --  *      *       <first_ip>            0.0.0.0/0           tcp    spt:<port> CONNMARK restore


   [root@test z]# ip ru sh


   0:      from all lookup local
   1000:   from all lookup main
   3300:   from all fwmark 0x1 lookup <second>
   5000:   from <first_ip> lookup <first>
   5500:   from <second_ip> lookup <second>

   10000:  from all lookup default
   32766:  from all lookup main
   32767:  from all lookup default
 

   Ethernet, ARP, привязка MAC адресов.

MAC DNS лист   Автор: Vladimir Shingarev  [есть мнение]
 
Иногда нужно узнать какому производителю принадлежит оконечное оборудование, 
наблюдая только его мак на интерфейсе. А открывать браузер для этого лениво.

В таком случае удобно создать MAC-based dns лист. Пользоваться просто:

   ket:/home/sva# host -t txt 001243.macl.nov.ru
   001243.macl.nov.ru descriptive text "Cisco"
   ket:/home/sva# host -t txt 0050ba.macl.nov.ru
   0050ba.macl.nov.ru descriptive text "D-LINK"
 
Объединение сетевых интерфейсов при помощи протокола LACP во FreeBSD 7 (1)   Автор: s@sh@  [есть мнение]
 
Собираем ядро с поддержкой LACP (Link aggregation control protocol):
   device lagg

Объединяем интерфейсы em0 и em1:
   ifconfig em0 up
   ifconfig em1 up
   ifconfig lagg0 create
   ifconfig lagg0 up laggproto lacp laggport em0 laggport em1
   ifconfig lagg0 10.10.10.18 netmask 255.255.255.0
   route add -net 0.0.0.0 10.10.10.1 0.0.0.0

На Cisco и к каждому нужному интерфейсу прописываем:

   interface GigabitEthernet2/2
      .... 
      channel-protocol lacp
      channel-group 23 mode active
   
   interface GigabitEthernet2/16
      ....
      channel-protocol lacp
      channel-group 23 mode active
 
Настройка Linux как Wifi шлюза для КПК (1)   Автор: Михаил Конник  [есть мнение]
 
Linux шлюз:

Нужно создать простую одноранговую ad-hoc сеть и дать статический IP-адрес сетевому беспроводному интерфейсу. 
После этого делаем NAT и всё работает. Для беспроводного интерфейса eth3 и 
сети с идентификатором virens команда выглядит так (от рута):

   # iwconfig eth3 mode Ad-Hoc channel 1 essid virens

В /etc/network/interfaces пишем что-то вроде:

   auto eth3
   iface eth3 inet static
   address 10.106.146.1
   netmask 255.255.255.0
   wireless-mode ad-hoc
   wireless-channel 1
   wireless-rate auto
   wireless-essid virens

Теперь делаем NAT:

   # echo 1 > /proc/sys/net/ipv4/ip_forward
   # iptables -t nat -A POSTROUTING --out-interface eth1 -j MASQUERADE


При этом eth1 это интерфейс, который подключён к Интернету. 
Соединение не шифруется.


КПК:

Необходимо задать essid - такой же, какой дали в iwconfig. 
Шифрование отсутствует, тип сети - одноранговая ad-hoc. 
Снимаем галку "Получать IP-адрес автоматически" и вводим адреса:

   IP-адрес: 10.106.146.2
   Маска подсети: 255.255.255.0
   Маршрутизатор: 10.106.146.1
 
Как "протянуть" 802.1q tagged порт через ip-сеть.   Автор: Roman Timofeev aka ^rage^  [есть мнение]
 
Дано: 

Есть hostA, который воткнут в каталист, в trunk (т.е. тегированный) порт, инкапсуляция 802.1q. 

Есть hostB, который маршрут до hostA. маршрут живой, ip-пакеты между хостами безпроблемно бегают. 

Задача: надо с hostA "притащить" виланы на hostB. 

Решение: vtund + bridge.

описание клиента в vtund.conf

   homepeer { 
      passwd qwerty; 
      type ether; 
      device home; 
      proto tcp; 
      compress yes; 
      stat yes;
      persist yes; 

      up { 
         ifconfig "%% up"; 
         program "brctl addbr br0"; 
         program "brctl addif br0 %%"; 
         program "brctl addif br0 eth0"; 
         ifconfig "br0 up"; 
      }; 

      down { 
         ifconfig "%% down"; 
         ifconfig "br0 down"; 
         program "brctl delbr br0"; 
      }; 
   }

описание пира из конфига сервера

   homepeer { 
      passwd qwerty; # Password 
      type ether; # Ethernet tunnel 
      device work; # Device tap1 
      proto tcp; 
      compress yes; 


      up { 
         ifconfig "%% up"; 
      }; 
      down { 
         ifconfig "%% down"; 
      }; 
   } 

Теперь на той Linux машине, куда кидаем порт:

   vconfig set_name_type VLAN_PLUS_VID_NO_PAD
   vconfig add work 4
   ifconfig vlan4 10.1.1.1 netmask 255.255.255.0 up
   vconfig add vlan4 8
   ifconfig vlan8 192.168.1.1 netmask 255.255.255.0 up

Замечание:
Клиент - хост, с которого мы тащим порт. Он живёт в серой сети и имеет выход в internet через NAT.
Сервер - машина с публичным ip.
 
Сброс счетчиков ifconfig в Linux   Автор: OlegOS (Очередин Олег)  [есть мнение]
 
Если нужно сбросить счетчики пакетов/байт, отображаемые ifconfig, то есть из /proc/net/dev, 
нужно собрать драйвер сетевой карты в виде модуля (не в ядро). 
Для сброса опускаем интерфейс, выгружаем драйвер, загружаем снова и поднимаем интерфейс. 
Должно работать на всех картах.

Пример.

   ifdown eth0
   modprobe -r eepro100
   modprobe eepro100
   ifup eth0

Для того чтобы узнать имя драйвера обеспечивающего работу сетевого интерфейса:

   ethtool -i eth1
 
Привязка имени сетевого интерфейса к MAC адресу в Linux (1)   Автор: [есть мнение]
 
При наличии нескольких одинаковых сетевых карт, чтобы гарантировать, что eth0, eth1,.. всегда будут 
закреплены за одними и теми же картами, можно огранизовать привязку имени к MAC адресу:

В /etc/mactab добавляем:

   eth0 00:23:B7:89:39:E2
   eth1 00:08:A3:20:F8:29
   eth2 00:50:BA:29:B7:32

Для Debian GNU/Linux создаем скрипт /etc/network/if-pre-up.d/nameif

   #!/bin/sh
   PATH=/sbin
   nameif -c /etc/mactab

Для других Linux дистрибутивов нужно на начальном этапе инициализаци выполнить:

   /sbin/nameif eth0 00:23:B7:89:39:E2
   /sbin/nameif eth1 00:08:A3:20:F8:29
   /sbin/nameif eth2 00:50:BA:29:B7:32
 
Как настроить сетевой мост во FreeBSD   Автор: [есть мнение]
 
Предположим, имеется несколько сетевых интерфейсов fxp0,fxp1,fxp2,fxp3
 вы хотите чтобы ваша машина выспупала в качестве сетевого моста:


Первый способ на основе if_bridge(работает в 5-STABLE и 6-ке)
   # kldload if_bridge
   # ifconfig bridge0 create
   # ifconfig bridge0 addm fxp0 addm fxp1 addm fxp2 addm fxp3 up
   # ifconfig fxp0 up
   # ifconfig fxp1 up
   # ifconfig fxp2 up
   # ifconfig fxp3 up

Посмотреть # ifconfig bridge0
Подробнее в man if_bridge и man ifconfig

Второй способ на основе bridge:

   # kldload bridge
   # sysctl net.link.ether.bridge.config=fxp0,fxp1,fxp2,fxp3
   # sysctl net.link.ether.bridge.enable =1

 
Управление дуплексным режимом и скоростью линка в различных ОС. (1)   Автор: [есть мнение]
 
Solaris

   Проверка:
      ndd /dev/hme link_mode
      0 = half duplex, 1 = full duplex
   Установка full duplex:
      ndd -sec /dev/hme adv_100fdx_cap
      ndd -set /dev/hme adv_autoneg_cap 0 
   Установка half duplex:
      ndd -sec /dev/hme adv_100hdx_cap
      ndd -set /dev/hme adv_autoneg_cap 0 

Linux
   Текущее состояние
      mii-tool eth0
      ethtool eth0
   Установка full duplex:
      mii-tool -F 100baseTx-FD eth0
      ethtool -s eth0 speed 1000 duplex full autoneg off
   некоторые драйверы можно настроить через /etc/modules.conf
      options eepro100 options=48
      options 3c59x  options=0x204 full_duplex=0x200

FreeBSD

   Установка full duplex:
      ifconfig xl0 media 100baseTX mediaopt full-duplex
   Установка half duplex:
      ifconfig xl0 media 100baseTX mediaopt half-duplex

IBM AIX

   Список адаптеров и проверка режима:
      lsdev -HCc adapter
      lsattr -d ent# 
   Установка full duplex:
     chdev  -l ent# -a media_speed=100_Full_Duplex -P
   Установка half duplex:
     chdev  -l ent# -a media_speed=100_Half_Duplex -P


HP-UX
   Список адаптеров и проверка режима:
      lanscan -n  (HP-UX 10.x)
      lanscan -p  (HP-UX 11.x)
      lanadmin -x NMid# (HP-UX 10.x)
      lanadmin -x PPA#  (HP-UX 11.x)
  Установка full duplex:
      lanadmin -X 100FD NMid# (HP-UX 10.x)
      lanadmin -X 100FD PPA#  (HP-UX 11.x)
 Установка half duplex:
      lanadmin -X 100HD NMid# (HP-UX 10.x)
      lanadmin -X 100HD PPA#  (HP-UX 11.x)
 
Проброс трафика через Linux машину используя Proxy ARP (1) (2)   Автор: [есть мнение]
 
Пусть:
x.x.x.96/28 - выделенная подсеть, которую нужно распределить по машинам в локальной сети.
x.x.x.97 - IP внешнего шлюза.
Требуется поставить между шлюзом и сетью фаервол, 
с одним адресом на двух интерфейсах x.x.x.98, транслируя ARP трафик используя "Proxy ARP".

(x.x.x.99 ... x.x.x.110) --- (eth1, x.x.x.98 | eth0, x.x.x.98) --- (x.x.x.97)

Удаляем маршруты созданные по умолчанию.
   ip route del x.x.x.96/28 dev eth0
   ip route del x.x.x.96/28 dev eth1

Пакеты для x.x.x.97 пускаем через eth0, а для x.x.x.96/28 через eth1
   ip route add x.x.x.97 dev eth0
   ip route add x.x.x.96/28 dev eth1


Включаем Proxy ARP
   echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
   echo 1 > /proc/sys/net/ipv4/conf/eth1/proxy_arp
 
Объединение сетевых интерфейсов под Linux (1)   Автор: [есть мнение]
 
Превращение двух 100 мбит/c сетевых карт в одну виртуальную, с пропускной способностью 200 мбит/c.

Документация: Documentation/networking/bonding.txt в дереве исходных текстов ядра и "modinfo bonding".
Кратко:
   Подгружаем модуль ядра "bonding", в /etc/modules.conf указываем
     alias bond0 bonding
   При желании устанавливаем опции для доп. настройки модуля, например:
     options bond0 mode=2, где mode=
        0 - balance-rr (Round-robin выбор интерфейса)
        1 - active-backup (работает только один интерфейс, остальные в режиме горячей замены)
        2 - balance-xor - для всех пересылок на MAC закрепляется один из интерфейсов
        3 - broadcast - трафик идет через оба интерфейса одновременно
        4 - 802.3ad - для коммутаторов с поддержкой IEEE 802.3ad Dynamic link aggregation
        5 - balance-tlb, 6 - balance-alb
   /sbin/ifconfig bond0 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255 up
   /sbin/ifenslave bond0 eth0
   /sbin/ifenslave bond0 eth1

Или для дистрибутивов в которых используется пакет initscripts (http://rhlinux.redhat.com/initscripts/):

   /etc/sysconfig/network-scripts/ifcfg-bond0
     DEVICE=bond0
     BOOTPROTO=static
     BROADCAST=192.168.63.255
     IPADDR=192.168.1.1
     NETMASK=255.255.255.0
     NETWORK=192.168.0.0
     ONBOOT=yes


   /etc/sysconfig/network-scripts/ifcfg-eth0
     DEVICE=eth0
     BOOTPROTO=static
     ONBOOT=yes
     MASTER=bond0
     SLAVE=yes
     USERCTL=no

   /etc/sysconfig/network-scripts/ifcfg-eth1
     DEVICE=eth1
     BOOTPROTO=static
     ONBOOT=yes
     MASTER=bond0
     SLAVE=yes
     USERCTL=no
 
Объединение сетевых интерфейсов под FreeBSD 5.x (1)   Автор: Мишка  [есть мнение]
 
Превращение двух 100 мбит/c сетевых карт в одну виртуальную, с пропускной способностью 200 мбит/c .

  kldload /boot/kernel/ng_ether.ko
  kldload /boot/kernel/ng_one2many.ko
  ifconfig rl0 up
  ifconfig rl1 up
  ngctl mkpeer rl0: one2many upper one
  ngctl connect rl0: rl0:upper lower many0
  ngctl connect rl1: rl0:upper lower many1
  ngctl msg rl1: setpromisc 1
  ngctl msg rl1: setautosrc 0
  ngctl msg rl0:upper \
        setconfig "{ xmitAlg=1 failAlg=1 enabledLinks=[ 1 1 ] }"
  ifconfig rl0 inet 192.168.0.78 
 
Привязка IP к MAC адресу (1)   Автор: Krigs  [есть мнение]
 
Я сделал так (идею тоже нашел на этом сайте):

1. Создал файл б/д привязки IP к MAC (например /etc/ethers.local)

             Пример строк из файла:
                 192.168.0.11 00:0c:6e:3f:cd:e5 #kasa2
                 192.168.0.12 00:0d:88:82:da:a2 #mobil
                         и т. д.
2. Написал скрипт такого содержания: (например /etc/static.arp):

         #!/bin/sh
         # обнуляем всю таблицу arp
         arp -ad > null
         # к каждому компу в локальной сети привязываем несуществующий (нулевой)                
         # MAC адрес
         I=1
         while [ $I -le 254 ]
         do
               arp -s 192.168.0.${I} 0:0:0:0:0:0
               I=`expr $I + 1`
         done
         #  к реально существующему компу в сети из базы данных в файле
         # /etc/ethers.local  привязываем
         #  правильный MAC адрес
         arp -f   /etc/ethers.local

3. Делаем этот файл исполняемым и прописываем в файл /etc/rc.local такую
    строчку:

             /etc/static.arp

     Еще желательно, чтобы привязки имен юзерских хостов к ip-адресам были
     прописаны в /etc/hosts (это ускорит их поиск). Теперь сервер не будет
     рассылать широковещательные запросы о локальных MAC адресах, т. к. все они
     статически жестко привязаны к ip-адресам. Этим убивается два зайца: не
     рассылаются широковещательные запросы, что экономит траффик и время
     на ответ сервера, и не позволяет пользователю менять свой ip-адрес,
     т. к. сервер все равно пакет будет отправлять на жестко привязанный
     MAC адрес.

 
Включение Device Polling в FreeBSD (1)   Автор: [есть мнение]
 
man polling - периодических опрос состояния ядром, вместо генерации прерываний 
(полезно при очень большом числе пакетов проходящих через сетевую карту), 
возможен комбинированный вариант, когда polling включается при преодалении определенного порога нагрузки).
В конфигурации ядра
   options DEVICE_POLLING
   options HZ=1000
Далее:
   sysctl kern.polling.enable=1
   sysctl kern.polling.user_frac=50
 
Смена скорости (10/100) и duplex (full/half) на сетевых картах Realtek-8139   Автор: Alexey N. Kovyrin  [есть мнение]
 
1) Duplex можно менять параметром full-duplex модуля 8139too:
   full-duplex=1  (Full-Duplex)
   full-duplex=0  (Half-Duplex)

2) Также существует параметр media, который является набором битовых полей: 
   5-й бит: 1=100Mbps / 0=10Mbps
   4-й бит: 1=Full-Duplex / 0=Half-Duplex
   9-й бит: Форсированная установка параметра duplex (1=Force / 0=Don't Force) 
   9-й бит используется только вместе с 4-м.

3) Примеры:

   modprobe 8139 full-duplex=1  (100Mbps Full-Duplex)
   modprobe 8139 full-duplex=0  (100Mbps Half-Duplex)
   modprobe 8139 media=16  (10Mbps Full-Duplex)
   modprobe 8139 media=48  (100Mbps Full-Duplex)
   modprobe 8139 media=32  (100Mbps Half-Duplex)
   modprobe 8139 media=32  (100Mbps Half-Duplex)
   modprobe 8139 media=0  (10Mbps Half-Duplex)
 
С чем может быть связаны потери пакетов и нестабильная работа ethernet карт ? (1)   Автор: [есть мнение]
 
Приходилось сталкиваться с проблемами согласования режимов работы карт Intel EtherExpress 100 и 
Reltek  RTL-8139 c коммутаторами и концентраторами различных производителей. Несогласование 
проявляется, например в работе карты в режиме half-duplex, а свича в full-duplex и т.д. (в linux: /sbin/mii-tool -F 100baseTx-FD eth0)
 
Как в Linux выставить принудительно 100Mb FullDuplex для Intel EtherExpress Pro100, а то auto-select с некоторыми свичами не работает. (1)   Автор: [обсудить]
 
/sbin/mii-tool -F 100baseTx-FD eth0
или ethtool -s eth0 speed 100 duplex full autoneg off

Для модуля:
В /etc/modules.conf:  
  options eepro100 options=0x200 full_duplex=1
  alias eth0 eepro100 
insmod eepro100.o debug=1 options=0x200
Для ядра в boot приглашении:
     ether=0,0,0x200,eth0 
PS. Для драйвера версии меньше 1.14 (mod_info -a eepro100) вместо 0x200 следует писать 0x30.
 
Почему выкачиваются данные с машины нормально, как только пытаюсь что-то закачать - соединение останавливается, даже через ssh больше 5 мин. не удается поработать. Другие машины работают нормально.   Автор: [есть мнение]
 
Неоднократно замечена проблема работы сетевых карт на базе RealTek 8129/8139 (машины под FreeBSD, 
но с другими ОС тоже проявляется) с некоторыми концентраторами и коммутаторами. 
Проявляется в замирании  сессий до истечения таймаута. 
Диагностика: ping -s N remote_ip, при больших N не проходят.
Решение: Смените сетевую карту, например, на Intel EtherExpress Pro.
 
Как переключить сетевую карту в FreeBSD из full-duplex в half-duplex   Автор: [есть мнение]
 
Текущий режим работы сетевой карты можно посмотреть выполнив:
# ifconfig fxp0 
Перевести сетевую карту в режим работы 10baseT/UTP half-duplex:
# ifconfig fxp0 media 10baseT/UTP mediaopt half-duplex
Автоматически выбрать режим:
# ifconfig fxp0 media autoselect
Подробнее: man 4 ed, man 4 rl, man 4 fxp
 
Объединение сетевых интерфейсов в Gentoo Linux (1)   Автор: Sheridan  [есть мнение]
 
Довольно часто бывает, что пропускной способности не хватает.
Если у вас нет гигабитной сетевой карты (или порта на свиче), не расстраивайтесь. 
Можно вставить в компьютер еще 1-2 сетевухи и объединить интерфейсы в один. 
Данная операция называется bonding. Так как под рукой у меня только Gentoo, 
то могу привести алгоритм объединения интерфейсов только для него.

Итак.

1. emerge ifenslave

2. Редактируем /etc/conf.d/net:
2.1 Комментируем текущий конфиг
2.2 Пишем следующее:

   slaves_bond0="eth0 eth1"
   config_bond0=( "192.168.1.101 netmask 255.255.255.0 brd 192.168.1.255" )
   routes_bond0=( "default gw 192.168.1.11" )

config_bond0 и routes_bond0 берем из закомментированного конфига
(скорее всего это будет config_eth0 и routes_eth0). 
То есть настраиваем bond0 как обычный интерфейс

3. Делаем симлинк из /etc/init.d/net.lo в /etc/init.d/net.bond0

4. Проверяем:
   ~# /etc/init.d/net.eth0 stop
   ~# /etc/init.d/net.bond0 start

5. Если все нормально, то добавляем старт интерфейса при загрузке

   ~# rc-update -d net.eth0
   ~# rc-update -a net.bond0 boot

Все, скорость линка должна возрасти.
 
Дублирование сервера с использованием VRRP (1)   Автор: Ron McCarty  [есть мнение]
 
Имеется два сервера - первичный и запасной. При помощи протокола VRRP (Virtual Router Redundancy Protocol) 
при крахе первичного сервера, автоматически поднимаем его MAC и IP на запасном.

Устанавливаем vrrpd (http://sourceforge.net/projects/vrrpd/).

На первичном сервере выполняем:

   vrrpd -i eth0 -p 25 -v 1 192.168.1.1

На запасном:

  vrrpd -i eth0 -p 24 -v 1 192.168.1.1

,где
    -i eth0  - имя интерфейса на котором будет установлен IP 192.168.1.1
    -v 1 - (virtual router) номер VRRP связки 
            (в локальной сети может быть несколько резервирующих друг-друга систем)
   -p N - приоритет, машина с меньшим весом будет активирована, только при недоступности системы с большим весом.

При тестировании можно использовать tcpdump -vv proto 112
 
Как привязать IP к MAC-адресу сетевой карты (1)   Автор: Dima I. Allaverdov  [есть мнение]
 
arp -s ваш.ip.адрес mac.адрес.сетевой.карты pub
Пример: /usr/sbin/arp -s 192.168.0.10 0:0:e7:ac:4c:63 pub

Начиная с FreeBSD 4.10 в ifconfig доступна опция staticarp, 
заставляющий интерфейс только отвечать на ARP запросы для привязанных к нему адресам.
 

   NAT, трансляция адресов

ipfw nat во FreeBSD 7   Автор: Pikador  [есть мнение]
 
В конфигурацию ядра добавляем:

   options         IPFIREWALL              #firewall
   options         IPFIREWALL_VERBOSE      #enable logging to syslogd(8)
   options         IPFIREWALL_DEFAULT_TO_ACCEPT    #allow everything by default
   options         IPDIVERT
   options         IPFIREWALL_FORWARD
   options         DUMMYNET
   options         IPFIREWALL_NAT          #ipfw kernel nat support
   options         LIBALIAS

в /etc/make.conf:

   CFLAGS+= -DIPFIREWALL_NAT

Далее пересобираем систему:

   cd /usr/src/ ; make builworld && make kernel KERNCONF=YourKern &&  make installworld
   reboot


В конфигурационном файле ipfw:

   NatIP="111.111.111.111"
   ipfw nat 123 config ip ${NatIP} log
   ipfw add 10 nat 123 ip from 192.168.0.0/16 to any
   ipfw add 20 nat 123 ip from any to ${NatIP}

Наслаждаемся достоинствами kernel nat
 
Настройка работы ipnat под большой нагрузкой (1)   Автор: Антон Южанинов  [есть мнение]
 
Для работы ipnat под большой нагрузкой (много трансляций) нужно 
перед сборкой ядра изменить в файле /usr/src/sys/contrib/ipfilter/netinet/ip_nat.h 

   #undefine LARGE_NAT

на
 
   #define LARGE_NAT
 
Балансировка двух каналов средствами ipfw под FreeBSD   Автор: Ivan Voytas  [есть мнение]
 
natd -p 8668 -a ip1 
natd -p 8669 -a ip2 

ipfw add divert 8668 ip from any to ip1 recv if1 
ipfw add divert 8669 ip from any to ip2 recv if2 
ipfw add check-state 
ipfw add prob 0.5 divert 8668 ip from 192.168.0.0/16 to any xmit if1 keep-state 
ipfw add divert 8669 ip from 192.168.0.0/16 to any xmit if1 keep-state 
ipfw add fwd gw1 ip from ip1 to any out xmit if1 (если default на if1) 
ipfw add fwd gw2 ip from ip2 to any out xmit if1 
 
В двух словах про включение NAT и Firewall в ОС FreeBSD (1)   Автор: hub.ru  [есть мнение]
 
Что бы поднять NAT и Firewall на FreeBSD надо:

Скомпилировать ядро:
Следующие строки нужно включить в /usr/src/sys/i386/conf/GENERIC файл конфигурации:

   options IPFIREWALL
   options IPDIVERT
   options IPFIREWALL_VERBOSE
   options IPFIREWALL_VERBOSE_LIMIT=10
   options DUMMYNET
   options TCP_DROP_SYNFIN

Переходим в директорию /usr/src/
   make buildkernel KERNCONF=GENERIC
   make installkernel KERNCONF=GENERIC

Следующие строки можно к примеру включить в rc.conf файл конфигурации:

   hostname="free"
   ifconfig_rl0="10.0.0.1"
   gateway_enable="YES"
   firewall_enable="YES"
   firewall_type="open"
   natd_enable="YES"
   natd_interface="rl0"
   natd_flags="-redirect_port tcp 10.0.0.10:80 80"
   tcp_extensions="NO"
   tcp_drop_synfin="YES"
   icmp_drop_redirect="YES"
   sendmail_enable="NONE"

Для удаленного управления нужно добавить следующую строку:

   sshd_enable="YES"
(возможно понадобится скопировать /etc/ssh/ssh_host_dsa_key.pub в /root/.ssh/authorized_keys

Следующие строки можно включить в rc.firewall файл конфигурации (секция "open"):

   [Oo][Pp][Ee][Nn])
   oif="rl0"
   iif="tx0"
   oip="132.5.7.172"
   iip="10.0.0.1"
   lan="10.0.0.0/24"
   setup_loopback
   # allow all for LAN
   ${fwcmd} add 500 pass all from ${lan} to ${iip} via ${iif}
   ${fwcmd} add 550 pass all from ${iip} to ${lan} via ${iif}
   # download - 60K upload - 6K for all lan ip's
   ${fwcmd} add 600 pipe 1 ip from any to any in via ${oif}
   ${fwcmd} add 650 pipe 2 ip from any to any out via ${oif}
   # for selected ip's only
   # ${fwcmd} add 601 pipe 1 all from any to 10.0.0.10
   # ${fwcmd} add 651 pipe 2 all from 10.0.0.10 to any
   ${fwcmd} pipe 1 config bw 512Kbit/s
   ${fwcmd} pipe 2 config bw 48Kbit/s
   # dns setup
   ${fwcmd} add 770 pass tcp from any to ${oip} 53 setup
   ${fwcmd} add 780 pass udp from any domain to any
   ${fwcmd} add 790 pass udp from any to any domain
   # main setup
   ${fwcmd} add 800 pass tcp from any http,https,20-21,989-990 to any
   ${fwcmd} add 810 pass tcp from any to any http,https,20-21,989-990
   ${fwcmd} add 830 pass tcp from any pop3,pop3s,smtp,imap,imaps,aol to any
   ${fwcmd} add 840 pass tcp from any to any pop3,pop3s,smtp,imap,imaps,aol
   ${fwcmd} add 65000 deny ip from any to any
   ;;
 
Где oip, oif - внешний интерфейс; iip, iif - внутренний; lan - внутренняя сеть.

Такая конфигурация ipfw весьма параноидальна, и здесь приведена только в качестве примера. 
На практике обычно нужен более открытый фаервол. 
 
pf и трансляция адресов на двух интерфейсах   Автор: DelGod  [есть мнение]
 
Решение оптимизировано для шлюза на флешке (не используется perl и другие "тяжелые" решения)

-------------------------
/usr/local/etc/rc.d/openvpn.sh
-------------------------

#!/bin/sh

. /etc/rc.subr

name=openvpn
rcvar=`set_rcvar`

prefix="/usr/local"

openvpn_precmd()
{
        for i in $openvpn_if ; do
                # FreeBSD <= 5.4 does not know kldstat's -m option
                # FreeBSD >= 6.0 does not add debug.* sysctl information
                # in the default build - we check both to keep things simple
                if ! sysctl debug.if_${i}_debug >/dev/null 2>&1 \
                        && ! kldstat -m if_${i} >/dev/null 2>&1 ; then
                        if ! kldload if_${i} ; then
                                warn "Could not load $i module."
                                return 1
                        fi
                fi
        done
        return 0

}

start_postcmd()
{
        `/bin/cat /var/db/ukr_nets| /usr/bin/awk '{ if ($1) {system("route add "$1" 193.201.61.65 >/dev/null")} }'`
        /bin/sleep 10 && pfctl -F all -f /etc/pf.conf_openvpn
}

stop_postcmd()
{
        `/bin/cat /var/db/ukr_nets| /usr/bin/awk '{ if ($1) {system("route delete "$1" 193.201.61.65 >/dev/null")} }'`
        pfctl -F all -f /etc/pf.conf
        rm -f "$pidfile" || warn "Could not remove $pidfile."
}

extra_commands="reload"
pidfile="/var/run/${name}.pid"
command="/usr/local/sbin/${name}"
start_precmd="openvpn_precmd"
start_postcmd="start_postcmd"
stop_postcmd="stop_postcmd"

load_rc_config ${name}
: ${openvpn_enable="NO"}
: ${openvpn_flags=""}
: ${openvpn_if=""}
: ${openvpn_configfile="${prefix}/etc/openvpn/openvpn.conf"}
: ${openvpn_dir="${prefix}/etc/openvpn"}
required_files="${openvpn_configfile}"
command_args="--cd ${openvpn_dir} --daemon --config ${openvpn_configfile} --writepid ${pidfile}"
run_rc_command "$1"

-------------------------
/etc/pf.conf
-------------------------

ext_if_t="rl0"
int_if="rl1"
table <users> persist { 192.168.1.0/24 }
nat on $ext_if_t inet from <users> to any  -> $ext_if_t
pass on $ext_if_t all
pass on $int_if all

-------------------------
/etc/pf.conf_openvpn
-------------------------

ext_if_o="tap0"
ext_if_t="rl0"
int_if="rl1"
table <users> persist { 192.168.1.0/24 }
table <ukr> persist file "/var/db/ukr_nets"
nat on $ext_if_t inet from <users> to <ukr>  -> $ext_if_t
nat on $ext_if_o inet from <users> to !<ukr> -> $ext_if_o
pass on $ext_if_o all
pass on $ext_if_t all
pass on $int_if all

-------------------------
cron:
-------------------------

0 0 * * * /usr/bin/fetch -q -o "/var/db/ukr_nets" 'http://www.colocall.net/ua/?list'

 
Проброс портов с двух различных gateway на внутренний сервер через IPNAT   Автор: Жека  [есть мнение]
 
Иногда необходимо пробросить порты с двух различных gateway GW1 и GW2 на один внутренний сервер, 
у которого в качестве default GW указан GW1.
Прямой проброс и NAT невозможен, т.к. пакеты пришедшие из GW2 попытаются вернуться по маршруту через GW1.
Есть следующий выход, это двойной NAT на GW2, при котором запрос приходит не снаружи, а с внутреннего IP.

ed0 - внешний интерфейс
lnc0 - интерфейс смотрящий внутрь.

в ipnat.rules нужно прописать следующее:
   map ed0 10.6.10.0/24 -> 0.0.0.0/32 мапим локалку наружу
   map lnc0 0.0.0.0/0 -> 0.0.0.0/32 ремап внешних ip в локальные
   rdr ed0 0.0.0.0/0 port 80 -> 10.6.10.2 port 80 tcp форвард на внутренний сервер
 
Пример настройки NAT для двух сетей в FreeBSD 5.3 (1)   Автор: Vov  [есть мнение]
 
Стоит задача - выпустить свою сеть в инет через два разных интерфейса rl1 и rl2.
Так как адреса в локали серые, то надо поднимать NAT. С учетом того, что динамической маршрутизации 
не предвидится, будем поднимать NAT на 2 интерфейса. Для этого нужно:

Скомпилировать ядро с параметрами:
    options IPFIREWALL
    options IPFIREWALL_VERBOSE
    options IPFIREWALL_VERBOSE_LIMIT=20
    options IPFIREWALL_FORWARD
    options IPDIVERT
    options DUMMYNET
    options TCP_DROP_SYNFIN

это необходимый минимум. На все случаи жизни )))))

Далее, в rc.local пишем такие строки:
    natd -p 8668 -n rl1
    natd -p 8669 -n rl2
    #natd -p 8671 -n rl3
    #natd -p 8672 -n rl4
    #natd -p 8673 -n rl5
Последние три строки - если кому надо поднимать NAT на большее количество интерфейсов.

Следующее - правила ipfw:
 
    ipfw -f add divert 8668 all from #твоясеть# to any out via rl1
    ipfw -f add divert 8668 all from any to #адрес_rl1# in via rl1
 
    ipfw -f add divert 8669 all from #твоясеть# to any out via rl2
    ipfw -f add divert 8669 all from any to #адрес_rl2# in via rl2

Теперь все, что будет выходить через внешние интерфейсы, будет правильно NATиться через них же. 
Остается проверить маршрутизацию. Если  маска на rl2 /24. В этом случае все просто. 
Стандартный шлюз (default gateway) прописан через rl1, а все, что идет на сеть 999.888.0.0/24 будет 
автоматически бежать через rl2. Если же на rl2 выделена подсетка из нескольких адресов, то тогда надо 
писать жесткий марщрут на всю сеть 999.888.0.0/24 через rl2 на тот шлюз, который тебе дал провайдер N2. 
Его тоже можно прописать в rc.local отдельной строкой типа:
    route add 999.888.0.0/24 999.888.0.25

У Sergey2005 заработала комбинация:
    ${fwcmd} add 40 divert 8668 all from #моя сеть# to not #подсеть провайдера "S"# out via rl1
    ${fwcmd} add 45 divert 8668 all from not #подсеть провайдера "S"# to any in via rl1


    ${fwcmd} add 50 divert 8669 all from #моя сеть# to #подсеть провайдера "S"# out via rl2
    ${fwcmd} add 55 divert 8669 all from #подсеть провайдера "S"# to any in via rl2

    natd -p 8668 -m -u -n rl1
    natd -p 8669 -m -u -n rl2 
 
Особенности использование ftp из-за фаервола ipfw/natd   Автор: globus  [есть мнение]
 
Необходимо выпустить пользователей на ftp сайты из локальной сети, но при этом не устанавливая 
дополнительного ПО, используя только возможности FreeBSD 4.10.
Этими возможностями, как ни странно, оказались ipfw и natd 
вот собственно как все это прописывается.

Исходные данные, FreeBSD 4.10 + настроенный nat правила для ipfw 
   ipfw -q add 100 divert natd from 192.168.20.0/24 to any 20, 21 out via $oif 
   ipfw -q add 200 divert natd from any 20, 21 to $iip in via $oif 
   ipfw -q add 300 allow tcp from any to any established 
   ipfw -q add 400 allow tcp from any to any setup 
где $oif и $iip соответственно внешний интерфейс и внешний IP 

теперь запускаем natd 
   /sbin/natd -m -s -u -punch_fw 500:200 -n xl1

заострю внимание на параметре "-punch_fw" -этот параметр создает в фаерволе "ходы", 
добавляя динамические правила. В моем случае эти правила начнутся с номера 500 и будет их добавлено 
максимум 200 (понятно чем больше сеть, те больше нужно правил).

Особое спасибо A Clockwork Orange.
 
Как в FreeBSD перебросить соединение через NAT во внутреннюю сеть  (1)   Автор: spanka  [есть мнение]
 
 Вот реализация для ipfw:
if1IP="ип_смотрящий_в_инет", if1="интерфейс_смотрящий_в_инет"
ifLIP="ип_на_который хотим делать редирект"
  ipfw add divert natd tcp from any to ${if1IP} 80 via ${if1}
  ipfw add divert natd ip from any to ${ifLIP} to any via ${if1}
  ipfw add allow tcp from any to ${if1IP} 80 via any
  natd -n ${if1} -redirect_port tcp ${ifLIP}:80 80

Решение от miaso <torov@wipline.ru>:
  tproxy -s 80 -r nobody -l /var/log/transparent_proxy.log [int_ip] 80 
 
Как в Linux перебросить соединение через NAT во внутреннюю сеть (1)   Автор: Dimez  [есть мнение]
 
Первый путь - пробрасывание только порта:
  1) iptables -t nat -A PREROUTING -p tcp -d EXT_R_IP --dport 10000 -j DNAT --to-destination LOCAL_IP:80
  2) iptables -A FORWARD -i eth0 -d LOCAL_IP -p tcp --dport 22 -j ACCEPT


Второй вариант - выброс всей машины наружу (если есть свободные адреса):
  1) ifconfig eth0:0 NEW_IP netmask NETMASK broadcast BROADCAST
  2) route add NEW_IP gw GW netmask 0.0.0.0 metric 1 dev eth0:0
  3) iptables -t nat -A PREROUTING -p tcp -d NEW_IP -j DNAT --to-destination LOCAL_IP
  4) iptables -A FORWARD -i eth0 -d LOCAL_IP -j ACCEPT

Обозначения: EXT_R_IP - внешний IP роутера, LOCAL_IP - внутренний IP машины, которую хочешь выбросить
  NEW_IP - новый IP на который хочешь посадить машину, которая имеет локальный LOCAL_IP
  NETMASK, BROADCAST, GW - внешние netmask, broadcast и gateway
 
Пример настройки NAT с привязкой к IP под Linux   Автор: [есть мнение]
 
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0/0 -o eth0 -j SNAT --to-source 212.23.98.45
или (без привязки к IP)
  ipchains -A forward -j MASQ -s 192.168.0.0/16 -d 0.0.0.0/0
или (через iproute2)
  ip rule add from 10.0.1.0/24 nat 254.147.38.14
Диругой способ трансляции адресов:
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0/0 -j MASQUERADE

 
Как организовать редирект порта на внутреннюю машину через ipnat в FreeBSD.   Автор: [есть мнение]
 
man 5 ipnat  в /etc/ipnat.conf:

  rdr fxp0 205.15.63.3/32 port 80 -> 192.168.1.1 port 80 tcp
# Базансировка нагрузки между 2 IP:
  rdr le0 203.1.2.3/32 port 80 -> 203.1.2.3,203.1.2.4 port 80 tcp round-robin
 
Как настроить NAT (транслятор адресов) для нормальной работы с FTP и ICQ в Linux   Автор: [есть мнение]
 
iptables:
   modprobe iptable_nat
   modprobe ip_conntrack_ftp
   modprobe ip_nat_ftp                     
   modprobe ip_nat_irc
ipchains:
   modprobe ip_masq_ftp
   modprobe ip_masq_raudio
   modprobe ip_masq_irc
   modprobe ip_masq_icq
 
Как обеспечить работу active FTP режима в FreeBSD NAT   Автор: [обсудить]
 
В ipnat воспользуйтесь модулем ftp proxy:
  map fxp0 0/0 -> 0/32 proxy port ftp ftp/tcp
  map rl0 172.16.33.0/24 -> 212.46.231.50/32 proxy port ftp ftp/tcp

не забудьте поместить правило трансляции ftp перед общим правилом трансляции, 
порядок следования правил важен.
 
Как запустить трансляцию адресов (NAT) под FreeBSD   Автор: [есть мнение]
 
В /etc/rc.conf: 
  ipnat_enable="YES"

В /etc/ipnat.rules: 
Трансляция адресов (NAT):

  map ppp0 172.16.1.0/24 -> 194.46.124.53/32

где, ppp0 - внешний интерфейс, 
172.16.1.0/24 - внутренние IP, 
194.46.124.53 - реальный IP внешнего интерфейса.

Переброс порта во внутреннюю сеть:

   rdr ed0 294.16.9.6/32 port 8080 -> 192.168.0.7 port 8080 tcp

где, ed0 - внешний интерфейс, 
294.16.9.6 - реальный IP внешнего интерфейса, на который нужно обращаться из вне.
192.168.0.7 - внутренний IP на который делается переброс.
8080  - номер перебрасываемого порта.


Перечитать: ipnat -CF -f /etc/ipnat.rules

 

   PPP, PPTP, PPPOE

Как поднять выделенное соединение по PPP.   Автор: [есть мнение]
 
Скрипт /etc/ppp.sh:
#!/bin/sh
while : ; do
pppd cuaa0 115200 noipdefault noauth defaultroute nodetach              
done
 
Решение проблемы с MPPE, при использовании связки linux, ppp, poptop и IAS (1)   Автор: mdv  [есть мнение]
 
Проблема:

   pppd[27229]: MPPE required, but keys are not available.  Possible plugin problem?

Решение:

В свойствах "remote access policy", щелкаем "edit profile", на вкладе "encryption" 
убираем галку No Encryption, Apply, ok. И не верьте никому, что это влияет только на MS RRAS.

Причина: 

Без этой настройки IAS начинает отдавать вот такие радиус-атрибуты:
   MS-MPPE-Encryption-Policy
   MS-MPPE-Encryption-Types

а с ним, включенным по-умолчанию, не отдает.
 
Сохранение статистики pppd в MySQL   Автор: Андрей "squirL" Товстик  [есть мнение]
 
Вот такой код я использую, чтобы вести учет статистики для PPP соединений в MySQL. 
Этот код помещается в скрипт /etc/ppp/ip-down. 
Используются переменные окружения, устанавливаемые pppd.

#!/bin/sh
#
echo "INSERT INTO pppdstats VALUES ( `date +%Y%m%d`, `date +\'%T\' 
-d\"-${CONNECT_TIME} sec\" ` , '$PEERNAME', '$IPREMOTE', 
'$CONNECT_TIME', '$BYTES_SENT', '$BYTES_RCVD', '$DEVICE', `date 
+\'%T\'`);" | mysql -uuser -ppassword database


Формат таблицы:

CREATE TABLE pppdstats (
  c_date date,
  c_start_time time,
  user varchar(128),
  ip_addr varchar(15),
  online_time int(11),
  send_bytes int(11),
  recv_bytes int(11),
  device varchar(15),
  c_end_time time
);

PS: Естественно, что изменив перенаправление можно записывать статистику в обычный текстовый файл.
 
Настройка клиентского PPTP соединения по msCHAPv2 в Linux (1)   Автор: onorua  [есть мнение]
 
/etc/ppp/chap-secrets
   # Secrets for authentication using CHAP
   # client server secret IP addresses
   vkXXXX * password

/etc/ppp/options.pptp
   lock
   +chap
   require-mschap-v2
   nobsdcomp
   nodeflate
   noaccomp
   nopcomp
   defaultroute
   noipdefault
   mtu 1000
   mru 1000
   ipcp-accept-local
   ipcp-accept-remote
   noauth

/etc/ppp/peers/topnet
   user vkXXXX
   defaultroute
   noauth
   mru 1000
   mtu 1000

Запускаем:
   sudo pptp 172.16.0.206 call topnet


Завершаем сервис:
   sudo killall pptp
 
Автоподъем pptp linux-клиента на Fedora Core Linux   Автор: Abor Mot  [есть мнение]
 
После безуспешного шаманства вокруг pppd с использованием persist, holdof и maxfail
решил написать следующий скрипт. Запускается из rc.local

#!/usr/bin/perl
use strict;
use Net::Ping;
my $hping=Net::Ping->new("icmp");
my $s=0;
sub logger($) {
my @ldata=localtime;$ldata[5]+=1900;$ldata[4]+=1;
my $j = 0;
for ($j = 0;$j < 5; $j++) {
    if ($ldata[$j] <10) {
       $ldata[$j] = "0" . $ldata[$j];
    }
}
my $data1="$ldata[3]/$ldata[4]/$ldata[5] $ldata[2]:$ldata[1]:$ldata[0]";
open (MAN_LOG, ">>/var/log/ppp_watcher");
print MAN_LOG "pw: $data1\t$_[0]\n";
close(MAN_LOG)
}
logger("daemon started.");
`echo "kill -15 $$" > /root/ppp_watch.die`;
`chmod 0700 /root/ppp_watch.die`;
sub ppp_watch {
    my @presence=split(' ', `ifconfig | grep ppp0`);
    $presence[0].='';
    if ($presence[0] ne 'ppp0') {
	logger("trying to start daemon.");
	`route add -net <LOCAL NETWORK> netmask 255.255.255.0 gw <LOCAL GW> 2>/dev/null`;
	`sleep 2`;
	`pppd noauth nobsdcomp nodeflate name sspm pty "pptp <GW> --nolaunchpppd" 2>/dev/null`;
	`sleep 3`;
	`route add -net <IP> netmask 255.255.255.0 gw <GW> 2>/dev/null`;
	`sleep 2`;
	`route del -net 0.0.0.0 netmask 0.0.0.0 gw <LOCAL IP> 2>/dev/null`;
	`sleep 3`;
	`route add -net 0.0.0.0 netmask 0.0.0.0 dev ppp0`;
	$SIG{'ALRM'}='ppp_watch';
	logger("delaying for 20 sec...");
	alarm(20);
    } else {
	my @traff=split(' ', `pppstats | tail -1`);
	logger("watching, total traffic $traff[0]");
	$SIG{'ALRM'}='ppp_watch';
	alarm(5);
    }

}
ppp_watch;
sub ppp_die {
    $s=1;
}
$SIG{'TERM'}='ppp_die';
while ($s ne 1) {
}
logger("daemon stopped.");
exit 0;


Кроме всего прочего ведет лог состояния и трафика.
 
Настройка ADSL для Стрима под FreeBSD 4.9/5.3 (1)   Автор: Dmitry Pupkov  [есть мнение]
 
запускать 
   bash# ppp -ddial test

Или если мы хотим поднимать соединение при старте, в rc.conf: 
   ppp_enable="YES" 
   ppp_mode="ddial" 
   ppp_profile="test" 

и никаких tun0!
xl0 - ethernet карта куда воткнут модем (у меня Zyxel Omni ADSL LAN EE)

Вот как у меня,  /etc/ppp/ppp.conf:


   default:

   test:
     set device PPPoE:xl0
     set MTU 1492
     set MRU 1492

     set dial
     set crtscts off
     set speed sync
     accept lqr

     disable deflate
     disable pred1
     disable vjcomp
     disable acfcomp
     disable protocomp

     set log Phase LCP IPCP CCP Warning Error Alert
     set ifaddr 10.0.0.1/0 10.0.0.2/0 0.0.0.0 0.0.0.0
     add default HISADDR
     set login
     set authname ppp0012345@mtu
     set authkey your_password

     set server /var/run/ppp/ppp.pid "" 0117

 
Настройка PPTP-клиента на FreeBSD (альтернативный вариант)   Автор: Skylord  [есть мнение]
 
Точнее, частично альтернативный. Используем все тот же pptpclient из портов, 
прописываем роутинг к адресу vpn-сервера (если он в другом сегменте), а потом добавляем в ppp.conf нечто подобное:

vpn:
 set device "!pptp <vpn_server_address> --nolaunchpppd"
 set dial
 set login
 set server /var/run/ppp/loop "" 0177
 set timeout 3600
 set reconnect 120 0
 enable dns
 set authname <vpn_login>
 set authkey <vpn_password>
 nat enable yes
 enable lqr
 disable ipv6cp
 disable mppe
 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
 add default HISADDR

Это мой конфиг и, естественно, не все из этого (типа, таймаутов и реконнектов) нужно всем. Как видно, в данном 
случае не pptp вызывает ppp, а наоборот. Главный бонус как раз в том, что можно без геморроя обеспечить 
on demand'овое соединение (потому и реконнекты с таймаутами у меня стоят) и автоматическое его поднятие, 
если vpn_server сдох, а потом ожил. Ну и мелкие приятности - типа включения из rc.conf без необходимости 
написания дополнительных скриптов....

 
Как в pppd зафиксировать номер PPP интерфейса   Автор: [есть мнение]
 
Необходимо использовать опцию "unit N", где N - номер ppp интерфейса.
Например, для привязки к ppp0:

   /usr/sbin/pppd /dev/ttyS0 115200 noauth crtscts 192.168.1.245:192.168.1.246 local \
   nodetach netmask 255.255.255.252 unit 0
 
Настройка PPTP-клиента под FreeBSD (1)   Автор: l0ner  [есть мнение]
 
Необходимо установить из портов пакет pptpclient
/etc/ppp/ppp.conf
  vpn:
  set authname <LOGIN>
  set authkey <PASSWORD>
  set timeout 0
  set ifaddr 0 0
  add default HISADDR


Подключение к VBN серверу:
  /sbin/route add -host <IP_address_of_VPN_server> <gateway>
  /usr/local/sbin/pptp <IP_address_of_VPN_server> vpn &
 

   Policy routing

Два провайдера и default gw в Linux   Автор: Dmitriy Altuhov  [есть мнение]
 
Имеется сервер ASPLinux 10, с установленным postfix и 3-я сетевыми интерфейсами.

Задача: корректная работа почты через один из интерфейсов, при этом в качестве default gw указан другой.

Реализация:

1) в /etc/iproute2/rt_tables добавляем:
   201 T1
   202 T2


2) создаём скрипт и даём права на запуск, предварительно исправив нужные параметры
IP - адреса сетевых интерфейсов
P - адреса шлюзов

   #!/bin/sh
   IP1=192.168.4.1
   IP2=217.1.1.2
   P1=192.168.4.2
   P2=217.1.1.1
   ip route add default via $P1 table T1
   ip route add default via $P2 table T2
   ip route add default via $P1
   ip rule add from $IP1 table T1
   ip rule add from $IP2 table T2

В результате получим, что если пакет пришёл на P2, то он не пойдёт через default gw P1, 
а уйдёт через тот же интерфейс с IP1
 
Балансировка двух каналов средствами ipfw под FreeBSD   Автор: Ivan Voytas  [есть мнение]
 
natd -p 8668 -a ip1 
natd -p 8669 -a ip2 

ipfw add divert 8668 ip from any to ip1 recv if1 
ipfw add divert 8669 ip from any to ip2 recv if2 
ipfw add check-state 
ipfw add prob 0.5 divert 8668 ip from 192.168.0.0/16 to any xmit if1 keep-state 
ipfw add divert 8669 ip from 192.168.0.0/16 to any xmit if1 keep-state 
ipfw add fwd gw1 ip from ip1 to any out xmit if1 (если default на if1) 
ipfw add fwd gw2 ip from ip2 to any out xmit if1 
 
Проброс трафика через Linux машину используя Proxy ARP (1) (2)   Автор: [есть мнение]
 
Пусть:
x.x.x.96/28 - выделенная подсеть, которую нужно распределить по машинам в локальной сети.
x.x.x.97 - IP внешнего шлюза.
Требуется поставить между шлюзом и сетью фаервол, 
с одним адресом на двух интерфейсах x.x.x.98, транслируя ARP трафик используя "Proxy ARP".

(x.x.x.99 ... x.x.x.110) --- (eth1, x.x.x.98 | eth0, x.x.x.98) --- (x.x.x.97)

Удаляем маршруты созданные по умолчанию.
   ip route del x.x.x.96/28 dev eth0
   ip route del x.x.x.96/28 dev eth1

Пакеты для x.x.x.97 пускаем через eth0, а для x.x.x.96/28 через eth1
   ip route add x.x.x.97 dev eth0
   ip route add x.x.x.96/28 dev eth1

Включаем Proxy ARP
   echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
   echo 1 > /proc/sys/net/ipv4/conf/eth1/proxy_arp

 
Почему в FreeBSD 5.3 не работает форвадинг пакетов (ipfw fwd) (1)   Автор: Bushi  [есть мнение]
 
Это ошибка в FreeBSD 5.3, патч здесь:
http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/71910
 
Пример настройки NAT для двух сетей в FreeBSD 5.3 (1)   Автор: Vov  [есть мнение]
 
Стоит задача - выпустить свою сеть в инет через два разных интерфейса rl1 и rl2.
Так как адреса в локали серые, то надо поднимать NAT. С учетом того, что динамической маршрутизации 
не предвидится, будем поднимать NAT на 2 интерфейса. Для этого нужно:

Скомпилировать ядро с параметрами:
    options IPFIREWALL
    options IPFIREWALL_VERBOSE
    options IPFIREWALL_VERBOSE_LIMIT=20
    options IPFIREWALL_FORWARD
    options IPDIVERT
    options DUMMYNET
    options TCP_DROP_SYNFIN
это необходимый минимум. На все случаи жизни )))))

Далее, в rc.local пишем такие строки:
    natd -p 8668 -n rl1
    natd -p 8669 -n rl2
    #natd -p 8671 -n rl3
    #natd -p 8672 -n rl4
    #natd -p 8673 -n rl5
Последние три строки - если кому надо поднимать NAT на большее количество интерфейсов.

Следующее - правила ipfw:
 
    ipfw -f add divert 8668 all from #твоясеть# to any out via rl1
    ipfw -f add divert 8668 all from any to #адрес_rl1# in via rl1

 
    ipfw -f add divert 8669 all from #твоясеть# to any out via rl2
    ipfw -f add divert 8669 all from any to #адрес_rl2# in via rl2

Теперь все, что будет выходить через внешние интерфейсы, будет правильно NATиться через них же. 
Остается проверить маршрутизацию. Если  маска на rl2 /24. В этом случае все просто. 
Стандартный шлюз (default gateway) прописан через rl1, а все, что идет на сеть 999.888.0.0/24 будет 
автоматически бежать через rl2. Если же на rl2 выделена подсетка из нескольких адресов, то тогда надо 
писать жесткий марщрут на всю сеть 999.888.0.0/24 через rl2 на тот шлюз, который тебе дал провайдер N2. 
Его тоже можно прописать в rc.local отдельной строкой типа:
    route add 999.888.0.0/24 999.888.0.25

У Sergey2005 заработала комбинация:
    ${fwcmd} add 40 divert 8668 all from #моя сеть# to not #подсеть провайдера "S"# out via rl1
    ${fwcmd} add 45 divert 8668 all from not #подсеть провайдера "S"# to any in via rl1

    ${fwcmd} add 50 divert 8669 all from #моя сеть# to #подсеть провайдера "S"# out via rl2
    ${fwcmd} add 55 divert 8669 all from #подсеть провайдера "S"# to any in via rl2

    natd -p 8668 -m -u -n rl1
    natd -p 8669 -m -u -n rl2 

 
Пример разделения трафика для использования двух каналов в FreeBSD (1)   Автор: ILJA  [есть мнение]
 
rl0 -> Первый ифайс во вне, rl1 -> Второй ифайс во вне

rc.conf:
   defaultrouter="${rl1_gateway_ip}"

rc.local:
   /sbin/natd -n rl0 -p 8660
   /sbin/natd -n rl1 -p 8661

rc.firewall:


   ${fwcmd} add 1100 divert 8660 tcp from ${local_ip} to not ${rl0_ip} 22,25,53,80,110,6667
   ${fwcmd} add 1110 fwd ${rl0_gateway_ip} tcp from ${rl0_ip} to not ${local_ip}
   ${fwcmd} add 1120 divert 8660 all from not ${rl0_ip},${local_ip} to ${rl0_ip}
   ${fwcmd} add 1150 pass all from any to ${rl0_ip}
   ${fwcmd} add 1150 pass all from ${rl0_ip} to any
   ${fwcmd} add 1999 divert 8661 all from ${local_ip} to not ${rl1_ip}
   ${fwcmd} add 2000 divert 8661 all from not ${rl1_ip},${local_ip}
   ${fwcmd} add 2010 pass all from any to ${local_ip}
   ${fwcmd} add 2010 pass all from ${local_ip} to any
   ${fwcmd} add 2100 pass all from any to ${rl1_ip}
   ${fwcmd} add 2100 pass all from ${rl1_ip} to any

Правила тестировались на FreeBSD 4.7, 4.8, 4.9, 4.10, c ipfw2. Если у вас с ipfw(1) не работает, попробуйте убрать "not ${ip}" 
и вместо него вставить "any". "not" нужен для того чтобы локальные адреса не дивертировались, т.к. нам это не нужно.
Порядковые номера могут быть на ваше усмотрение, рекомендую в начале разрешить трафик lo0, защититься от спуфа, 
запретить некоторые типы ICMP, разрешить внутренний трафик и т.д., и т.п.
 
Пример policy routing в Linux (маршрутизация в зависимости от IP источника)   Автор: [обсудить]
 
ip rule add from 10.1.10.0/24 to 0/0 table 102 pref 100
ip route add table 102 via 10.1.10.1
ip rule add from 10.1.11.0/24 to 0/0 table 103 pref 100
ip route add table 103 via 10.1.11.45
 
Как организовать Policy Routing на FreeBSD   Автор: [есть мнение]
 
ipfw add 100 fwd 10.0.0.2 ip from 10.0.2.0/24 to any 

Если нужно использовать 2 шлюза, то можно воспользоваться:
  ipfw add  fwd $ext_gw_ip ip from $ext_net to any out xmit $ext_int
 

   Wifi, настройка беспроводного доступа

Настройка беспроводного соединения в Linux с использованием LEAP, WPA или WPA2 (1) (2)   Автор: [обсудить]
 
Примеры настройки LEAP, WPA или WPA2 в Linux при помощи wpa_supplicant 
(http://hostap.epitest.fi/wpa_supplicant/) В Debian пакет wpasupplicant, 
также имеются пакеты с GUI интерфейсом - kwlan и wpagui.

WPA 
---

Создаем файл конфигурации, например /etc/wpa_supplicant.conf

   ctrl_interface=/var/run/wpa_supplicant
   ctrl_interface_group=0
   eapol_version=1
   # ap_scan=2 was the one for me you may try 0 or 1 indstead of 2
   ap_scan=2
   fast_reauth=1
   network={
        ssid="SSID сети"
        proto=WPA
        key_mgmt=WPA-PSK
        pairwise=TKIP
        group=TKIP
        psk="пароль доступа"
   }


WPA2-Personal
-------------

Файл конфигурации:

   ctrl_interface=/var/run/wpa_supplicant
   ctrl_interface_group=0
   ap_scan=1
   network={
        ssid="SSID сети"
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP TKIP
        group=CCMP TKIP
        psk="пароль доступа"
   }



LEAP
----

Файл конфигурации:

   ctrl_interface=/var/run/wpa_supplicant
   ctrl_interface_group=0
   eapol_version=1
   ap_scan=1
   fast_reauth=1

   network={
     scan_ssid=1
     mode=0
     ssid="SSID сети"
     proto=WPA
     key_mgmt=WPA-EAP
     pairwise=TKIP
     group=TKIP
     eap=LEAP
     priority=2
     auth_alg=LEAP
     eapol_flags=0
     identity="идентификатор пользователя"
     password="Пароль достутпа"
}

"SSID сети", "идентификатор пользователя" и "пароль достутпа" заменяем на полученные от администратора сети данными.

Далее поднимаем wifi интерфейс (Intel Pro Wireless 3945ABG/BG):
   ifconfig wlan0 down
   iwconfig wlan0 essid "имя сети"
   ifconfig wlan0 up

Запускаем wpa_supplicant:
   wpa_supplicant -iwlan0 -c /etc/wpa_supplicant.conf -Dwext -dd

Для драйвера ipw2200, интерфейс будет eth1:

  wpa_supplicant -d -c /etc/wpa_supplicant.conf -ieth1 -Dwext -dd
Для madwifi - ath0:
  wpa_supplicant -d -c /etc/wpa_supplicant.conf -iath0 -Dmadwifi -dd


Посмотреть состояние соедиения можно через wpa_cli или GUI интерфейс wpa_gui. 

Для получения IP адреса по DHCP нужно запустить DHCP-клиент:
   dhcpcd wlan0 

Для настройки соединение двух машин в Ad-Hoc режиме можно использовать примерно такую комбинацию:

   modprobe ipw3945
   iwconfig eth1 mode Ad-Hoc
   iwconfig eth1 essid "testnet"
   iwconfig eth1 key restricted
   iwconfig eth1 channel 1
   ifconfig eth1 192.168.1.1 up
   iwconfig eth1 key s:12345

где, testnet имя сети, а 12345 пароль.
 
Настройка работы беспроводной карты на базе Broadcom BCM43xx в Ubuntu (1)   Автор: E@zyVG  [есть мнение]
 
После установки Ubuntu 8.04 по умолчанию не работают беспроводные карты на базе чипов Broadcom BCM43xx из-за отсутствия firmware.
Начиная с Linux ядра 2.6.24 работу данных карт в Linux обеспечивает драйвер b43, 
в более ранних версиях использовался драйвер bcm43xx.

Для включения работы карты нужно установить пакет b43-fwcutter и получить firmware:

   sudo apt-get install b43-fwcutter

и активировать на ноутбуке адаптер. 
Также можно воспользоваться меню  Menu / System / Administration / Hardware Drivers.

Драйвером b43 поддерживаются чипы:

    * bcm4303 (802.11b)
    * bcm4306
    * bcm4309 (только 2.4GHz)
    * bcm4311 rev 1 / bcm4312
    * bcm4311 rev 2 / bcm4312 (с 2.6.24 ядром работает через доп. патчи)
    * bcm4318

В настоящее время нет поддержки: 
    * 802.11a для серий 4309 и 4312;
    * BCM 4328/4329
    * не реализованы возможности представленные в проекте стандарта 802.11n;

Сайт разработчиков драйвера: http://wireless.kernel.org/en/users/Drivers/b43
 
Обеспечение работы беспроводной карты в Ubuntu 7.10 через ndiswrappe (1)   Автор: silverghost  [есть мнение]
 
1. Устанавливаем ndiswrapper:

    sudo apt-get install ndiswrapper-common ndiswrapper-utils-1.9

2. Распаковываем куда нибудь Windows драйверы и пишем из под пользователя root такие команды:

    ndiswrapper -i bcmwl5.inf
    modprobe ndiswrapper
    echo "blacklist bcm43xx" >> /etc/modprobe.d/blacklist
    echo "ndiswrapper" >> /etc/modules

3. Перегружаемся и проверяем. Все должно работать.
 
Настройка Linux как Wifi шлюза для КПК (1)   Автор: Михаил Конник  [есть мнение]
 
Linux шлюз:

Нужно создать простую одноранговую ad-hoc сеть и дать статический IP-адрес сетевому беспроводному интерфейсу. 
После этого делаем NAT и всё работает. Для беспроводного интерфейса eth3 и 
сети с идентификатором virens команда выглядит так (от рута):

   # iwconfig eth3 mode Ad-Hoc channel 1 essid virens

В /etc/network/interfaces пишем что-то вроде:

   auto eth3
   iface eth3 inet static
   address 10.106.146.1
   netmask 255.255.255.0
   wireless-mode ad-hoc
   wireless-channel 1
   wireless-rate auto
   wireless-essid virens

Теперь делаем NAT:

   # echo 1 > /proc/sys/net/ipv4/ip_forward
   # iptables -t nat -A POSTROUTING --out-interface eth1 -j MASQUERADE

При этом eth1 это интерфейс, который подключён к Интернету. 
Соединение не шифруется.


КПК:

Необходимо задать essid - такой же, какой дали в iwconfig. 
Шифрование отсутствует, тип сети - одноранговая ad-hoc. 
Снимаем галку "Получать IP-адрес автоматически" и вводим адреса:

   IP-адрес: 10.106.146.2
   Маска подсети: 255.255.255.0
   Маршрутизатор: 10.106.146.1

 
Подключение к беспроводной сети под Linux (1)   Автор: [есть мнение]
 
0. Убеждаемся, что наш беспроводной адаптер в списке поддерживаемых в Linux
(http://www.linux-wlan.org/docs/wlan_adapters.html.gz)
на сайте http://www.linux-wlan.org/

1. Подгружаем модуль ядра: insmod prism2_usb

2. Активируем wlan0
   wlanctl-ng wlan0 lnxreq_ifstate ifstate=enable

3. Устанавливаем SSID для используемой сети
   wlanctl-ng wlan0 lnxreq_autojoin ssid=stayoutofmynet authtype=opensystem

4. Выставляем атрибуты WEP
   wlanctl-ng wlan0 lnxreq_hostwep encrypt=true decrypt=true
   wlanctl-ng wlan0 dot11req_mibset mibattribute=dot11PrivacyInvoked=true


5. Используем WEP ключ
   wlanctl-ng wlan0 dot11req_mibset mibattribute=dot11WEPDefaultKeyID=3
   wlanctl-ng wlan0 dot11req_mibset mibattribute=dot11WEPDefaultKey3=12:34:56:78:9A

6. Конфигурируем IP
   ifconfig wlan0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
   route add default gw 192.168.1.11
 
Настройка беспроводной 80211 карты под FreeBSD (1)   Автор: toxa  [есть мнение]
 
kldload bridge
sysctl net.link.ether.bridge.enable="1"
sysctl net.link.ether.bridge.config="wi0,fxp0"
sysctl net.inet.ip.forwarding="1"
ifconfig wi0 ssid toxawlan channel 11 media DS/11Mbps mediaopt hostap up stationname "toxawlan"
 

   Ограничение трафика

Скрипт для распределения пропускной способности средствами iproute2 в Linux (1)   Автор: Adam Palmer  [есть мнение]
 
Скрипт опробован в Debian Etch с установленными пакетами tc, iproute2 и bc.
Задача скрипта равномерное распределения пропускной способности канала среди пользователей
и повышения приоритета dns, ssh, smtp.

SOME_IMPORTANT_IP, SOME_OTHER_IMPORTANT_IP, IMPORTANT_IP - нужно заменить на IP 
важного сервера во внутренней сети.


#!/bin/bash
EXT_IFACE="eth0"
INT_IFACE="eth1"
TC="tc"
UNITS="kbit"
LINE="10000" # максимальная фактическая скорость внешнего (ext) линка
LIMIT="5000" # максимально скорость, которую мы можем допустить

# Переменные определеяющие скорость для индивидуальных классов трафика 
# для ограничения внутреннего трафика, проходящего через интерфейс eth0;
CLS1_RATE="200" # гарантировано 200kbit 
CLS2_RATE="300" # гарантировано 300kbit
CLS3_RATE="4500" # на всех 4500kbit (низкий приоритет)

# Переменные определеяющие скорость для индивидуальных классов трафика
# для ограничения трафика, проходящего через внешний интерфейс eth1;
INT_CLS1_RATE="1000" #Priority
INT_CLS2_RATE="4000" #Bulk

# Чистим содержимое qdiscs
${TC} qdisc del dev ${INT_IFACE} root
${TC} qdisc del dev ${EXT_IFACE} root

# Создаем корневые qdiscs, используя HTB, привязываем к интерфейсу и ставим метку "1:0"
${TC} qdisc add dev ${INT_IFACE} root handle 1:0 htb
${TC} qdisc add dev ${EXT_IFACE} root handle 1:0 htb

# Создаем корневые классы и выставляем максимально-допустимый лимит скорости
# eth1
${TC} class add dev ${INT_IFACE} parent 1:0 classid 1:1 htb rate ${LIMIT}${UNITS} ceil ${LIMIT}${UNITS}
# eth0
${TC} class add dev ${EXT_IFACE} parent 1:0 classid 1:1 htb rate ${LIMIT}${UNITS} ceil ${LIMIT}${UNITS}


# Создаем дочерние классы, маркируем их меткой "1:2", "1:3", в зависимости от лимита, для eth1
${TC} class add dev ${INT_IFACE} parent 1:1 classid 1:2 htb rate ${INT_CLS1_RATE}${UNITS} ceil ${LIMIT}${UNITS}

${TC} class add dev ${INT_IFACE} parent 1:1 classid 1:3 htb rate ${INT_CLS2_RATE}${UNITS} ceil ${INT_CLS2_RATE}${UNITS}

# Привязываем лимит для eth1 (для ограничения исходящего трафика)
# Ставим для класса "1:2" гарантированную скорость 200kbit 
# с возможностью подъема при свободности канала до 5000kbit
${TC} class add dev ${EXT_IFACE} parent 1:1 classid 1:2 htb rate ${CLS1_RATE}${UNITS} ceil ${LIMIT}${UNITS}


# Ставим для класса "1:3" гарантированную скорость 300kbit 
# с возможностью подъема при свободности канала до 4800kbit (5000kbit - 200kbit зарезервированный для 1:2)
${TC} class add dev ${EXT_IFACE} parent 1:1 classid 1:3 htb rate \
   ${CLS2_RATE}${UNITS} ceil `echo ${LIMIT}-${CLS1_RATE}|bc`${UNITS}

# Ставим для менее приоритетного класса "1:4" оставшуюся скорость 4500kbit (5000kbit - 200kbit - 300kbit)
${TC} class add dev ${EXT_IFACE} parent 1:1 classid 1:4 htb rate ${CLS3_RATE}${UNITS} \
   ceil `echo ${LIMIT}-${CLS1_RATE}-${CLS2_RATE}|bc`${UNITS}


# Добавляем pfifo.
${TC} qdisc add dev ${INT_IFACE} parent 1:2 handle 12: pfifo limit 10
${TC} qdisc add dev ${INT_IFACE} parent 1:3 handle 13: pfifo limit 10
${TC} qdisc add dev ${EXT_IFACE} parent 1:2 handle 12: pfifo limit 10
${TC} qdisc add dev ${EXT_IFACE} parent 1:3 handle 13: pfifo limit 10
${TC} qdisc add dev ${EXT_IFACE} parent 1:4 handle 14: pfifo limit 10


### С классами закончили, создаем правила для адресов в сети
# INT_IFACE, настраиваем скорость.
# под dst подразумевается трафик уходящий во внутренний интерфейс eth0, т.е. к локальному IP
# и определяем скорость загрузки с этих адресов.
# адрес SOME_IMPORTANT_IP привязываем к классу 1:2
${TC} filter add dev ${INT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip dst SOME_IMPORTANT_IP/32 flowid 1:2
${TC} filter add dev ${INT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip dst SOME_OTHER_IMPORTANT_IP/32 flowid 1:2
# Все остальные адреса привязываем к классу 1:3 и считаем неприоритетными
${TC} filter add dev ${INT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:3


# EXT_IFACE
# Устанавливаем повышенный приоритет для  DNS запросов
${TC} filter add dev ${EXT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip src IMPORTANT_IP/32 match ip sport 53 0xffff flowid 1:2
# SSH тоже считаем приоритетным

${TC} filter add dev ${EXT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip src IMPORTANT_IP/32 match ip sport 22 0xffff flowid 1:2
# SMTP отдаем остатки полосы, но приоритет по сравнению с остальным трафиком поднимаем
${TC} filter add dev ${EXT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip src IMPORTANT_IP/32 match ip sport 25 0xffff flowid 1:3
# Все остальное - в последнюю очередь, самый низкий приоритет
${TC} filter add dev ${EXT_IFACE} parent 1:0 protocol ip prio 1 u32 match ip src 0.0.0.0/0 flowid 1:4
 
IFB (аналог IMQ ) - основные команды для управления трафиком   Автор: Andrejs Spunitis  [есть мнение]
 
Считается что IFB идеологически более правильная реализация псевдо-устройства, чем IMQ.
IFB по умолчанию доступна в дистре Fedora Core 6.
IMQ требует патчить ядро, по умолчанию не доступна.

Насколько я понял идеологически
   IFB - это скорее для iproute2
   IMQ - iptables

Документация по IFB в исходниках iproute doc/actions/
или по адресу: http://linux-net.osdl.org/index.php?title=IFB

Отличные картинки с местоположением IMQ:
http://www.abclinuxu.cz/clanky/site/traffic-shaping-2-imq-a-uvod-do-shapingu


# СБРОС ПРАВИЛ  -----------------------------
 tc qdisc del dev eth0 root 
 tc qdisc del dev eth0 ingress


 tc qdisc del dev ifb0 root 
 tc qdisc del dev ifb0 ingress

 modprobe ifb
 ip link set dev ifb0 up

 service iptables restart
# ------------------------------------------

# IFB включение ----------------------------
 modprobe ifb
 ip link set dev ifb0 up
# ------------------------------------------

## ПОЛЕЗНЫЕ КОМАНДЫ-------------------------
 tc -s filter show parent ffff: dev eth0
 tc -s qdisc
 ifconfig ifb0
 tc -s filter show dev ifb0 parent 1:
 tc -s qdisc show dev ifb0 


######################################################
# ПРИМЕР ограничения входящего трафика 
# маркировка IPTABLES недоступна
######################################################

### IFB --------------------------------------------------------------
 tc qdisc add dev ifb0 root handle 1: prio 

 tc qdisc add dev ifb0 parent 1:1 handle 10: tbf rate 80kbit buffer 1600 limit 3000
 tc qdisc add dev ifb0 parent 1:2 handle 20: tbf rate 160kbit buffer 1600 limit 3000

## выделили закачку исходников ядра 
## wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.gz
 tc filter add dev ifb0 parent 1: protocol ip prio 1 u32 match ip src 204.152.191.37/32 flowid 1:1 

## выделили закачку исходников fedora core 6
## wget ftp://ftp.muug.mb.ca/pub/fedora/linux/core/6/i386/iso/FC-6-i386-DVD.iso
 tc filter add dev ifb0 parent 1: protocol ip prio 2 u32 match ip src 130.179.31.46/32 flowid 1:2 



### eth0 --------------------------------------------------------------
 # перенаправлять входящие пакеты с eth0 в ifb0 
 tc qdisc add dev eth0 ingress
 tc filter add dev eth0 parent ffff: protocol ip \
  u32 match u32 0 0 action mirred egress redirect dev ifb0

## TESTING -------------------------------------------------------------
оцените скорость и т.д. 
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.gz

######################################################
# ПРИМЕР ограничения исходящего трафика 
# маркировка IPTABLES доступна но
# filter работает на уровне iproute2 match ip dst
######################################################

Выполните СБРОС ПРАВИЛ и включите IFB (если выкл.)

### IFB --------------------------------------------------------------
 tc qdisc add dev ifb0 root handle 1: prio
 tc qdisc add dev ifb0 parent 1:1 handle 10: tbf rate 80kbit buffer 1600 limit 3000
 tc qdisc add dev ifb0 parent 1:2 handle 20: tbf rate 160kbit buffer 1600 limit 3000

 # закачка большого файла с хх.хх.хх.хх
 tc filter add dev ifb0 parent 1: protocol ip prio 2 u32 match ip dst  хх.хх.хх.хх/32 flowid 1:2 


### eth0 --------------------------------------------------------------
 # перенаправлять выходящие пакеты с eth0 в ifb0 
 tc qdisc add dev eth0 root handle 2: prio
 tc filter add dev eth0 parent 2: protocol ip \
      u32 match u32 0 0 action mirred egress redirect dev ifb0

## TESTING -------------------------------------------------------------
закачивайте большой файла на хх.хх.хх.хх оцените скорость и т.д. 
 tc -s filter show parent ffff: dev eth0
 tc -s qdisc
 ifconfig ifb0
 tc -s filter show dev ifb0 parent 1:
 tc -s qdisc show dev ifb0 

######################################################
# ПРИМЕР ограничения исходящего трафика 
# маркировка IPTABLES доступна
# filter работает на уровне маркировке пакетов в IPTABLES
######################################################

 Выполните СБРОС ПРАВИЛ и включите IFB (если выкл.)

### IFB --------------------------------------------------------------
 tc qdisc add dev ifb0 root handle 1: prio

 tc qdisc add dev ifb0 parent 1:1 handle 10: tbf rate 80kbit buffer 1600 limit 3000
 tc qdisc add dev ifb0 parent 1:2 handle 20: tbf rate 160kbit buffer 1600 limit 3000

 tc filter add dev ifb0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:1
 tc filter add dev ifb0 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:2


### eth0 --------------------------------------------------------------
 # перенаправлять выходящие пакеты с eth0 в ifb0 
 tc qdisc add dev eth0 root handle 2: prio
 tc filter add dev eth0 parent 2: protocol ip \
      u32 match u32 0 0 action mirred egress redirect dev ifb0

 tc qdisc add dev eth0 root handle 2: prio
 tc filter add dev eth0 parent 2: protocol ip \
   u32 match u32 0 0 action mirred egress redirect dev ifb0

# поставить в IPTABLES метку  
 iptables -t mangle -A OUTPUT -p tcp -d 85.254.228.6/32 -j MARK --set-mark 10 

## TESTING -------------------------------------------------------------
закачивайте большой файла на хх.хх.хх.хх оцените скорость и т.д. 
 
Расчет размера очереди для pipe с заданной пропускной способностью (1)   Автор: [есть мнение]
 
> Работает шейпер на dummynet, наблюдается некотороая потеря

> траффика. Hавскидку проблема в дефолтных значениях размера очереди (50 пакетов)
> для pipe'ов от 32 до 512 Кбит\с. Скорее всего, поток не влезает в очередь и
> часть пакетов отбрасывается. Как правильно рассчитать размер очереди для
> каждого pipe в отдельности? 

Eugene Grosbein:

Pipe и должен отбрасывать пакеты, иначе какой же это шейпер?
Ты не можешь увеличивать длину очереди бесконечно, потому что задержки
вырастут настолько, что соединение начнет рвать сам юзер :-)

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

А если хочешь и рыбку съесть, и потерь иметь минимум, то читай-ка ты
про RED/GRED на unixfaq.ru и делай не просто pipe, а queue/pipe с gred.
Рекомендую делать w_q=0.002, max_p=0.1, min=q/10, max=3*min,
где q - длина очереди, q=20 для скоростей меньше 100Kbit/s,
q=30 для скоростей от 100 до 300Kbit/s и q=50 для скоростей 512Kbit/s и выше.

----------
Sergey A Yakovets:

Пол-дня игрался с параметром queue. В итоге подобрал на первый взгляд
кое-что подходящее. Алгоритм\мысли были следующие:

Дано: асинхронный спутниковый Инет. Входящий канал - 1024 Кбит\с.

Опытным путем установлено, что проблемы с потерей траффика (до 10% от
общего объема) возникают при многопотоковых http\ftp закачках, т.к. спутниковый
провайдер в этом случае может отдать поток на все 1024 Кбит\с. При серфинге все
нормально. Исходя из этого, мною были сделаны некоторые расчеты:

При максимальной пропускной способности входящего спутникового канала
в 1024 Кбит\с и размере пакета в 1500 байт, пропускная способность канала
равна ~ 87 пакетов\сек. В это же время, для канала в 128 Кбит\с пропускная
способность равна ~ 11 пакетов\сек. Гипотетическая разница, при условии что на
юзера будет идти поток в 1024 Кбит\с, а отдаваться только 128 Кбит\с, может
составить 76 пакетов\сек.

Итого, опытным путем установлено:

    - (было) при дефолтной очереди в 50 пакетов на pipe 128 Кбит\с потери 10%
    - при размере очереди = разница*2 = 150 пакетов потери 2%
    - (стало) при размере очереди = разница*3 = 230 пакетов потери 0%

Серфинг не страдает, задержек нет. Закачка идет на скорости шейпера, потерь нет.

Пробовал другой вариант.
Hа pipe 128 Кбит\с было выставлено gred 0.002/3/6/0.1 В итоге - огромные
потери, т.к. канал практически все время работал на скорости пакетов намного
больше чем max_th*2. Изменение параметров до gred 0.002/50/150/0.1 не влияло на
результат, т.к. дефолтный размер очереди в 50 пакетов часто переполнялся и gred
не имел никакого действия. 
---------

Что такое алгоритмы RED и gentle RED у ipfw?
http://unixfaq.ru/index.pl?req=qs&id=310

Ответ на этот вопрос скомпилирован из статей в конференции RU.UNIX.BSD от следующих авторов: 
Valentin Ermolaev, Alexander V. Naumochkin, Jen Linkova.

Сокращение RED означает "Random Early Detection". Метод используется для выравнивания всплесков трафика.

Основным критерием метода является так называемая перегрузка.

В качестве показателя перегрузки avg используется вычисляемое среднее значение длины очереди пакетов, 
принадлежащей к определенной сессии TCP. Использование усредненного,
 а не мгновенного значения очереди позволяет отделить кратковременные перегрузки, 
которые могут быть нормально обработаны устройством и сетью, от длительных перегрузок, 
которые могут утопить сеть.

Алгоритмически это выглядит так:

В момент прихода пакета
; ; if (очередь не пуста)
; ; ; ; avg = (1 - w_q)*avg + w_q*q
; ; else
; ; ; ; m = f(time - q_time)
; ; ; ; avg = (1 - w_q)^m * avg;

где

avg -средний размер очереди
q_time - "start of queue idle time"
q - размер очереди

w_q - вес очереди (фиксированный параметр)

f() - линейная функий от времени

В /usr/src/sys/netinet/ip_dummynet.c по этому поводу написано следующее:

* RED algorithm
*
* RED calculates the average queue size (avg) using a low-pass filter
* with an exponential weighted (w_q) moving average:
* avg <- (1-w_q) * avg + w_q * q_size
* where q_size is the queue length (measured in bytes or * packets).
*
* If q_size == 0, we compute the idle time for the link, and set
* avg = (1 - w_q)^(idle/s)
* where s is the time needed for transmitting a medium-sized packet.

- что полностью согласуется с приведенными выше формулами.

Далее в алгоритме вводятся два порога уровня перегрузки: min_th и max_th. 
Когда уровень перегрузки ниже первого порога min_th, то пакеты не отбрасываются. 
Если уровень перегрузки находится между двумя порогами, пакеты отбрасываются с линейно 
возврастающей вероятностью из диапазона от 0 до конфигурируемой величины max_p, 
которая достигается при достижении второго порога max_th. Выше порога max_th 
отбрасываются все пакеты.

Такой метод вычисления позволяет сглаживать всплески трафика - для сравнения в первой из статей (см. ниже) 
на одном графике приводятся и изменение размера очереди q, и усредненного размера 
очереди (avg) от времени. В той же статье есть выкладки на тему значений w_q.

При gentle RED ситуация выглядит чуть сложнее:

Если перегрузки лежит в интервале от min_th до max_th, то пакеты отбрасываются с линейно 
возрастающей от 0 до max_p вероятностью. Когда перегрузка превышает max_th, 
но не превышет 2*max_th, пакеты отбрасываются не все (как в случае RED), а с линейно возрастающей 
от max_p до 1 вероятностью. Все пакеты отбрасываются только после превышения перегрузки канала значения 2*max_th.

Вот как это сделано в ip_dummynet.c:

если длина очереди > max_th, то в случае gred вероятность 
отбрасывания пакета вычисляется как

; ; p_b = c_3 * avg - c_4
где c_3 = (1 - max_p) / max_th
; ; c_4 = 1 - 2 * max_p

В случае просто RED пакет отбрасывается.

При загрузке очереди, большей min_th, но меньшей max_th, функция
вероятности одинакова и выглядит след. образом:

; ; p_b = c_1 *avg - c_2
где c_1 = max_p / (max_th - min_th),
; ; c_2 = max_p * min_th / (max_th - min_th)

Полезные ссылки:


   1. http://www.icir.org/floyd/papers/red/red.html
   2. http://www.icir.org/floyd/red.html
   3. http://www.cisco.com/warp/public/732/Tech/red/
 
Ограничение входящей и исходящей скорости (shaping) для клиентов на ppp интерфейсах.   Автор: Tangar aka Андрей Орлов  [обсудить]
 
Ограничение входящей и исходящей скорости (shaping) для клиентов на ppp интерфейсах.

   #!/bin/bash
   DEVICE=ppp9 UP=512 DOWN=512


   /sbin/tc qdisc del dev $DEVICE root
   /sbin/tc qdisc add dev $DEVICE root tbf rate ${DOWN}Kbit latency 50ms burst $[$DOWN*1024]

   /sbin/tc qdisc del dev $DEVICE handle ffff: ingress
   /sbin/tc qdisc add dev $DEVICE handle ffff: ingress
   /sbin/tc filter add dev $DEVICE parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 \
      police rate ${UP}Kbit burst $[$DOWN*1024] drop flowid :1
 
Ограничение трафика через iptables (1)   Автор: Николай Малых  [есть мнение]
 
ipt_limit - общее ограничение по срабатываний правила
     -m limit --limit {avg}/[second|minute|hour|day] --limit-burst {burst}

iplimit - ограничение соединений для одного IP.
    Ограничение коннектов к 80 порту от одного IP:
         iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-above 4 -j REJECT
    Тоже, но для запросов с одной /24 подсети:
         iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-mask 8 --iplimit-above 4 -j REJECT


hashlimit - для каждого IP в хэше хранятся параметры соединений;
    -m hashlimit --hashlimit {avg} --hashlimit-burst {burst} --hashlimit-mode {режим: dstip, dstport, srcip, srcport} \
       --hashlimit-name {name} --hashlimit-htable-max {num} --hashlimit-htable-expire {num} --hashlimit-htable-gcinterval {num}

    iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit 1/hour \
       --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name SSH --hashlimit-htable-expire 360000 -j ACCEPT

tbf (http://www.nmalykh.org/work/tbf.tar.gz) - продолжение развития limit и hashlimit c поддержкой 
возможности инверсии правил в целом.

    iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m tbf ! -- tbf 1/s --tbf-burst 
       --tbf-mode srcip --tbf-name SMTP  -j DROP
 
Как ограничить пропускную полосу для пакетов помеченных меткой через MARK.   Автор: Denis Fedorishenko (NuclearCat)  [есть мнение]
 
Сделать MARK, и загнать все такие трансферы в какой-либо класс шейпера. 
Т.е. если например помеченные пакеты - все их отнести к классу 1:51 где скорость ограничена от 32К до 64К:
  tc filter add dev eth1 parent 1:0 protocol ip prio 100 handle 51 fw classid 1:51
  tc class add dev eth1 parent 1:2 classid 1:51 htb rate 32Kbit ceil 64Kbit
  tc qdisc add dev eth1 parent 1:51 handle 51 sfq perturb 10
 
Ограничения трафика с помощью iproute2 (1)   Автор: Z0termaNN  [есть мнение]
 
tc qdisc add dev eth1 root handle 1: htb default 2 r2q 1
tc class add dev eth1 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit mtu 1500
tc class add dev eth1 parent 1:1 classid 1:77 htb rate 32kbit ceil 48kbit mtu 1500 prio 0
tc class add dev eth1 parent 1:1 classid 1:2  htb rate 128kbit ceil 128kbit mtu 1500
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dport 25 flowid 1:77
 
Пример ограничения полосы пропускания трафика в FreeBSD   Автор: [есть мнение]
 
Собираем ядро с опциями:
   options         DUMMYNET
   options         IPFIREWALL
Ограничиваем трафик для сеток 1.1.1.0/24 и 3.3.3.0/24 на 14000 кбит/с:
   ipfw add pipe 50 tcp from any to 1.1.1.0/24 via fxp0
   ipfw add pipe 50 tcp from any to 3.3.3.0/24 via fxp0
   ipfw pipe 50 config bw 14Kbit/s
Для внесения задержки на N ms, используйте delay N после config.
Для установки веса данного пайпа по отношению к другим пайпам используйте weight вес.
Для WF2Q ограничения трафика используйте ipfw queue
(queue N config [pipe pipe_nr] [weight weight] [queue {slots | size})
PS (комментарий от gara@mail.ru):
 Если возникает необходимость организовать "канал" для каждого пользователя из данной сети то пишем:
ipfw pipe 10 config mask dst-ip 0x000000ff bw 1024bit/s  queue
ipfw add pipe 10 tcp from any to 1.1.1.0/24 via fxp0
Теперь каждый хост из сети 1.1.1.0/24 имеет свой канал 1024bit/s
 
Как запретить открывать более 30 соединений с одного IP   Автор: [есть мнение]
 
Запретим более 30 коннектов для 80 порта сервера 1.2.3.4.
    ipfw add allow tcp from any to 1.2.3.4 80 limit src-addr 30
    ipfw add allow tcp from any to 1.2.3.4 80 via fxp0 setup limit src-addr 10
Вместо src-addr можно использовать src-port, dst-addr, dst-port
Конструкция работает в последних версиях FreeBSD 4.x ветки.
 
Ограничение трафика через iptables (1)   Автор: Z0termaNN  [есть мнение]
 
iptables --new-chain car
iptables --insert OUTPUT 1 -p tcp --destination-port 25 -o eth1 --jump car
iptables --append car -m limit --limit 20/sec --jump RETURN
iptables --append car --jump DROP
 

   Пакетные фильтры и фаерволы

   Пакетные фильтры в Linux: iptables, ipchains

Обход блокировки BitTorrent трафика, через отправку фиктивных RST пакетов (1)   Автор: tuxtraining.com  [есть мнение]
 
Некоторые сетевые операторы, например Comcast, используют ПО Sandvine для нарушения работы BitTorrent.

Принцип действия Sandvine в отправке клиенту поддельных RST пакетов, приводящих к прерыванию соединения.
Простейший способ борьбы с подобной практикой блокирования - запретить прием пакетов с RST флагом:

   iptables -A INPUT -p tcp --dport 6883 --tcp-flags RST RST -j DROP

где, 6883 - номер BitTorrent порта.

Пример скрипта, оставляющего возможность входящих соединений только для BitTorrent:

#!/bin/sh
# Номер порта BitTorrent
BT_PORT=6883
# Сброс настроек iptables
iptables -F
# Разрешаем трафик на loopback интерфейсе
iptables -A INPUT -i lo -j ACCEPT

# Молча отбрасываем RST пакеты
iptables -A INPUT -p tcp --dport $BT_PORT --tcp-flags RST RST -j DROP
# Пропускаем уже установленные входящие соединения
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешаем прием соединений для BitTorrent
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport $BT_PORT -j ACCEPT
iptables -A INPUT -m state --state NEW -m udp -p udp --dport $BT_PORT -j ACCEPT
# Все остальные входящие соединения блокируем
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
 
Как заблокировать через iptables пакеты отправленные из определенной ОС (1)   Автор: Evgeniy Polyakov  [есть мнение]
 
Модуль ost был написан для использования в iptables правилах результатов пассивного определения 
типа операционной системы, из которой был отправлен TCP SYN пакет.

Загружаем исходные тексты модуля или ставим из patch-o-matic:
   wget http://tservice.net.ru/~s0mbre/archive/osf/osf-2008_06_14.tar.gz

В Makefile через переменную IPTABLES указываем путь к заголовочным файлам iptables (iptables.h и libiptc/).

Собираем модуль ipt_osf.ko: 
   make 


Собираем библиотеку libipt_osf.so, после чего копируем ее в /lib/iptables или /lib64/iptables:
   make lib

Собираем утилиты  для загрузки сигнатур ОС и ведения лога (load, osfd, ucon_osf):
   make bin

Загружаем список сигнатур:
   wget http://www.openbsd.org/cgi-bin/cvsweb/src/etc/pf.os

Загружаем модуль ядра:
   insmod ./ipt_osf.ko


Загружаем сигнатуры:
   ./load ./pf.os /proc/sys/net/ipv4/osf

Пример правила для принятия пакетов с Linux машин, с занесением всех остальных в лог:
   iptables -I INPUT -j ACCEPT -p tcp -m osf --genre Linux --log 0 --ttl 2

При отправке с Windows в логе появится:
   ipt_osf: Windows [2000:SP3:Windows XP Pro SP1, 2000 SP3]: 11.22.33.55:4024 -> 11.22.33.44:139

Описание опций можно найти здесь:
   http://tservice.net.ru/~s0mbre/old/?section=projects&item=osf

 
Как увеличить размер таблицы контроля сессий ip_conntrack в Linux   Автор: [есть мнение]
 
Если ядро ругается "kernel: ip_conntrack: table full, dropping packet.", причину флуда 
(скорее всего вирус или сканирование портов) можно найти по списку /proc/net/ip_conntrack
Если просто общая загрузка большая, увеличить размер таблицы можно через /proc/sys/net/ipv4/ip_conntrack_max

Также можно увеличить размерность хэша через параметр  hashsize модуля ip_conntrack:
/etc/modules.conf:

   options ip_conntrack hashsize=N

Более тонкий тюнинг можно произвести через переменные определенные в /proc/sys/net/ipv4/netfilter
 
Как вести лог блокировок в iptables и ipfw   Автор: [есть мнение]
 
Linux:

- Перед правилом блокировки нужно вставить "log" правило:
   iptables -A FORWARD -p tcp -m tcp -s 192.168.0.0/16 --dport 25 \
      -j LOG --log-level debug --log-prefix "outgoing mail" 
   iptables -A FORWARD -p tcp -m tcp -s 192.168.0.0/16 --dport 25 -j DROP

- Проверить запущены ли в системе klogd и syslogd.

- Настроить /etc/syslog.conf на прием kern.debug логов:
   kern.=debug   -/var/log/kernel/info

FreeBSD:
Добавить ключ log в ipfw, например:
   ipfw add 1000 deny log tcp from any to 192.168.10.10 22 via fxp0
   ipfw add 1000 deny log logamount 0 tcp from any to 192.168.10.10 80 via fxp0

Для ведения логов ядро должно быть собрано с IPFIREWALL_VERBOSE или нужно выставить "sysctl -w net.inet.ip.fw.verbose=1".

Далее проверить чтобы в /etc/syslog.conf было упоминание LOG_SECURITY:
   security.*      /var/log/security


Через параметр logamount передается число записей которые будет записано в лог, 
после превышения записи перестанут появляться в логе, до тех пор пока не будет вызвана команда 
"ipfw resetlog". Максимальное число сообщений можно также установить 
через sysctl net.inet.ip.fw.verbose_limit. 
Для отмены лимитирования на число записей, нужно установить атрибут в 0.
 
Статистика сетевых соединений через syslog и iptables   Автор: umask  [есть мнение]
 
Часто недовольные пользователи приходят и просят дать им распечатку логов доступа в интернет. 
Отчасти это позволяет сделать squid, но только при прозрачном проксировании, да и то логи только по http-протоколу.

На помощь приходит iptables и syslog.

Настраиваем в syslog.conf добавление сообщений от ядра уровня debug (или уровня, который вам удобнее)
 в отдельный файл. Лучше всего хранить эти логи на отдельном разделе (их размер огромен! 
но проблему решает gzip - сжимает логи более чем в 10 раз).

В моём syslog.conf была добавлена строка:
      kern.=debug                                 -/var/log/access/access

Желательно, что бы в уровень debug сообщений от ядра не поступало никакой другой информации, 
кроме информации от iptables. У меня так и получилось по умолчанию с уровнем debug.

В rc.firewall было добавлено в самое начало:

   #LOG ALL (!!!). Beware!!!
   #FORWARD
   iptables -A FORWARD -m state --state NEW -j LOG  --log-level debug \
      --log-prefix  'FRWLL_FWD_NEW ' # --log-tcp-options --log-ip-options
   #iptables -A FORWARD -m state --state ESTABLISHED -j LOG  --log-level debug \
   #   --log-prefix 'FRWLL_FWD_ESTBLSHD ' # --log-tcp-options --log-ip-options
   #iptables -A FORWARD -m state --state RELATED -j LOG  --log-level debug \
   #   --log-prefix 'FRWLL_FWD_RLTD ' # --log-tcp-options --log-ip-options
   #iptables -A FORWARD -m state --state INVALID -j LOG  --log-level debug \
   #   --log-prefix 'FRWLL_FWD_INVLD ' # --log-tcp-options --log-ip-options
   #INPUT
   iptables -A INPUT -m state --state NEW -j LOG  --log-level debug \
      --log-prefix 'FRWLL_INPT_NEW ' # --log-tcp-options --log-ip-options
   #iptables -A INPUT -m state --state ESTABLISHED -j LOG  --log-level debug \
   #   --log-prefix 'FRWLL_INPT_ESTBLSHD ' # --log-tcp-options --log-ip-options
   #iptables -A INPUT -m state --state RELATED -j LOG  --log-level debug \
   #  --log-prefix 'FRWLL_INPT_RLTD ' # --log-tcp-options --log-ip-options
   iptables -A INPUT -m state --state INVALID -j LOG  --log-level debug \
      --log-prefix 'FRWLL_INPT_INVLD ' # --log-tcp-options --log-ip-options


Если раскомментировать все строки, то получиться лог с полной статистикой доступа - он будет очень большим. 
Поэтому в данном примере имеем лог только по установкам соединений и ошибочным соединениям в цепочках INPUT и FORWARD.

Итак. В logrotate я добавил (/etc/logrotate.d/access):

   /var/log/access/access {
       sharedscripts
       compress
       rotate 45
       daily
       postrotate
           /bin/killall -HUP syslogd
       endscript
   }

Сжимаем логи каждый день. Храним статистику за последние 45 суток.
Компрессия логов в моём случае дала значительный прирост производительности, поскольку шлюз 
достаточно мощный и скорость парсинга логов упиралась только в чтение с HDD.

В итоге был написан простой скрипт на perl, выдающий статистику в более-менее удобоваримой форме.

Вот и сам скрипт:
-------------------------

   #!/usr/bin/perl


   use CGI qw(:standard);
   use PerlIO::gzip;
   use Switch;

   ##Redefine before start:
   my $LOG_DIR="/var/log/access/";
   my $LOG_FILENAME="access";
   ##end

   my $IP, $FLAG;

   ## Params delimeter in request: "-"
   ($IP, $FLAG) = split(/-/, $ARGV[0]);

   ## if undefine IP or file log FLAG-number or FLAG is empty - parser exit:
   if(!defined($IP)||!defined($FLAG)||$FLAG==""){
     print header; print start_html; 
     print   "Valid parameters required!"; print end_html; exit(1);
   }

   print header;
   print start_html("Stat for: $IP");
   print "<h2>Stat for: $IP</h2><br/>", "\n<pre>";


   switch($FLAG)
   {
       case "0"
       {
           open($FD, "<$LOG_DIR$LOG_FILENAME")
            or die "Cannot open current (0) log-file!<br> File does not exist or access not permitted!<br>";
           while(<$FD>)
           {
                chomp;
                s/gw kernel://g;
                if(grep(/$IP/, $_))
                {
                    print $_, "<br>\n";
                }
           }
           close($FD);
       }
       else 
       {
           open($GZIP, "<:gzip(lazy)", "$LOG_DIR$LOG_FILENAME.$FLAG.gz")
            or die "Cannot open old (", $FLAG, ") log-file!<br> File does not exist or access not permitted!<br>";
           while(<$GZIP>)
           {
                chomp;
                s/gw kernel://g;
                if(grep(/$IP/, $_))
                {
                    print $_, "<br>\n";
                }
           }
           close($GZIP);
       }
   }
   print "</pre>\n";
   print "<br><br>Access stat parser by \"umask at yandex dot ru\"<br>";
   print end_html;

-------------------------

Для работы скрипта необходимо установить модуль PerlIO-gzip. Найти ссылку на модуль можно на cpan.org.

Доступ к статистике можно получить через браузер (скрипт рассчитан для работы как CGI):
   hostname.ru/cgi-bin/parse.pl?192.168.1.1-0

Аргумент понимаеться так:
192.168.1.1 - искомая подстрока.
0 - норме лог файла. В данном случае текущий (в который пока ещё записываются сообщения syslog).
1 - вчерашний,
2 - позавчерашний,
3 - 3 дня назад.
.....
и т.д.

Для меня данное решение оказалось удобным.
 
Скрипт для автоматизации настройки iptables фильтра для локальной сети (1)   Автор: Константин Брызгалов  [есть мнение]
 
На разных машинах в моей локальной сети накопилась куча программ,
которым нужен был выход в интернет напрямую. У каждой свой набор портов.
Захотелось на входе иметь минимальную конфигурацию, описывающую
ресурсы, а на выходе набор разрешающих  правил для iptables.
В основном были клиент-банки - поэтому и такая терминология в программе.
А так вместо банка можно указывать любой ресурс в формате определенном в
man iptables.

Ограничения, недостатки:

1. использование количества портов для одного ресурса менее 16
2. нельзя указать диапазон портов через двоеточие как в iptables
Оба легко устаняются: первое - есть пример в самом скрипте, 
второе через использование другого разделителя для записей на входе, 
проверку наличия ":" - использование другого формата вызова iptables. Мне это не нужно и код не хотел раздувать.


#!/bin/bash
#bkv 2005.10
#Дано: 
#  Два списка:
#  Первый список из записей вида - банк:порты(через запятую)
#  Второй список из записей вида - клиент:банки(через запятую)
#Найти: 
#  Набор разрешающих правил iptables для forward
#Примечания:
#  политика FORWARD по умолчанию - "запрещено все, что не разрешенно"
#  iptables поддерживает одновременное указание не более 15 портов
#Решение: 
#  Создадим отдельную цепочку, например, - CLIENTBANK
#  Сгенерируем необходимые правила и поместим их в цепочку CLIENTBANK
#  Обращения по всем портам из первого списка направим на обработку в CLIENTBANK
#  Перед выполнением все правила связаные с цепочкой CLIENTBANK удалим, чтобы не плодить 
#    правила от многократного запуска

itls="/sbin/iptables"

#Подаем список на обработку awk
#признак первого списка - первое поле BankPorts
#признак второго списка - первое поле ClientBanks
echo -e "\
BankPorts:smtp.mail.ru:25\n\
BankPorts:10.24.70.0/26:22,23\n\
BankPorts:pop.mail.ru:110\n\
BankPorts:bank4.ru:9999,888\n\
BankPorts:bank5.ru:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15\n\
BankPorts:bank6.ru:21,22,23,24,25,26,27,28,29,210,211,212,213,214,215\n\
ClientBanks:192.168.9.0/16:smtp.mail.ru,pop.mail.ru,10.24.70.0/26\n\
ClientBanks:192.168.9.8:bank4.ru,bank5.ru,bank6.ru\n\
ClientBanks:192.168.9.6:bank6.ru,bank4.ru\n\
"|\
awk -v itls=$itls -F: '{
  if($0~/^BankPorts/) BankPorts[$2]=$3 #создаем ассоциативный массив - индекс:банк, значение:порты через запятую
  if($0~/^ClientBanks/) ClientBanks[$2]=$3 #аналогично клиент -> банки
}END{
#Cгенерируем _необходимые_ правила для цепочки CLIENTBANK
for (client in ClientBanks){
  split(ClientBanks[client],bank_arr,",") #поместили в массив bank_arr адреса банков для клиента
  for(i in bank_arr){
      all_ports=all_ports","BankPorts[bank_arr[i]] #создаем список всех портов для дальнейшего использования
      count_ports=split(BankPorts[bank_arr[i]],tmp_arr,",")
      if(count_ports > 15)
        print "echo Слишком много портов для "bank_arr[i]".Допиши программу.Выход&&exit 1"
       else
        printf("%s -A CLIENTBANK -s %s -d %s -p tcp -m multiport --dports %s -j ACCEPT\n",itls,client,bank_arr[i],BankPorts[bank_arr[i]])
      }

}

#Создадим правила перенаправляющие из FORWARD на обработку в CLIENTBANK, помня про ограничение в 15 портов
sub(",","",all_ports) #отрезаем первую запятую у списка всех использующихся портов
split(all_ports,all_ports_arr,",")#поместили в массив all_ports_arr все порты какие есть
j=1;i=1
while(all_ports_arr[i]){
  while(i<=(j*15)){
    if (all_ports_arr[i]) 
      tmp_all_ports=tmp_all_ports","all_ports_arr[i]
    i++
    }
  sub(",","",tmp_all_ports) #отрезаем первую запятую
  printf("%s -I FORWARD -p tcp -m multiport --ports %s -j CLIENTBANK\n",itls,tmp_all_ports)
  tmp_all_ports=""
  j++
  }

print itls" -A CLIENTBANK  -p tcp -m state --state ESTABLISHED -j ACCEPT"
print itls" -N CLIENTBANK"
print itls" -X CLIENTBANK"
print itls" -F CLIENTBANK"

#Удаляем из FORWARD все цепочки содержащие цель CLIENTBANK
del_rules_nums="'`$itls --line-numbers -L FORWARD -n|grep CLIENTBANK|cut -f1 -d" "|tr "\n" ","`'"
split(del_rules_nums,del_rules_arr,",")
cnt_rules=1
while(del_rules_arr[cnt_rules]){
  printf("%s -D FORWARD %s\n",itls,del_rules_arr[cnt_rules])
  cnt_rules++
  }

}'|tac > gen.itls.sh
chmod 700 gen.itls.sh
echo "Команды сгенерированы в файл ./gen.itls.sh .Выход."
exit
./gen.itls.sh
rm ./gen.itls.sh
 
Лимитирование числа запросов в единицу времени через iptables (1)   Автор: Steve  [есть мнение]
 
Разрешаем производить только 4 коннекта к 22 порту в течении 60 секунд:


   iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set

   iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent \
      --update --seconds 60 --hitcount 4 -j DROP
 
Ограничение трафика через iptables (1)   Автор: Николай Малых  [есть мнение]
 
ipt_limit - общее ограничение по срабатываний правила
     -m limit --limit {avg}/[second|minute|hour|day] --limit-burst {burst}

iplimit - ограничение соединений для одного IP.
    Ограничение коннектов к 80 порту от одного IP:
         iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-above 4 -j REJECT
    Тоже, но для запросов с одной /24 подсети:
         iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-mask 8 --iplimit-above 4 -j REJECT


hashlimit - для каждого IP в хэше хранятся параметры соединений;
    -m hashlimit --hashlimit {avg} --hashlimit-burst {burst} --hashlimit-mode {режим: dstip, dstport, srcip, srcport} \
       --hashlimit-name {name} --hashlimit-htable-max {num} --hashlimit-htable-expire {num} --hashlimit-htable-gcinterval {num}

    iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit 1/hour \
       --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name SSH --hashlimit-htable-expire 360000 -j ACCEPT

tbf (http://www.nmalykh.org/work/tbf.tar.gz) - продолжение развития limit и hashlimit c поддержкой 
возможности инверсии правил в целом.

    iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m tbf ! -- tbf 1/s --tbf-burst 
       --tbf-mode srcip --tbf-name SMTP  -j DROP
 
Примеры возможностей iptables открывающихся после установки POM (patch-o-matic) (1)   Автор: [есть мнение]
 
Фильтрация по строковой маске:
   iptables -A FORWARD -i eth0 -p tcp --sport 80 \
      -m string --string '|7F|ELF' -j DROP
   iptables -A FORWARD -i eth0 -p tcp \
      ! -s 192.168.0.5 --sport 80 -m string \
      --string '|7F|ELF' -j DROP


Сжатая компоновка номеров портов в одной строке:
   iptables -A INPUT -p tcp -m mport \
      --dports 80,110,21,6000:6003 -j ACCEPT

Учет времени при блокировке:
   iptables -A INPUT -p tcp -d 80 -m time \
      --timestart 04:00 --timestop 06:30 --days Fri \
      --syn -j REJECT

Коннект в пустоту (соединение не закрывается, но ничего не происходит):
   iptables -A INPUT -p tcp -m tcp -dport 80 -j TARPIT

Срабатывание правила с заданной вероятностью (в процентах):

   iptables -t nat -A PREROUTING -i eth0 -p tcp \
      --dport 80 --syn -m random --average 33 \
      -j DNAT --to-destination 192.168.0.100:80
   iptables -t nat -A PREROUTING -i eth0 -p tcp \
      --dport 80 --syn -m random --average 50 \
      -j DNAT --to-destination 192.168.0.101:80
   iptables -t nat -A PREROUTING -i eth0 -p tcp \
      --dport 80 --syn -j DNAT \
      --to-destination 192.168.0.102:80


См. также статью http://linuxgazette.net/108/odonovan.html
 
Как удалить iptables правило по номеру   Автор: [обсудить]
 
iptables -L INPUT --line-numbers
iptables -D INPUT номер

iptables -t nat -L POSTROUTING --line-numbers
iptables -t nat -D POSTROUTING номер
 
Как ограничить пропускную полосу для пакетов помеченных меткой через MARK.   Автор: Denis Fedorishenko (NuclearCat)  [есть мнение]
 
Сделать MARK, и загнать все такие трансферы в какой-либо класс шейпера. 
Т.е. если например помеченные пакеты - все их отнести к классу 1:51 где скорость ограничена от 32К до 64К:
  tc filter add dev eth1 parent 1:0 protocol ip prio 100 handle 51 fw classid 1:51
  tc class add dev eth1 parent 1:2 classid 1:51 htb rate 32Kbit ceil 64Kbit
  tc qdisc add dev eth1 parent 1:51 handle 51 sfq perturb 10
 
Как запретить пользователям качать большие файлы   Автор: Denis Fedorishenko (NuclearCat)  [обсудить]
 
- Собираем поддержку connbytes в patch-o-matic.
- Добавляем правило в firewall, например:
     iptables -A FORWARD --connbytes 100000 -j REJECT
- теперь все TCP сессии более 100 Кбайт будут "обрезаны", необходимо добавить 
исключения для протоколов типа ssh, обычные "долгоживущие" чаты и т.п.
 
Борьба с Kazaa и прочим вредным трафиком путем вырезания пакетов по маске   Автор: Denis Fedorishenko (NuclearCat)  [есть мнение]
 
- собираем поддержку "string" в patch-o-matic.
- смотрим на протокол Kazaa, в заголовках содержится:
  HTTP/1.0 503 Service Unavailable.Retry-After: 3..X-Kazaa-Username: BlazeTre
- добавляем в firewall строчку - iptables -A FORWARD -m string --string "X-Kazaa-" -j REJECT
 
Как в Linux перебросить соединение через NAT во внутреннюю сеть (1)   Автор: Dimez  [есть мнение]
 
Первый путь - пробрасывание только порта:
  1) iptables -t nat -A PREROUTING -p tcp -d EXT_R_IP --dport 10000 -j DNAT --to-destination LOCAL_IP:80
  2) iptables -A FORWARD -i eth0 -d LOCAL_IP -p tcp --dport 22 -j ACCEPT

Второй вариант - выброс всей машины наружу (если есть свободные адреса):
  1) ifconfig eth0:0 NEW_IP netmask NETMASK broadcast BROADCAST
  2) route add NEW_IP gw GW netmask 0.0.0.0 metric 1 dev eth0:0
  3) iptables -t nat -A PREROUTING -p tcp -d NEW_IP -j DNAT --to-destination LOCAL_IP
  4) iptables -A FORWARD -i eth0 -d LOCAL_IP -j ACCEPT

Обозначения: EXT_R_IP - внешний IP роутера, LOCAL_IP - внутренний IP машины, которую хочешь выбросить
  NEW_IP - новый IP на который хочешь посадить машину, которая имеет локальный LOCAL_IP
  NETMASK, BROADCAST, GW - внешние netmask, broadcast и gateway
 
Пример настройки NAT с привязкой к IP под Linux   Автор: [есть мнение]
 
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0/0 -o eth0 -j SNAT --to-source 212.23.98.45
или (без привязки к IP)
  ipchains -A forward -j MASQ -s 192.168.0.0/16 -d 0.0.0.0/0
или (через iproute2)
  ip rule add from 10.0.1.0/24 nat 254.147.38.14

Диругой способ трансляции адресов:
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0/0 -j MASQUERADE
 
Как ограничить через iptables максимальное число одновременных соединений с одного IP.   Автор: [есть мнение]
 
# Максимум 10 одновременных соединений к 80 порту с одного IP
  iptables -A INPUT-p tcp --dport 80 -m iplimit --iplimit-above 10 -j REJECT
# Блокируем на стадии SYN
  iptables -I INPUT -p tcp --syn --dport 80 -j DROP -m iplimit --iplimit-above 10
# 20 соединений на сеть класса С
  iptables -p tcp --dport 80 -m iplimit --iplimit-above 20 --iplimit-mask 24 -j REJECT 
  
 
Как посмотреть статистику по PREROUTING цепочкам в iptables.   Автор: [есть мнение]
 
> Делаю:
> iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.22.33:3128
> По iptables -L ничего не показывается.
Используйте: iptables -t nat -L
 
Как настроить пакетный фильтр для фильтрации по содержимому пакетов   Автор: [есть мнение]
 
Следующие правила блокируют прохождение пакетов, данные в которых содержат подстроку virus.exe
и ведут лог пакетов с строкой secret внутри:
iptables -A INPUT -m string --string "secret" -j LOG --log-level info --log-prefix "SECRET"
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --string "virus.exe"
# Block Code Red
iptables -I INPUT -j DROP -p tcp -m string --string "cmd.exe"
# Block Nimda
iptables -I INPUT -j DROP -p tcp -m string --string "root.exe"
iptables -I INPUT -j DROP -p tcp -m string --string "default.ida"
 
Как настроить NAT (транслятор адресов) для нормальной работы с FTP и ICQ в Linux   Автор: [есть мнение]
 
iptables:
   modprobe iptable_nat
   modprobe ip_conntrack_ftp
   modprobe ip_nat_ftp                     
   modprobe ip_nat_irc

ipchains:
   modprobe ip_masq_ftp
   modprobe ip_masq_raudio
   modprobe ip_masq_irc
   modprobe ip_masq_icq
 
Список интересных iptables модулей-расширений. (1)   Автор: [обсудить]
 
Фильтрация по MAC (mac): 
    --mac-source [!] XX:XX:XX:XX:XX:XX (! - "не" маска.)
Запись номеров портов (multiport):
    --source-port [port[,port]]
    --destination-port [port[,port]]
    --port [port[,port]]  (source или destination)
Установка и проверка маркера пакет (mark):
    --set-mark mark
    --mark value
Выборка пакетов посланных/полученных пользователем (owner):
    --uid-owner userid
    --gid-owner groupid
    --pid-owner processid
Установка/проверка типа сервиса (TOS/tos):

    --set-tos tos
    --tos tos
Определение log-level для syslog (LOG):
    --log-level level
Установка реального IP для работы NAT (SNAT, цепочка POSTROUTING):
    --to-source  <ipaddr>[-<ipaddr>][:port-port]
Изменение/проверка TTL - time to live (TTL/ttl):
    --ttl-set ttl
    --ttl-dec N - уменьшение на N
    --ttl-dec N - увеличение на N
    --ttl ttl - проверка
 
Можно ли отфильтровывать пакеты (вести лог) в зависимости от UID пользователя ?   Автор: [обсудить]
 
Для FreeBSD:
ipfw add count tcp from any to not 192.168.1.0/24 uid 231
uid user (или gid group) - под правило попадают все TCP или UDP пакеты посланный 
или принятые пользователем user (группой group).
В Linux в ядрах 2.4.x в iptables можно использовать модуль owner.
 
Ограничение трафика через iptables (1)   Автор: Z0termaNN  [есть мнение]
 
iptables --new-chain car
iptables --insert OUTPUT 1 -p tcp --destination-port 25 -o eth1 --jump car
iptables --append car -m limit --limit 20/sec --jump RETURN
iptables --append car --jump DROP
 

   Пакетный фильтр в FreeBSD: ipfw, IP-Filter

Экспорт Netflow средствами netgraph во FreeBSD   Автор: VS  [есть мнение]
 
При сборке ядра указываем:

   options		IPFIREWALL
   options		NETGRAPH
   options		NETGRAPH_SOCKET
   options		NETGRAPH_IPFW
   options		NETGRAPH_NETFLOW
   options		NETGRAPH_KSOCKET

либо подгружаем модули:

   kldload ipfw.ko
   kldload netgraph
   kldload ng_socket
   kldload ng_ipfw
   kldload ng_netflow
   kldload ng_ksocket


для их автозагрузки в /boot/loader.conf добавляем: 

   ipfw_load="YES"
   ng_netflow_load="YES"
   ng_socket_load="YES"
   ng_ksocket_load="YES"
   ng_ipfw_load="YES"


в ipfw правила

   ipfw add 02210 netgraph 100 ip from any to any via vlan108
   ipfw add 02220 netgraph 100 ip from any to any via vlan208


Скрипт, для поднятия netflow:

#!/bin/sh
. /etc/rc.subr
 
name="ngnetflow"
rcvar=`set_rcvar`

load_rc_config $name
: ${ngnetflow_enable="NO"}
: ${ngnetflow_src="127.0.0.1:9999"}
: ${ngnetflow_dst="127.0.0.1:9996"}

start_cmd="ngnetflow_start"
stop_cmd="ngnetflow_stop"

ngnetflow_start() {

/usr/sbin/ngctl -f- <<-SEQ
mkpeer ipfw: netflow 100 iface0
name ipfw:100 netflow
connect ipfw: netflow: 108 out0
msg netflow: setdlt { iface=0 dlt=12 }
msg netflow: settimeouts { inactive=30 active=600 }
mkpeer netflow: ksocket export inet/dgram/udp
name netflow:export flowexp
msg flowexp: bind inet/${ngnetflow_src}
msg flowexp: connect inet/${ngnetflow_dst}
SEQ

}

ngnetflow_stop() {
/usr/sbin/ngctl -f- <<-SEQ
shutdown netflow:
SEQ
}

run_rc_command "$1"
 
Как сделать отказоустойчивый брандмауэр с распределением нагрузки на FreeBSD (1)   Автор: Сгибнев Михаил  [есть мнение]
 
Задача: 

Сконфигурировать два или более отказоустойчивых брандмауэра на базе IPF с функцией балансировки нагрузки 
(далее - "FWLB") для кластера, предоставляющего сервис в сети Интернет.
Если один из брандмауэров приходит в негодность, то его функции будет выполнять второй. 
В этом случае мы получим высокодоступную систему с черезвычайно малым временем простоя и, 
как мы надеемся, сэкономит немало средств на специализированных устройствах.
	  
Наша задача - получить нижепреведенную конфигурацию:


                         ~~~
                       ( net )
                         ~~~
                          |
                          |
                          |
                      ----------
                     |  switch  |
                      ---------- 
                      /        \
                     /   VIP    \
             ---------         --------
            |  fwlb1  |       | fwlb2  |
             ---------         --------
                    \    VIP   /
                     \        /
                      ---------
                     | switch |
                      ---------
                      /      \ 
                     /        \
              ---------        ---------
             | server1 |      | server2 |
              ---------        ---------

               
Где первый VIP (Virtual IP) это публичный IP адресс вашего сайта, 
а второй - приватный IP согласно RFC 1918, который будет использоваться 
серверами в качестве шлюза по умолчанию.


Требования:

- Два сервера с FreeBSD-STABLE. У каждого из них - по 2 сетевые карты
- Два коммутатора/хаба
- Два или более серверов для кластера, на котором запущен предоставляемый сервис
- /usr/ports/net/pen
- /usr/ports/net/freevrrpd
- /usr/ports/sysutils/daemontools или /usr/ports/sysutils/runit
- Ядро, скомпилированное с опциями IPFILTER и IPFILTER_LOG


Pen является простым, но гибким балансировщиком.
FreeVRRPd будет обеспечивать отказоустойчивость. 
Daemontools(или runit, с более дружественной лицензией и похожим функционалом) не является необходимым, 
но весьма полезен для контроля и управления процессами, поэтому тоже рекомендован к использованию.
	
Выполнение:

Часть 1: Брандмауэр

Создайте набор правил IPF(или IPFW, или PF), разрешающий трафик на стороне сервиса, 
который нуждается в балансировке. По желанию, разрешите доступ к кластеру серверов через NAT, 
если есть необходимость в исходящих соединениях.  Конфигурирование IPF/IPNAT не рассматривается в данной статье, 
но на эту тему написано достаточно много. Два пункта, которые очень важно иметь в виду, 
заключаются в том, что вам необходимо удостовериться, что разрешен multicast между брандмауэрами 
(необходимо для работы VRRP) и запрещен для всех других хостов (иначе возникнет угроза безопасности). 
Для получения ополнительной информации по IPF, обратитесь к:
               
 http://www.nwo.net/ipf/ipf-howto.html

 http://coombs.anu.edu.au/~avalon/ip-filter.html   
        
Скомпилировав ядро с опциями, указанными выше, вносим следующие изменения в /etc/rc.conf:
            
                ipfilter_enable="YES"
                ipfilter_rules="/etc/ipf.conf"
                ipnat_rules="/etc/ipnat.conf" 
                ipnat_flags="-CF"
                ipmon_enable="YES"

И переносим набор правил в указанные места.



Часть 2: Балансировщик

1) Создаем необходимых пользователей и каталоги.

        mkdir -p /etc/supervise/pen/log
        mkdir -p /var/chroot/pen
        mkdir -p /var/log/pen
        pw useradd pen -s /bin/false -d /var/chroot/pen
        pw useradd penlog -s /bin/false -d /var/chroot/pen
        chown penlog:pen /var/log/pen

2) Создаем файлы, необходимые для запуска pen.

        cd /etc/supervise/pen
        cat << _EOF_ > run
        #!/bin/sh


        exec 2>&1
        exec pen -d -u pen -j /var/chroot/pen -C localhost:8888 -f -r 80 hostname1 hostname2

        _EOF_
        chmod 755 run
        cd log
        
        cat << _EOF_ > run
        #!/bin/sh
        
        exec /usr/local/bin/setuidgid penlog /usr/local/bin/multilog s999999 n20 /var/log/pen

        _EOF_
        chmod 755 run


Так мы сконфигурируем pen для запуска в pen в /var/chroot/pen и портом управления 8888. 
Он будет балансировать входящий 80 порт на порт 80 hostname1 на hostname2. 
Тип балансировки - round-robin - если необходимы постоянные сессии, удалите флаг "-r".
В этом примере pen запущен в режиме отладки, что упростит настройку. 
При промышленном использовании можно удалить флаг "-d". 

      
3) Запуск балансировщика нагрузки.

        cd /service
        ln -s /etc/supervise/pen
        echo "csh -cf '/usr/local/bin/svscanboot &'" >> /etc/rc.local
        csh -cf '/usr/local/bin/svscanboot &'
        sleep 5 && svstat pen

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

Так же изучите /var/log/pen/current на обоих брандмауэрах.



Часть 3: Отказоустойчивость

1) Сперва сконфигурируйте syslog для сбора сообщений VRRP.

        touch /var/log/freevrrpd.log
        cat << _EOF_ >> /etc/syslog.conf


        !freevrrpd
        *.*                     /var/log/freevrrpd.log

        _EOF_


2) Конфигурирование FreeVRRPd
       
До этого пункта, обе машины были равноправны.    Теперь вам необходимо выбрать, какой FWLB будет primary. 
На этой машине скопируйте /usr/local/etc/freevrrpd.conf.sample в /usr/local/etc/freevrrpd.conf. 

Отредактируйте файл, как показано ниже:

        # public-facing VRID
        [VRID]
        serverid = 1
        interface = fxp0
        priority = 255
        addr = 198.123.111.1/32
        password = vrid1
        vridsdep = 2

        # backend VRID
        [VRID]
        serverid = 2
        interface = fxp1
        priority = 255
        addr = 10.0.0.1/32
        password = vrid2
        vridsdep = 1


В результате мы получим 2 VRID - один для внешней сети, второй для внутренней, 
который будет использоваться кластером серверов.
В этом примере оба VRIDs сконфигурированы, чтобы считать этот хост главным при выборах VRRP.
               
Заметьте - оба VRID зависят друг от друга, что определено полем "vridsdep". 
Это означает, что, если один из интерфейсов в FWLB падает, другой автоматически перейдет в резервный режим, 
переводя оба интерфейса на резервный FWLB. 

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

Теперь вы должны скопировать этот файл на slave FWLB, и изменить оба поля priority на значение 100. 
Измените пароль на что-то более безопасное, чем на примере, но особо не расчитывайте на пароли VRRP 
в плане безопасности. Если другой брандмауэр, находящийся вне связки сможет общаться с вашими по VRRP, 
то у вас будут проблемы.
  
3) Запуск FreeVRRPd

Теперь вы можете запустить freevrrpd на обоих брандмуэрах:

        cp /usr/local/etc/rc.d/freevrrpd.sh{.sample,}
        /usr/local/etc/rc.d/freevrrpd.sh start


Часть 4: Проверка отказоустойчивости

Теперь нам необходимо проверить получившуюся систему на отказоустойчивость. 
Сперва только надо запустить на обоих FWLB SSH, чтобы была возможность 
проверять правильность переключения интерфейсов. Попробуйте следующие сценарии:

  - С одной из машин кластера залогиньтесь по SSH на 10.0.0.1(внутренний интерфейс). 
    Убедитесь, что это именно master FWLB.
  - Сделайте попытку соединения на 198.123.111.1(внешний интерфейс), порт 80 и 
    посмотрите /var/log/pen/current, чтобы проверить факт соединения. 
  - Отключить внешний интерфейс FWLB1.
  - Проверьте логи на FWLB2.  Сделайте попытку соединения на 198.123.111.1, 
    порт 80, чтобы проверить факт соединения.
  - Зайдите по SSH на 10.0.0.1.  Вы должны увидеть FWLB2 в баннере SSH.
  - Подключите внешний интерфейс к FWLB1.  Проверьте, что оба интерфейса FWLB1 вернулись в состояние master.

Теперь повторите тест, отключая внутренний интерфейс. Если есть такое желание, 
то можно просто нажать Reset на FWLB1.
       
Примечания:

Удаление серверов из пула:

Pen не может перманентно удалить сервера из пула, но мы можем указать ему игнорировать сервер, 
пока, например, идет его обновление или что-то подобное. Для этого выполните команду:

   penctl localhost:8888 server $servername blacklist 99999


Это поместит сервер в черный список на 99999 секунд. Для возвращения сервера в пул выполните команду:

   penctl localhost:8888 server $servername blacklist 1

Так мы выставим таймаут черного списка в 1 секунду, после чего сервер вернется в пул.

Перманентное удаление или добавление серверов в пул:

В случае, если есть необходимость добавить или удалить из пула несколько серверов, 
нужно отредактировать файл /service/pen/run. Просто добавьте имена хостов в конец команды запуска pen и выполните:

   svc -t /service/pen

Эта команда пошлет сигнал TERM и перезапустит pen. Хотя эта операция и не должна сказаться на доступности сервиса, 
лучше такие вещи делать в специально определенное время. 

Ссылки:

 http://www.faqs.org/rfcs/rfc2338.html
 http://www.bsdshell.net/hut_fvrrpd.html
 http://siag.nu/pen/

 http://cr.yp.to/daemontools.html
 http://smarden.org/runit


© 2004 David Thiel --- lx [@ at @] redundancy.redundancy.org
 
Использование таблиц для блокирования большого числа IP в pf или ipfw (1)   Автор: [есть мнение]
 
Список IP адресов или подсетей находится в файле /etc/block1.txt
Например:
  10.10.1.1
  10.10.1.2
  192.168.0.0/16


IPFW
----

Блок чтения IP в таблицу, проверка в которой будет осуществляться 
не через последовательный перебор правил, а через выборки из хэша:
 
   ipfw table 1 flush
   cat /etc/block1.txt | while read ip; do
      # echo ipfw table 1 add $ip 1
      ipfw table 1 add $ip 1
   done

Привязка таблицы к правилу блокировки:

   ipfw add 100 deny ip from "table(1)" to any via em1

Просмотр содержимого таблицы:
   ipfw table 1 list

PF
--

/etc/pf.conf

   table <blockedips> persist file "/etc/block1.txt"
   ext_if="em1" 
   block drop in log (all) quick on $ext_if from <blockedips> to any


Проверка корректности правил PF:
   pfctl -nf /etc/pf.conf

Чтение правил PF:
   pfctl -f /etc/pf.conf

Добавление и удаление адресов из таблицы на лету:
   pfctl -t blockedips -T add 192.168.1.1
   pfctl -t blockedips -T delete 192.168.1.1

Просмотр содержимого таблицы и более подробной статистики по каждому адресу:
   pfctl -t blockedips -T show
   pfctl -t blockedips -T show -v

Просмотр лога срабатываний блокировок, умолчанию сохраняемого в /var/log/pflog:

   tcpdump -n -e -ttt -r /var/log/pflog
   tcpdump -n -e -ttt -r /var/log/pflog port 80
   tcpdump -n -e -ttt -r /var/log/pflog and host 192.168.1.1

Срабатывание блокировок в режиме реального времени:
   tcpdump -n -e -ttt -i pflog0
   tcpdump -n -e -ttt -i pflog0 port 80
   tcpdump -n -e -ttt -i pflog0 host 192.168.1.1
 
ipfw nat во FreeBSD 7   Автор: Pikador  [есть мнение]
 
В конфигурацию ядра добавляем:

   options         IPFIREWALL              #firewall
   options         IPFIREWALL_VERBOSE      #enable logging to syslogd(8)
   options         IPFIREWALL_DEFAULT_TO_ACCEPT    #allow everything by default
   options         IPDIVERT
   options         IPFIREWALL_FORWARD
   options         DUMMYNET
   options         IPFIREWALL_NAT          #ipfw kernel nat support
   options         LIBALIAS

в /etc/make.conf:

   CFLAGS+= -DIPFIREWALL_NAT

Далее пересобираем систему:

   cd /usr/src/ ; make builworld && make kernel KERNCONF=YourKern &&  make installworld
   reboot


В конфигурационном файле ipfw:

   NatIP="111.111.111.111"
   ipfw nat 123 config ip ${NatIP} log
   ipfw add 10 nat 123 ip from 192.168.0.0/16 to any
   ipfw add 20 nat 123 ip from any to ${NatIP}

Наслаждаемся достоинствами kernel nat
 
Автоматическая синхронизация таблиц ipfw   Автор: freeseacher  [есть мнение]
 
Вот таким скриптом можно периодически синхронизировать на всех сереверах таблицы ipfw

#!/bin/sh 

#CHANGE ME
prefix="/etc/tables"
host="10.0.0.2"
user="table"

#standart variables
rsync="/usr/local/bin/rsync"
agg="/usr/local/bin/aggregate -t -q"
ipfw="/usr/local/bin/sudo /sbin/ipfw"


${rsync} -q --rsh=ssh --rsync-path=${rsync} -d ${user}@${host}:${prefix}'/*' ${prefix} 


TOPROCESS=`find ${prefix}/ -type f ! -name '*.agg' -name 'table*'` 
for i in $TOPROCESS; do
        cat $i|awk '{if (! match($1,"/")) print $1"/32"; else print $1}' |$agg >$i.agg
        t_num=`/usr/bin/basename $i |awk -F "table" '{print $2}'`

        # Таблица реально существующих клиентов
        for SUBNET in `\
                ${ipfw} table ${t_num} list | /usr/bin/cut -f 1 -d " " | /usr/bin/diff $i.agg - | \
                /usr/bin/grep -v [a-z] | /usr/bin/grep ">" | /usr/bin/cut -f 2 -d " " ` ; do
                ${ipfw} -q table ${t_num} delete $SUBNET &
                /usr/bin/logger -p local4.info "ip $SUBNET blocked as no customer" &
        done && \


        for SUBNET in `\
                ${ipfw} table ${t_num} list | /usr/bin/cut -f 1 -d " " | /usr/bin/diff $i.agg - | \
                /usr/bin/grep -v [a-z] | /usr/bin/grep "<" | /usr/bin/cut -f 2 -d " " ` ; do
                ${ipfw} -q table ${t_num} add $SUBNET &
                /usr/bin/logger -p local4.info "ip $SUBNET added as customer ip" &
        done
done

на выделенном серевере (например биллинге) в /etc/tables складывать файлики table100 table2 
после прописывания везде одинаковых пользователей и разброса 
ключей, получаем эллегантное решение по синхронизации таблиц

PS: рабочая часть взята из http://www.opennet.ru/openforum/vsluhforumID3/32321.html#3
 
Пример использования таблиц блокировки в ipfw   Автор: [есть мнение]
 
Блокировка производится командой:

   ipfw add deny ip from "table(1)" to any via em0 

/etc/load_table.sh:

   #!/bin/sh
   ipfw table 1 flush
   cat /etc/block.txt | while read cnt ip; do
       ipfw table 1 add $ip
   done 

формат /etc/block.txt: "cnt ip"
получем, например, из tcpdump лога атаки:

   tcpdump -n -i em0 udp and port 80 > ./tcpdump.log
   cat ./tcpdump.log |cut -d' ' -f3|cut -d'.' -f1,2,3,4|sort|uniq -c |sort -r -n > /etc/block.txt

 
Пример структурирования правил ipfw (1)   Автор: Vadim Guchenko  [есть мнение]
 
Пример структурирования правил фильтра пакетов ipfw во FreeBSD 
с целью упрощения их восприятия и уменьшения  вероятности допущения ошибок.

Исторически так сложилось, что правила файрвола в rc.firewall написаны в плохом и труднопонимаемом стиле: 
входящие и исходящие пакеты проходят один и тот же набор правил. 
Многие используют этот скрипт как образец для написания собственного набора правил и
наступают на одни и те же грабли. Как минимум, с натом. На самом деле ipfw очень удобен, 
если писать список правил как некую программу - с разбиением на мелкие подпрограммы (блоки) 
и добавлением комментариев. При этом надо руководствоваться рядом
соглашений:


1. Весь трафик первым делом делится на входящий и исходящий. 
Каждый вид трафика обрабатывается в отдельном блоке. 
В качестве еще одного блока можно выделить трафик через интерфейс lo0. 
Слова in и out после первоначального разделения трафика не
используются.


2. Входящий трафик делится на а) трафик, адресованный данному серверу; 
б) броадкасты; в) мультикасты; г) трафик, идущий транзитом. Каждый из видов трафика 
обрабатывается в отдельном блоке. Слово me после разделения трафика не используется.


3. Ветвление на блоки происходит по ip-адресам. Имена интерфейсов используются по возможности 
как можно реже и только тогда, когда без них не обойтись. В частности, при написании 
правил антиспуфинга. При использовании имен интерфейсов крайне не
рекомендуется 
использовать слово via. В зависимости от блока (входящий или исходящий трафик) рекомендуется 
использовать слова xmit или recv. Это повышает читабельность.


4. Все строки с правилами нумеруются (там где это допустимо). 
Нумерация строго возрастающая. Рекомендуемый шаг между соседними номерами 100.


5. Блок занимает строго фиксированный диапазон номеров строк ipfw. 
Номер строки, с которой начинается блок, указывается в комментарии в начале этого блока. 
Переход на блок происходит только на его начало. Переход в середину блока недопустим.


6. Блок всегда заканчивается строкой allow ip from any to any или deny ip from any to any. 
Исключение составляет ситуация, когда один блок должен выполняться следом за другим. 
Даже если блок пустой (например, броадкасты или мультикасты не используются),
все равно лучше поместить в него это единственное правило, чем удалять блок целиком. 
Возможно в будущем туда что-нибудь допишется.



Пример я как-то уже приводил несколько лет назад. 
Приведу еще раз для трех разных серверов. Макросы, начинающиеся с %, заменятся на блоки ip-адресов. 
На всех серверах дефолтное 65535 правило: allow ip from any to any.

Правила на центральном роутере/шлюзе в инет:


#!/bin/sh -e

fwcmd="echo"

# Интерфейсы, подключенные к Интернету
xmit_iface_inet="{ xmit fxp1 or xmit fxp2 }"
recv_iface_inet="{ recv fxp1 or recv fxp2 }"

# Ограничение количества ping-пакетов, уходящих на аплинка
$fwcmd pipe 10 config bw 5Kbit/s

######################################################################
## Разделение трафика в зависимости от направления (нумерация с 100)
######################################################################
# Трафик через интерфейс lo0
$fwcmd add 100 allow ip from any to any via lo0

# Исходящий трафик
$fwcmd add 200 skipto 30000 ip from any to any out

######################################################################
## Входящий трафик (нумерация с 500)
######################################################################

# Съем трафика для статистики
$fwcmd add 500 divert 18000 ip from any to any $recv_iface_inet

# NAT-трансляция входящих пакетов
$fwcmd add 700 divert 8668 ip from any to %ip.nat $recv_iface_inet

##-----------------------------------------------------------------------------
## Антиспуфинг (нумерация с 1000)
##-----------------------------------------------------------------------------

# Интерфейсы Интернета
$fwcmd add 1000 deny log ip from %global.internal to any $recv_iface_inet

##-----------------------------------------------------------------------------
## Разделение трафика в зависимости от получателя пакета (нумерация с 5000)
##-----------------------------------------------------------------------------

# Трафик, адресованный серверу
$fwcmd add 5000 skipto 10000 ip from any to me

# Броадкасты
$fwcmd add 5100 skipto 20000 ip from any to 255.255.255.255

# Мультикасты
$fwcmd add 5200 skipto 25000 ip from any to 224.0.0.0/4

##-----------------------------------------------------------------------------
## Трафик, идущий транзитом (нумерация с 6000)
##-----------------------------------------------------------------------------

# Запрещаем трафик на закрытые адреса магистрали
$fwcmd add 6000 deny log ip from any to %global.backbone.private

# Разрешаем остальной трафик
$fwcmd add 6300 allow ip from any to any

##-----------------------------------------------------------------------------
## Трафик, адресованный серверу (нумерация с 10000)
##-----------------------------------------------------------------------------

# Разрешаем установленные TCP-соединения
$fwcmd add 10000 allow tcp from any to any established

# Разрешаем фрагменты IP-пакетов
$fwcmd add 10100 allow ip from any to any frag

# Разрешаем пакеты, удовлетворяющие динамическим правилам
$fwcmd add 10200 check-state

# Разрешаем OSPF-пакеты
$fwcmd add 10300 allow ospf from %global.backbone to any

# Разрешаем GRE-пакеты
$fwcmd add 10400 allow gre from any to any

##-----------------------------------------------------------------------------
## Службы сервера (нумерация с 12000)
##-----------------------------------------------------------------------------

# SSH
$fwcmd add 12000 deny tcp from %deny.ssh to %ip.ssh 22
$fwcmd add 12100 allow tcp from %allow.ssh to %ip.ssh 22

# BGP
$fwcmd add 12200 deny tcp from %deny.bgp to %ip.bgp 179
$fwcmd add 12300 allow tcp from %allow.bgp to %ip.bgp 179

# SNMP
$fwcmd add 12400 allow udp from %allow.snmp to %ip.snmp 161,1161

##-----------------------------------------------------------------------------
## Завершающие правила для трафика, адресованного серверу (нумерация с 18000)
##-----------------------------------------------------------------------------

# Разрешаем ICMP-пакеты
$fwcmd add 18000 allow icmp from any to any

# Разрешаем работу traceroute
$fwcmd add 18100 unreach port udp from any to any 33434-33584

# Запрещаем соединения на 113 порт (ident)
$fwcmd add 18200 reset tcp from any to any 113

# Запрещаем соединения на 1080 порт (socks check)
$fwcmd add 18300 reset tcp from any to any 1080

# Запрещаем остальной трафик
$fwcmd add 18400 deny log ip from any to any

##-----------------------------------------------------------------------------
## Броадкасты (нумерация с 20000)
##-----------------------------------------------------------------------------

# Разрешаем SNMP trap'ы от ИБП
$fwcmd add 20000 allow udp from %global.backbone to any 162

# Разрешаем NTP-пакеты
$fwcmd add 20100 allow udp from %global.backbone to %global.backbone.broadcast 123

# Запрещаем остальной трафик
$fwcmd add 20200 deny log ip from any to any

##-----------------------------------------------------------------------------
## Мультикасты (нумерация с 25000)
##-----------------------------------------------------------------------------

# Разрешаем OSPF-пакеты
$fwcmd add 25000 allow ospf from %global.backbone to 224.0.0.0/24{5,6}

# Разрешаем общие IGMP и DVMRP-пакеты
$fwcmd add 25100 allow igmp from %global.backbone to 224.0.0.0/24{1,2,4}
$fwcmd add 25200 allow igmp from %ip.link.iskranet-gw to 224.0.0.0/24{1,2}

# Разрешаем трафик TVoIP
$fwcmd add 25300 allow ip from %ip.ext.tvoip to 224.2.153.173

# Запрещаем остальной трафик
$fwcmd add 25400 deny log ip from any to any

######################################################################
## Исходящий трафик (нумерация с 30000)
######################################################################
# Запрещаем отправку пакетов, предназначенных для внутрисетевых адресов,
# на шлюз по умолчанию
$fwcmd add 30000 deny ip from any to %global.internal $xmit_iface_inet

# Запрещаем отправку в Интернет пакетов Netbios
$fwcmd add 30100 deny tcp from any to any 135,139,445 $xmit_iface_inet

# Запрещаем отправку пакетов в Интернет для клиентов, которые отключены
# от Интернета
$fwcmd add 30200 skipto 30350 ip from %allow.internet to any $xmit_iface_inet
$fwcmd add 30300 deny ip from any to any $xmit_iface_inet

# Шейпинг ping-пакетов
$fwcmd add 30350 skipto 30400 icmp from %group.ping-shaping to any icmptypes 8 $xmit_iface_inet
$fwcmd add 30351 pipe 10 icmp from any to any icmptypes 8 $xmit_iface_inet

# Съем трафика для статистики
$fwcmd add 30400 divert 18001 ip from any to any $xmit_iface_inet

# NAT-трансляция исходящих пакетов
$fwcmd add 30800 divert 8668 ip from 192.168.0.0/16 to any $xmit_iface_inet
#$fwcmd add 30900 allow ip from %ip.nat to any $xmit_iface_inet

# Направляем пакеты в нужные интерфейсы аплинков в зависимости от их src-адреса
$fwcmd add 31000 fwd %ip.link.krastelecom-gw ip from %ip.link.krastelecom to any $xmit_iface_inet
$fwcmd add 31100 fwd %ip.link.iskranet-gw ip from %ip.link.iskranet to any $xmit_iface_inet

# Динамическое правило для доступа с данного сервера к внешним службам по UDP
$fwcmd add 31200 allow udp from me to any keep-state

##-----------------------------------------------------------------------------
## Аккаунтинг трафика (нумерация с 40000)
##-----------------------------------------------------------------------------

# Трафик Интернета
$fwcmd add 40000 skipto 40200 ip from %global.internal to %group.accounting
$fwcmd add 40100 divert 17000 ip from any to %group.accounting

######################################################################




Правила на сервере доступа:


#!/bin/sh -e

fwcmd="echo"

# Интерфейс, подключенный к клиентскому сегменту
iface_clients=fxp0

# Интерфейсы VPN
iface_vpns=ng*

######################################################################
## Разделение трафика в зависимости от направления (нумерация с 100)
######################################################################
# Трафик через интерфейс lo0
$fwcmd add 100 allow ip from any to any via lo0

# Исходящий трафик
$fwcmd add 200 skipto 30000 ip from any to any out

######################################################################
## Входящий трафик (нумерация с 500)
######################################################################
# Открываем доступ к DHCP-серверу с незарегистрированных адресов, запрещаем
# с них любой другой трафик
$fwcmd add 500 allow udp from %clients.unreg to %srv.dhcp 67
$fwcmd add 600 allow udp from %clients.unreg to 255.255.255.255 67
$fwcmd add 700 deny ip from %clients.unreg to any

##-----------------------------------------------------------------------------
## Антиспуфинг (нумерация с 1000)
##-----------------------------------------------------------------------------

# Интерфейс клиентов
$fwcmd add 1000 skipto 5000 ip from 0.0.0.0 to any recv $iface_clients
$fwcmd add 1100 skipto 5000 ip from %clients to any recv $iface_clients
$fwcmd add 1200 deny log ip from any to any recv $iface_clients

# Интерфейсы VPN
$fwcmd add 1300 skipto 5000 ip from %clients to any recv $iface_vpns
$fwcmd add 1400 skipto 5000 ip from any to any verrevpath recv $iface_vpns
$fwcmd add 1500 deny log ip from any to any recv $iface_vpns

##-----------------------------------------------------------------------------
## Разделение трафика в зависимости от получателя пакета (нумерация с 5000)
##-----------------------------------------------------------------------------

# Трафик, адресованный серверу
$fwcmd add 5000 skipto 10000 ip from any to me

# Броадкасты
$fwcmd add 5100 skipto 20000 ip from any to 255.255.255.255
$fwcmd add 5200 skipto 20000 ip from any to %global.backbone.broadcast
$fwcmd add 5300 skipto 20000 ip from any to %clients.broadcast

# Мультикасты
$fwcmd add 5400 skipto 25000 ip from any to 224.0.0.0/4

##-----------------------------------------------------------------------------
## Трафик, идущий транзитом (нумерация с 6000)
##-----------------------------------------------------------------------------

# Запрещаем трафик на закрытые адреса магистрали
$fwcmd add 6000 deny log ip from any to %global.backbone.private

# Разрешаем любой трафик, идущий c VPN-адресов клиентов, которым открыт доступ
# к услугам сети, и обратно
$fwcmd add 6100 allow ip from %access.allow to any
$fwcmd add 6200 allow ip from any to %access.allow

# Разрешаем трафик, идущий от клиентов на DNS-резолвер и обратно
$fwcmd add 6300 allow ip from any to %global.srv.resolver
$fwcmd add 6400 allow ip from %global.srv.resolver to any

# Разрешаем трафик, идущий от клиентов на веб-сервер сети и обратно
$fwcmd add 6500 allow ip from any to %global.srv.http
$fwcmd add 6600 allow ip from %global.srv.http to any

# Разрешаем эхо-запросы, идущие на локальные адреса клиентов, и эхо-ответы
# c этих адресов
$fwcmd add 6700 allow icmp from any to %clients icmptypes 8
$fwcmd add 6800 allow icmp from %clients to any icmptypes 0

# Запрещаем остальной трафик
$fwcmd add 6900 deny log ip from any to any

##-----------------------------------------------------------------------------
## Трафик, адресованный серверу (нумерация с 10000)
##-----------------------------------------------------------------------------

# Разрешаем установленные TCP-соединения
$fwcmd add 10000 allow tcp from any to any established

# Разрешаем фрагменты IP-пакетов
$fwcmd add 10100 allow ip from any to any frag

# Разрешаем пакеты, удовлетворяющие динамическим правилам
$fwcmd add 10200 check-state

# Разрешаем OSPF-пакеты
$fwcmd add 10300 allow ospf from %global.backbone to any

# Разрешаем GRE-пакеты
$fwcmd add 10400 allow gre from any to any

##-----------------------------------------------------------------------------
## Службы сервера (нумерация с 12000)
##-----------------------------------------------------------------------------

# SSH
$fwcmd add 12000 allow tcp from %srv.ssh.allow to %srv.ssh 22

# DHCP
$fwcmd add 12100 allow udp from %srv.dhcp.allow to %srv.dhcp 67

# PPTP
$fwcmd add 12200 allow tcp from %srv.pptp.allow to %srv.pptp 1723

# SNMP
$fwcmd add 12300 allow udp from %srv.snmp.allow to %srv.snmp 161,1161

##-----------------------------------------------------------------------------
## Завершающие правила для трафика, адресованного серверу (нумерация с 18000)
##-----------------------------------------------------------------------------

# Разрешаем ICMP-пакеты
$fwcmd add 18000 allow icmp from any to any

# Разрешаем работу traceroute
$fwcmd add 18100 unreach port udp from any to any 33434-33584

# Запрещаем соединения на 80 порт (samba)
$fwcmd add 18200 reset tcp from any to any 80

# Запрещаем соединения на 113 порт (ident)
$fwcmd add 18300 reset tcp from any to any 113

# Запрещаем соединения на 1080 порт (socks check)
$fwcmd add 18400 reset tcp from any to any 1080

# Запрещаем остальной трафик
$fwcmd add 18500 deny log ip from any to any

##-----------------------------------------------------------------------------
## Броадкасты (нумерация с 20000)
##-----------------------------------------------------------------------------

# Разрешаем SNMP trap'ы от ИБП
$fwcmd add 20000 allow udp from %global.backbone to any 162

# Разрешаем NTP-пакеты
$fwcmd add 20100 allow udp from %global.backbone to %global.backbone.broadcast 123

# Разрешаем поиск DHCP-сервера
$fwcmd add 20200 allow udp from %srv.dhcp.allow to any 67

# Запрещаем остальной трафик
$fwcmd add 20300 deny log ip from any to any

##-----------------------------------------------------------------------------
## Мультикасты (нумерация с 25000)
##-----------------------------------------------------------------------------

# Разрешаем OSPF-пакеты
$fwcmd add 25000 allow ospf from %global.backbone to 224.0.0.0/24{5,6}

# Разрешаем общие IGMP и DVMRP-пакеты
$fwcmd add 25100 allow igmp from %global.backbone to 224.0.0.0/24{1,2,4}
$fwcmd add 25200 allow igmp from %clients to 224.0.0.0/24{1,2}

# Разрешаем подписку на группы TVoIP
$fwcmd add 25300 allow igmp from %clients to %global.srv.tvoip.groups

# Разрешаем трафик TVoIP
$fwcmd add 25400 allow ip from %global.srv.tvoip to %global.srv.tvoip.groups

# Запрещаем остальной трафик
$fwcmd add 25500 deny log ip from any to any

######################################################################
## Исходящий трафик (нумерация с 30000)
######################################################################
# Динамическое правило для доступа с данного сервера к внешним службам по UDP
$fwcmd add 30000 allow udp from me to any keep-state

######################################################################





Правила на сервере служб:


#!/bin/sh -e

fwcmd="echo"

######################################################################
## Разделение трафика в зависимости от направления (нумерация с 100)
######################################################################
# Трафик через интерфейс lo0
$fwcmd add 100 allow ip from any to any via lo0

# Исходящий трафик
$fwcmd add 200 skipto 30000 ip from any to any out

######################################################################
## Входящий трафик (нумерация с 1000)
######################################################################
##-----------------------------------------------------------------------------
## Разделение трафика в зависимости от получателя пакета (нумерация с 5000)
##-----------------------------------------------------------------------------

# Трафик, адресованный серверу
$fwcmd add 5000 skipto 10000 ip from any to me

# Броадкасты
$fwcmd add 5100 skipto 20000 ip from any to 255.255.255.255
$fwcmd add 5150 skipto 20000 ip from any to %group.backbone_broadcast

# Мультикасты
$fwcmd add 5200 skipto 25000 ip from any to 224.0.0.0/4

##-----------------------------------------------------------------------------
## Трафик, идущий транзитом (нумерация с 6000)
##-----------------------------------------------------------------------------

# Запрещаем весь трафик
$fwcmd add 6000 deny log ip from any to any

##-----------------------------------------------------------------------------
## Трафик, адресованный серверу (нумерация с 10000)
##-----------------------------------------------------------------------------

# Преобразовываем запросы к DNS-резолверу
$fwcmd add 10000 divert 8669 ip from %allow.resolver_internet to %ip.resolver

# Разрешаем установленные TCP-соединения
$fwcmd add 10100 allow tcp from any to any established

# Разрешаем фрагменты IP-пакетов
$fwcmd add 10200 allow ip from any to any frag

# Разрешаем пакеты, удовлетворяющие динамическим правилам
$fwcmd add 10300 check-state

# Разрешаем OSPF-пакеты
$fwcmd add 10400 allow ospf from %group.backbone to any

##-----------------------------------------------------------------------------
## Службы сервера (нумерация с 12000)
##-----------------------------------------------------------------------------

# SSH
$fwcmd add 12000 deny tcp from %deny.ssh to %ip.ssh 22
$fwcmd add 12100 allow tcp from %allow.ssh to %ip.ssh 22

# DNS-резолвер
$fwcmd add 12200 deny { tcp or udp } from %deny.resolver to %ip.resolver 53
$fwcmd add 12300 allow { tcp or udp } from %allow.resolver to %ip.resolver 53

# DNS-сервер
$fwcmd add 12400 deny { tcp or udp } from %deny.dns to %ip.dns 53
$fwcmd add 12500 allow { tcp or udp } from %allow.dns to %ip.dns 53

# DNS-кэш
$fwcmd add 12600 deny { tcp or udp } from %deny.dnscache to %ip.dnscache 53
$fwcmd add 12700 allow { tcp or udp } from %allow.dnscache to %ip.dnscache 53

# NTP-сервер
$fwcmd add 12800 deny udp from %deny.ntp to %ip.ntp 123
$fwcmd add 12900 allow udp from %allow.ntp to %ip.ntp 123

# IRC
$fwcmd add 13000 deny tcp from %deny.irc to %ip.irc 6667-6669
$fwcmd add 13100 allow tcp from %allow.irc to %ip.irc 6667-6669
$fwcmd add 13200 deny icmp from any to %ip.irc icmptypes 8

# HTTP
$fwcmd add 13700 deny tcp from %deny.http to %ip.http 80,443
$fwcmd add 13800 allow tcp from %allow.http to %ip.http 80,443

# SMTP
$fwcmd add 13900 deny tcp from %deny.smtp to %ip.smtp 25
$fwcmd add 14000 allow tcp from %allow.smtp to %ip.smtp 25
$fwcmd add 14100 deny tcp from %group.internal to %ip.smtp 25
$fwcmd add 14200 allow tcp from any to %ip.smtp 25

# POP
$fwcmd add 14300 deny tcp from %deny.pop to %ip.pop 110
$fwcmd add 14400 allow tcp from %allow.pop to %ip.pop 110

# SNMP
$fwcmd add 14500 allow udp from %allow.snmp to %ip.snmp 161,1161

##-----------------------------------------------------------------------------
## Завершающие правила для трафика, адресованного серверу (нумерация с 18000)
##-----------------------------------------------------------------------------

# Разрешаем ICMP-пакеты
$fwcmd add 18000 allow icmp from any to any

# Разрешаем работу traceroute
$fwcmd add 18100 unreach port udp from any to any 33434-33584

# Запрещаем соединения на 113 порт (ident)
$fwcmd add 18200 reset tcp from any to any 113

# Запрещаем соединения на 1080 порт (socks check)
$fwcmd add 18300 reset tcp from any to any 1080

# Запрещаем остальной трафик
$fwcmd add 18400 deny log ip from any to any

##-----------------------------------------------------------------------------
## Броадкасты (нумерация с 20000)
##-----------------------------------------------------------------------------

# Разрешаем SNMP trap'ы от ИБП
$fwcmd add 20000 allow udp from %group.backbone to any 162

# Запрещаем остальной трафик
$fwcmd add 20100 deny log ip from any to any

##-----------------------------------------------------------------------------
## Мультикасты (нумерация с 25000)
##-----------------------------------------------------------------------------

# Разрешаем OSPF-пакеты
$fwcmd add 25000 allow ospf from %group.backbone to 224.0.0.0/24{5,6}

# Запрещаем остальной трафик
$fwcmd add 25100 deny log ip from any to any

######################################################################
## Исходящий трафик (нумерация с 30000)
######################################################################
# Преобразовываем ответы DNS-резолвера
$fwcmd add 30000 divert 8669 ip from %ip.dnscache to %allow.resolver_internet

# Динамическое правило для доступа с данного сервера к внешним службам по UDP
$fwcmd add 30100 allow udp from me to any keep-state

##-----------------------------------------------------------------------------
## Аккаунтинг трафика (нумерация с 40000)
##-----------------------------------------------------------------------------

# Трафик почтового сервера (POP)
$fwcmd add 40000 divert 17000 tcp from %ip.pop to %group.accounting 
 
Порядок прохождения пакетов в пакетных фильтрах FreeBSD (1)   Автор: butcher  [есть мнение]
 
Порядок прохождения пакетов при одновременном использовании  ipfilter, pf и ipfw:
При загрузке фильтров модулями, порядок будет определяться порядком загрузки модулей. 
Причина здесь в том, что пакетные фильтры регистрируют себя в pfil(9).

При включении всех фильтров в ядро порядок будет определять SYSINIT.
Чтобы определить порядок, нужно открыть файл sys/kernel.h. 
В нём определён порядок инициализации определённых подсистем. Теперь, простейшее:

# grep DECLARE_MODULE netinet/ip_fw_pfil.c
DECLARE_MODULE(ipfw, ipfwmod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY);
# grep DECLARE_MODULE contrib/pf/net/pf_ioctl.c
DECLARE_MODULE(pf, pf_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_FIRST);
# grep DECLARE_MODULE contrib/ipfilter/netinet/mlfk_ipl.c
DECLARE_MODULE(ipfilter, ipfiltermod, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY);

От сюда следует: первым будет ipfilter, затем pf, затем ipfw.
 
Автоблокирование атак по подбору паролей (brute force) в SSH под FreeBSD (1)   Автор: Roman Y. Bogdanov  [есть мнение]
 
Устанавливаем sshguard из портов:

   cd /usr/ports/security/sshguard
   make install clean WITH_PF=yes


Настраиваем перенаправление логов в sshguard

   echo "auth.info;authpriv.info |exec /usr/local/sbin/sshguard" >> /etc/syslog.conf

Правила блокировки по таблице, /etc/pf.conf

   internet="vlan50"
   table persist
   block in quick on $internet from label "ssh bruteforce"

Перечитываем измененные файлы конфигурации PF и syslogd:

   pfctl -f /etc/pf.conf
   /etc/rc.d/syslogd restart

Тестируем попробовав подобрать пароли:
   shguard[1048576]: Started successfully [(a,p,s)=(4, 420, 1200)], now ready to scan.


   sshd[1048577]: Invalid user administrador from 21.138.24.51
   sshd[1048579]: Invalid user publica from 21.138.24.51
   sshd[1048580]: Invalid user rbecerril from 21.138.24.51
   sshd[1048581]: Invalid user rvences from 21.138.24.51

   sshguard[1048582]: Blocking 21.138.24.51: 4 failures over 15 seconds.
   shguard[1048583]: Releasing 21.138.24.51 after 490 seconds.
 
Расчет размера очереди для pipe с заданной пропускной способностью (1)   Автор: [есть мнение]
 
> Работает шейпер на dummynet, наблюдается некотороая потеря
> траффика. Hавскидку проблема в дефолтных значениях размера очереди (50 пакетов)
> для pipe'ов от 32 до 512 Кбит\с. Скорее всего, поток не влезает в очередь и
> часть пакетов отбрасывается. Как правильно рассчитать размер очереди для
> каждого pipe в отдельности? 

Eugene Grosbein:

Pipe и должен отбрасывать пакеты, иначе какой же это шейпер?
Ты не можешь увеличивать длину очереди бесконечно, потому что задержки
вырастут настолько, что соединение начнет рвать сам юзер :-)

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

А если хочешь и рыбку съесть, и потерь иметь минимум, то читай-ка ты
про RED/GRED на unixfaq.ru и делай не просто pipe, а queue/pipe с gred.
Рекомендую делать w_q=0.002, max_p=0.1, min=q/10, max=3*min,
где q - длина очереди, q=20 для скоростей меньше 100Kbit/s,
q=30 для скоростей от 100 до 300Kbit/s и q=50 для скоростей 512Kbit/s и выше.

----------
Sergey A Yakovets:

Пол-дня игрался с параметром queue. В итоге подобрал на первый взгляд
кое-что подходящее. Алгоритм\мысли были следующие:

Дано: асинхронный спутниковый Инет. Входящий канал - 1024 Кбит\с.

Опытным путем установлено, что проблемы с потерей траффика (до 10% от
общего объема) возникают при многопотоковых http\ftp закачках, т.к. спутниковый
провайдер в этом случае может отдать поток на все 1024 Кбит\с. При серфинге все
нормально. Исходя из этого, мною были сделаны некоторые расчеты:

При максимальной пропускной способности входящего спутникового канала
в 1024 Кбит\с и размере пакета в 1500 байт, пропускная способность канала
равна ~ 87 пакетов\сек. В это же время, для канала в 128 Кбит\с пропускная
способность равна ~ 11 пакетов\сек. Гипотетическая разница, при условии что на
юзера будет идти поток в 1024 Кбит\с, а отдаваться только 128 Кбит\с, может
составить 76 пакетов\сек.

Итого, опытным путем установлено:


    - (было) при дефолтной очереди в 50 пакетов на pipe 128 Кбит\с потери 10%
    - при размере очереди = разница*2 = 150 пакетов потери 2%
    - (стало) при размере очереди = разница*3 = 230 пакетов потери 0%

Серфинг не страдает, задержек нет. Закачка идет на скорости шейпера, потерь нет.

Пробовал другой вариант.
Hа pipe 128 Кбит\с было выставлено gred 0.002/3/6/0.1 В итоге - огромные
потери, т.к. канал практически все время работал на скорости пакетов намного
больше чем max_th*2. Изменение параметров до gred 0.002/50/150/0.1 не влияло на
результат, т.к. дефолтный размер очереди в 50 пакетов часто переполнялся и gred
не имел никакого действия. 
---------

Что такое алгоритмы RED и gentle RED у ipfw?
http://unixfaq.ru/index.pl?req=qs&id=310

Ответ на этот вопрос скомпилирован из статей в конференции RU.UNIX.BSD от следующих авторов: 
Valentin Ermolaev, Alexander V. Naumochkin, Jen Linkova.

Сокращение RED означает "Random Early Detection". Метод используется для выравнивания всплесков трафика.

Основным критерием метода является так называемая перегрузка.

В качестве показателя перегрузки avg используется вычисляемое среднее значение длины очереди пакетов, 
принадлежащей к определенной сессии TCP. Использование усредненного,
 а не мгновенного значения очереди позволяет отделить кратковременные перегрузки, 
которые могут быть нормально обработаны устройством и сетью, от длительных перегрузок, 
которые могут утопить сеть.

Алгоритмически это выглядит так:

В момент прихода пакета
; ; if (очередь не пуста)
; ; ; ; avg = (1 - w_q)*avg + w_q*q
; ; else
; ; ; ; m = f(time - q_time)
; ; ; ; avg = (1 - w_q)^m * avg;

где

avg -средний размер очереди
q_time - "start of queue idle time"
q - размер очереди

w_q - вес очереди (фиксированный параметр)

f() - линейная функий от времени

В /usr/src/sys/netinet/ip_dummynet.c по этому поводу написано следующее:

* RED algorithm
*
* RED calculates the average queue size (avg) using a low-pass filter
* with an exponential weighted (w_q) moving average:
* avg <- (1-w_q) * avg + w_q * q_size
* where q_size is the queue length (measured in bytes or * packets).
*
* If q_size == 0, we compute the idle time for the link, and set
* avg = (1 - w_q)^(idle/s)
* where s is the time needed for transmitting a medium-sized packet.

- что полностью согласуется с приведенными выше формулами.

Далее в алгоритме вводятся два порога уровня перегрузки: min_th и max_th. 
Когда уровень перегрузки ниже первого порога min_th, то пакеты не отбрасываются. 
Если уровень перегрузки находится между двумя порогами, пакеты отбрасываются с линейно 
возврастающей вероятностью из диапазона от 0 до конфигурируемой величины max_p, 
которая достигается при достижении второго порога max_th. Выше порога max_th 
отбрасываются все пакеты.

Такой метод вычисления позволяет сглаживать всплески трафика - для сравнения в первой из статей (см. ниже) 
на одном графике приводятся и изменение размера очереди q, и усредненного размера 
очереди (avg) от времени. В той же статье есть выкладки на тему значений w_q.

При gentle RED ситуация выглядит чуть сложнее:

Если перегрузки лежит в интервале от min_th до max_th, то пакеты отбрасываются с линейно 
возрастающей от 0 до max_p вероятностью. Когда перегрузка превышает max_th, 
но не превышет 2*max_th, пакеты отбрасываются не все (как в случае RED), а с линейно возрастающей 
от max_p до 1 вероятностью. Все пакеты отбрасываются только после превышения перегрузки канала значения 2*max_th.

Вот как это сделано в ip_dummynet.c:

если длина очереди > max_th, то в случае gred вероятность 
отбрасывания пакета вычисляется как

; ; p_b = c_3 * avg - c_4
где c_3 = (1 - max_p) / max_th
; ; c_4 = 1 - 2 * max_p

В случае просто RED пакет отбрасывается.

При загрузке очереди, большей min_th, но меньшей max_th, функция
вероятности одинакова и выглядит след. образом:

; ; p_b = c_1 *avg - c_2
где c_1 = max_p / (max_th - min_th),
; ; c_2 = max_p * min_th / (max_th - min_th)

Полезные ссылки:

   1. http://www.icir.org/floyd/papers/red/red.html
   2. http://www.icir.org/floyd/red.html

   3. http://www.cisco.com/warp/public/732/Tech/red/
 
Как увеличить размер таблицы состояний активных соединений в pf (1)   Автор: [обсудить]
 
Проверяем число соединений в таблице и сравнимаем с текущим лимитом:

# pfctl -s state | wc -l
10000
# pfctl -s memory | grep states
states        hard limit    10000

Таблица переполнена, поднимает лимит до 20000:
   set limit states 20000

Перечитываем конфигурацию pf:
   pfctl -O -f /etc/pf.conf
 
Прозрачный переброс SMTP трафика к spamd, используя pf (1)   Автор: undeadly.org  [есть мнение]
 
Ниже описано как в разрыв между внешним миром и локальной сетью поставить машину на базе OpenBSD, 
на которой будет в прозрачном режиме отсеиваться спам через spamd.

fxp2 - внешний интерфейс
fxp0 - интерфейс локальной сети

Поднимаем бридж:

   ifconfig fxp0 up
   ifconfig fxp2 inet 172.16.5.111 netmask 255.255.255.0 up
   route add default 172.16.5.1
   ifconfig bridge0 create
   brconfig bridge0 add fxp0 add fxp2 up

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

    sysctl net.inet.ip.forwarding=1
    pfctl -ef /etc/pf.conf

где  /etc/pf.conf:

    ext_if="fxp2"

    table <spamd> persist
    table <spamd-white> persist


    rdr on $ext_if inet proto tcp from <spamd> to port smtp \
            -> 127.0.0.1 port spamd
    rdr on $ext_if inet proto tcp from !<spamd-white> to port smtp \
            -> 127.0.0.1 port spamd

    # "log" so you can watch the connections getting trapped
    pass in log on $ext_if route-to lo0 inet proto tcp to 127.0.0.1 port spamd
 
Как избавится от роста висящих FIN_WAIT_2 соединений под FreeBSD   Автор: [есть мнение]
 
Если используется ipfw2 и keep-state правила, то от непрерывного роста 
соединений со статусом FIN_WAIT_2 помогает:
   sysctl -w net.inet.ip.fw.dyn_keepalive=0

 
Как вести лог блокировок в iptables и ipfw   Автор: [есть мнение]
 
Linux:

- Перед правилом блокировки нужно вставить "log" правило:

   iptables -A FORWARD -p tcp -m tcp -s 192.168.0.0/16 --dport 25 \
      -j LOG --log-level debug --log-prefix "outgoing mail" 
   iptables -A FORWARD -p tcp -m tcp -s 192.168.0.0/16 --dport 25 -j DROP

- Проверить запущены ли в системе klogd и syslogd.

- Настроить /etc/syslog.conf на прием kern.debug логов:
   kern.=debug   -/var/log/kernel/info

FreeBSD:
Добавить ключ log в ipfw, например:
   ipfw add 1000 deny log tcp from any to 192.168.10.10 22 via fxp0
   ipfw add 1000 deny log logamount 0 tcp from any to 192.168.10.10 80 via fxp0

Для ведения логов ядро должно быть собрано с IPFIREWALL_VERBOSE или нужно выставить "sysctl -w net.inet.ip.fw.verbose=1".

Далее проверить чтобы в /etc/syslog.conf было упоминание LOG_SECURITY:
   security.*      /var/log/security

Через параметр logamount передается число записей которые будет записано в лог, 
после превышения записи перестанут появляться в логе, до тех пор пока не будет вызвана команда 
"ipfw resetlog". Максимальное число сообщений можно также установить 
через sysctl net.inet.ip.fw.verbose_limit. 
Для отмены лимитирования на число записей, нужно установить атрибут в 0.
 
Безопасное редактирование правил ipfw FreeBSD   Автор: 135all  [обсудить]
 
Для безопасного редактирование правил ipfw рекомендую обратить внимание на скрипт change_rules.sh, 
находящийся в /usr/share/examples/ipfw. В случае неправильных действий он вернёт старый набор правил, 
а также сообщит  администратору об изменениях в файрволе по почте.
 
В двух словах про включение NAT и Firewall в ОС FreeBSD (1)   Автор: hub.ru  [есть мнение]
 
Что бы поднять NAT и Firewall на FreeBSD надо:

Скомпилировать ядро:
Следующие строки нужно включить в /usr/src/sys/i386/conf/GENERIC файл конфигурации:

   options IPFIREWALL
   options IPDIVERT
   options IPFIREWALL_VERBOSE
   options IPFIREWALL_VERBOSE_LIMIT=10
   options DUMMYNET
   options TCP_DROP_SYNFIN

Переходим в директорию /usr/src/
   make buildkernel KERNCONF=GENERIC
   make installkernel KERNCONF=GENERIC

Следующие строки можно к примеру включить в rc.conf файл конфигурации:

   hostname="free"
   ifconfig_rl0="10.0.0.1"
   gateway_enable="YES"
   firewall_enable="YES"
   firewall_type="open"
   natd_enable="YES"
   natd_interface="rl0"
   natd_flags="-redirect_port tcp 10.0.0.10:80 80"
   tcp_extensions="NO"
   tcp_drop_synfin="YES"
   icmp_drop_redirect="YES"
   sendmail_enable="NONE"

Для удаленного управления нужно добавить следующую строку:

   sshd_enable="YES"
(возможно понадобится скопировать /etc/ssh/ssh_host_dsa_key.pub в /root/.ssh/authorized_keys

Следующие строки можно включить в rc.firewall файл конфигурации (секция "open"):

   [Oo][Pp][Ee][Nn])
   oif="rl0"
   iif="tx0"
   oip="132.5.7.172"
   iip="10.0.0.1"
   lan="10.0.0.0/24"
   setup_loopback
   # allow all for LAN
   ${fwcmd} add 500 pass all from ${lan} to ${iip} via ${iif}
   ${fwcmd} add 550 pass all from ${iip} to ${lan} via ${iif}
   # download - 60K upload - 6K for all lan ip's
   ${fwcmd} add 600 pipe 1 ip from any to any in via ${oif}
   ${fwcmd} add 650 pipe 2 ip from any to any out via ${oif}
   # for selected ip's only
   # ${fwcmd} add 601 pipe 1 all from any to 10.0.0.10
   # ${fwcmd} add 651 pipe 2 all from 10.0.0.10 to any
   ${fwcmd} pipe 1 config bw 512Kbit/s
   ${fwcmd} pipe 2 config bw 48Kbit/s
   # dns setup
   ${fwcmd} add 770 pass tcp from any to ${oip} 53 setup
   ${fwcmd} add 780 pass udp from any domain to any
   ${fwcmd} add 790 pass udp from any to any domain
   # main setup
   ${fwcmd} add 800 pass tcp from any http,https,20-21,989-990 to any
   ${fwcmd} add 810 pass tcp from any to any http,https,20-21,989-990
   ${fwcmd} add 830 pass tcp from any pop3,pop3s,smtp,imap,imaps,aol to any
   ${fwcmd} add 840 pass tcp from any to any pop3,pop3s,smtp,imap,imaps,aol
   ${fwcmd} add 65000 deny ip from any to any
   ;;
 
Где oip, oif - внешний интерфейс; iip, iif - внутренний; lan - внутренняя сеть.

Такая конфигурация ipfw весьма параноидальна, и здесь приведена только в качестве примера. 
На практике обычно нужен более открытый фаервол. 
 
pf и трансляция адресов на двух интерфейсах   Автор: DelGod  [есть мнение]
 
Решение оптимизировано для шлюза на флешке (не используется perl и другие "тяжелые" решения)

-------------------------
/usr/local/etc/rc.d/openvpn.sh
-------------------------

#!/bin/sh

. /etc/rc.subr

name=openvpn
rcvar=`set_rcvar`

prefix="/usr/local"

openvpn_precmd()
{
        for i in $openvpn_if ; do
                # FreeBSD <= 5.4 does not know kldstat's -m option
                # FreeBSD >= 6.0 does not add debug.* sysctl information
                # in the default build - we check both to keep things simple
                if ! sysctl debug.if_${i}_debug >/dev/null 2>&1 \
                        && ! kldstat -m if_${i} >/dev/null 2>&1 ; then
                        if ! kldload if_${i} ; then
                                warn "Could not load $i module."
                                return 1
                        fi
                fi
        done
        return 0

}

start_postcmd()
{
        `/bin/cat /var/db/ukr_nets| /usr/bin/awk '{ if ($1) {system("route add "$1" 193.201.61.65 >/dev/null")} }'`
        /bin/sleep 10 && pfctl -F all -f /etc/pf.conf_openvpn
}

stop_postcmd()
{
        `/bin/cat /var/db/ukr_nets| /usr/bin/awk '{ if ($1) {system("route delete "$1" 193.201.61.65 >/dev/null")} }'`
        pfctl -F all -f /etc/pf.conf
        rm -f "$pidfile" || warn "Could not remove $pidfile."
}

extra_commands="reload"
pidfile="/var/run/${name}.pid"
command="/usr/local/sbin/${name}"
start_precmd="openvpn_precmd"
start_postcmd="start_postcmd"
stop_postcmd="stop_postcmd"

load_rc_config ${name}
: ${openvpn_enable="NO"}
: ${openvpn_flags=""}
: ${openvpn_if=""}
: ${openvpn_configfile="${prefix}/etc/openvpn/openvpn.conf"}
: ${openvpn_dir="${prefix}/etc/openvpn"}
required_files="${openvpn_configfile}"
command_args="--cd ${openvpn_dir} --daemon --config ${openvpn_configfile} --writepid ${pidfile}"
run_rc_command "$1"

-------------------------
/etc/pf.conf
-------------------------

ext_if_t="rl0"
int_if="rl1"
table <users> persist { 192.168.1.0/24 }
nat on $ext_if_t inet from <users> to any  -> $ext_if_t
pass on $ext_if_t all
pass on $int_if all

-------------------------
/etc/pf.conf_openvpn
-------------------------

ext_if_o="tap0"
ext_if_t="rl0"
int_if="rl1"
table <users> persist { 192.168.1.0/24 }
table <ukr> persist file "/var/db/ukr_nets"
nat on $ext_if_t inet from <users> to <ukr>  -> $ext_if_t
nat on $ext_if_o inet from <users> to !<ukr> -> $ext_if_o
pass on $ext_if_o all
pass on $ext_if_t all
pass on $int_if all

-------------------------
cron:
-------------------------

0 0 * * * /usr/bin/fetch -q -o "/var/db/ukr_nets" 'http://www.colocall.net/ua/?list'

 
FreeBSD 5.3 ipfw правило по умолчанию   Автор: else  [есть мнение]
 
В прежних версиях FreeBSD изменить правило по умолчанию 
   65535  deny ip from any to any на 
   allow ip from any to any 
можно было включением в ядро опции
   IPFIREWALL_DEFAULT_TO_ACCEPT.

В версии 5.3 это не работает. Даже собрав ядро с этой опцией, получаем правило по умолчанию 
   deny ip from any to any. 

Если сборка производится удаленно - сюрприз может оказаться довольно неприятным.
 
Проброс портов с двух различных gateway на внутренний сервер через IPNAT   Автор: Жека  [есть мнение]
 
Иногда необходимо пробросить порты с двух различных gateway GW1 и GW2 на один внутренний сервер, 
у которого в качестве default GW указан GW1.
Прямой проброс и NAT невозможен, т.к. пакеты пришедшие из GW2 попытаются вернуться по маршруту через GW1.
Есть следующий выход, это двойной NAT на GW2, при котором запрос приходит не снаружи, а с внутреннего IP.

ed0 - внешний интерфейс
lnc0 - интерфейс смотрящий внутрь.

в ipnat.rules нужно прописать следующее:
   map ed0 10.6.10.0/24 -> 0.0.0.0/32 мапим локалку наружу
   map lnc0 0.0.0.0/0 -> 0.0.0.0/32 ремап внешних ip в локальные
   rdr ed0 0.0.0.0/0 port 80 -> 10.6.10.2 port 80 tcp форвард на внутренний сервер

 
Как с помощью ipfw отрезать баннеры в ICQ   Автор: orm_vartis  [есть мнение]
 
Мысль простая:
Аська сообщениями по 5190 и другим портам обменивается, а баннеры только с определенных 
IP  с 80го порта качает по HTTP ... Когда я на это наткнулся, написал скрипт такого содержания:

#!/bin/sh
# add this rule to your firewall and :
# ipfw deny tcp from 192.168.0.0/16 to table(1) out via rl0 setup dst-port 80

NETS=" 64.12.164 64.12.174 152.163.208 205.188.165 205.188.248 205.188.250 "
IPS=" 25 57 121 153 185 245 "
fwcmd=" ipfw "
tablenum=" 1 "

#Flushing table
${fwcmd} table ${tablenum} flush

#Add tables ips
for D1 in ${NETS}
  do     
  for D2 in ${IPS}
    do
    ${fwcmd} table ${tablenum} add ${D1}.${D2}
    done
  done


И в firewall воткнул правило вида
   ipfw deny tcp from any to table\(1\) out via rl0 setup dst-port 80

Где  rl0 - внешний интерфейс.

Правильнее, конечно настроить squid и резать банеры на нем - но так проще и быстрее. К тому же заметно меньше грузит машину.
 
Как разделить канал между пользователями используя ipfw. (1)   Автор: mgear  [обсудить]
 
   /sbin/ipfw pipe 1 config bw 7000Kbit/s
   /sbin/ipfw queue 1 config pipe 1 weight 75 mask dst-ip 0x00000000
   /sbin/ipfw queue 2 config pipe 1 weight 50 mask dst-ip 0x00000000
   /sbin/ipfw queue 3 config pipe 1 weight 50 mask dst-ip 0x00000000
   /sbin/ipfw queue 4 config pipe 1 weight 50 mask dst-ip 0x00000000
   /sbin/ipfw add queue 1 ip from any to 192.168.0.0/24
   /sbin/ipfw add queue 2 ip from any to 192.168.1.0/24
   /sbin/ipfw add queue 3 ip from any to 192.168.2.0/24
   /sbin/ipfw add queue 4 ip from any to 192.168.3.0/24


Итого имеем: одну толстую трубу на 7К и 4 очереди в нее. 
У первой приоритет 75% канала. У остальных - по 50% 
 
Установка IPFW2 на FreeBSD   Автор: Tigran Parsadanian  [есть мнение]
 
Собираем библиотеки и сам IPFW:
   cd /usr/src/lib/libalias
   make -DIPFW2 && make install
   cd /usr/src/sbin/ipfw
   make -DIPFW2 && make install
Пересобираем ядро с "options IPFW2" и опциями по вкусу:
options         IPFIREWALL              #firewall
options         IPFIREWALL_VERBOSE      #enable logging to syslogd(8)
options         IPFIREWALL_FORWARD      #enable transparent proxy support
options         IPFIREWALL_VERBOSE_LIMIT=100    #limit verbosity
options         IPFIREWALL_DEFAULT_TO_ACCEPT    #allow everything by default
options         DUMMYNET
options         IPFW2
Делаем reboot и проверяем например командой "ipfw show"
 
Как в FreeBSD перебросить соединение через NAT во внутреннюю сеть  (1)   Автор: spanka  [есть мнение]
 
 Вот реализация для ipfw:
if1IP="ип_смотрящий_в_инет", if1="интерфейс_смотрящий_в_инет"
ifLIP="ип_на_который хотим делать редирект"
  ipfw add divert natd tcp from any to ${if1IP} 80 via ${if1}
  ipfw add divert natd ip from any to ${ifLIP} to any via ${if1}
  ipfw add allow tcp from any to ${if1IP} 80 via any
  natd -n ${if1} -redirect_port tcp ${ifLIP}:80 80

Решение от miaso <torov@wipline.ru>:

  tproxy -s 80 -r nobody -l /var/log/transparent_proxy.log [int_ip] 80 
 
Как разрешить или запретить выполнение следующих ipfw правил после встречи dummynet pipe   Автор: [есть мнение]
 
Завершить выполнение цепочки ipfw правил после попадания в pipe:
   sysctl -w net.inet.ip.fw.one_pass=1                                             
Продолжить выполнение следующих ipfw правил после попадания в pipe:
   sysctl -w net.inet.ip.fw.one_pass=0
 
Как правильно зафильтровать ICMP через FreeBSD ipfw (1)   Автор: Nikola_SPb  [обсудить]
 
Расшифровка кодов ICMP сообщений:
echo reply (0), destination unreachable (3), source quench (4), redirect (5), echo request (8), router adver-tisement (9), 
router solicitation(10), time-to-live exceeded (11), IP header bad (12), timestamp request (13), timestamp reply (14), 
information request (15), information reply (16), address mask request (17) and address mask reply (18).
${fwcmd} add 00300 allow icmp from any to внешний_IP in via внешний_интерфейс icmptype 0,3,4,11,12
${fwcmd} add 00301 allow icmp from внешний_IP to any out via внешний_интерфейс icmptype 3,8,12
${fwcmd} add 00304 allow icmp from внешний_IP to any out via внешний_интерфейс frag
${fwcmd} add 00305 deny log icmp from any to any in via внешний_интерфейс
 
Как организовать редирект порта на внутреннюю машину через ipnat в FreeBSD.   Автор: [есть мнение]
 
man 5 ipnat  в /etc/ipnat.conf:
  rdr fxp0 205.15.63.3/32 port 80 -> 192.168.1.1 port 80 tcp
# Базансировка нагрузки между 2 IP:
  rdr le0 203.1.2.3/32 port 80 -> 203.1.2.3,203.1.2.4 port 80 tcp round-robin

 
Как у ipfilter обнулить статистику без перезагрузки ?   Автор: [обсудить]
 
  ipf -z -f my_ipfilter_rules_file

 
Как в ipfw если выполнилось условие, пропустить следующие N правил.   Автор: [обсудить]
 
ipfw add 50 skipto 100 tcp from any to 1.2.3.4
ipfw add 60 .....
ipfw add 100 .....

 
Пример ограничения полосы пропускания трафика в FreeBSD   Автор: [есть мнение]
 
Собираем ядро с опциями:

   options         DUMMYNET
   options         IPFIREWALL
Ограничиваем трафик для сеток 1.1.1.0/24 и 3.3.3.0/24 на 14000 кбит/с:
   ipfw add pipe 50 tcp from any to 1.1.1.0/24 via fxp0
   ipfw add pipe 50 tcp from any to 3.3.3.0/24 via fxp0
   ipfw pipe 50 config bw 14Kbit/s
Для внесения задержки на N ms, используйте delay N после config.
Для установки веса данного пайпа по отношению к другим пайпам используйте weight вес.
Для WF2Q ограничения трафика используйте ipfw queue
(queue N config [pipe pipe_nr] [weight weight] [queue {slots | size})
PS (комментарий от gara@mail.ru):
 Если возникает необходимость организовать "канал" для каждого пользователя из данной сети то пишем:
ipfw pipe 10 config mask dst-ip 0x000000ff bw 1024bit/s  queue
ipfw add pipe 10 tcp from any to 1.1.1.0/24 via fxp0
Теперь каждый хост из сети 1.1.1.0/24 имеет свой канал 1024bit/s
 
Можно ли отфильтровывать пакеты (вести лог) в зависимости от UID пользователя ?   Автор: [обсудить]
 
Для FreeBSD:
ipfw add count tcp from any to not 192.168.1.0/24 uid 231
uid user (или gid group) - под правило попадают все TCP или UDP пакеты посланный 
или принятые пользователем user (группой group).
В Linux в ядрах 2.4.x в iptables можно использовать модуль owner.
 
Как запретить открывать более 30 соединений с одного IP   Автор: [есть мнение]
 
Запретим более 30 коннектов для 80 порта сервера 1.2.3.4.
    ipfw add allow tcp from any to 1.2.3.4 80 limit src-addr 30
    ipfw add allow tcp from any to 1.2.3.4 80 via fxp0 setup limit src-addr 10
Вместо src-addr можно использовать src-port, dst-addr, dst-port
Конструкция работает в последних версиях FreeBSD 4.x ветки.
 
Как обеспечить работу active FTP режима в FreeBSD NAT   Автор: [обсудить]
 
В ipnat воспользуйтесь модулем ftp proxy:
  map fxp0 0/0 -> 0/32 proxy port ftp ftp/tcp
  map rl0 172.16.33.0/24 -> 212.46.231.50/32 proxy port ftp ftp/tcp
не забудьте поместить правило трансляции ftp перед общим правилом трансляции, 
порядок следования правил важен.
 
Как запустить трансляцию адресов (NAT) под FreeBSD   Автор: [есть мнение]
 
В /etc/rc.conf: 
  ipnat_enable="YES"


В /etc/ipnat.rules: 
Трансляция адресов (NAT):

  map ppp0 172.16.1.0/24 -> 194.46.124.53/32

где, ppp0 - внешний интерфейс, 
172.16.1.0/24 - внутренние IP, 
194.46.124.53 - реальный IP внешнего интерфейса.

Переброс порта во внутреннюю сеть:

   rdr ed0 294.16.9.6/32 port 8080 -> 192.168.0.7 port 8080 tcp

где, ed0 - внешний интерфейс, 
294.16.9.6 - реальный IP внешнего интерфейса, на который нужно обращаться из вне.
192.168.0.7 - внутренний IP на который делается переброс.
8080  - номер перебрасываемого порта.


Перечитать: ipnat -CF -f /etc/ipnat.rules
 
Как организовать Policy Routing на FreeBSD   Автор: [есть мнение]
 
ipfw add 100 fwd 10.0.0.2 ip from 10.0.2.0/24 to any 

Если нужно использовать 2 шлюза, то можно воспользоваться:
  ipfw add  fwd $ext_gw_ip ip from $ext_net to any out xmit $ext_int
 
Автоматическая нумерация правил ipfw в FreeBSD (1)   Автор: Дмитрий Новиков  [есть мнение]
 
Для автоматической нумерации правил ipfw мы применяем следующий             
 несложный прием:
C=300 # начальное значение
STEP=100 # Шаг увеличения
ipfw add $C $(C=$(($C+$STEP))) allow ip from 10.128.0.0/16 to 10.128.0.0/16
ipfw add $C $(C=$(($C+$STEP))) allow ip from 195.131.31.0/24 to 195.131.31.0/24
 

   Проблемы работы сети

Управление дуплексным режимом и скоростью линка в различных ОС. (1)   Автор: [есть мнение]
 
Solaris

   Проверка:
      ndd /dev/hme link_mode
      0 = half duplex, 1 = full duplex
   Установка full duplex:
      ndd -sec /dev/hme adv_100fdx_cap
      ndd -set /dev/hme adv_autoneg_cap 0 
   Установка half duplex:
      ndd -sec /dev/hme adv_100hdx_cap
      ndd -set /dev/hme adv_autoneg_cap 0 

Linux
   Текущее состояние
      mii-tool eth0
      ethtool eth0
   Установка full duplex:
      mii-tool -F 100baseTx-FD eth0
      ethtool -s eth0 speed 1000 duplex full autoneg off
   некоторые драйверы можно настроить через /etc/modules.conf
      options eepro100 options=48
      options 3c59x  options=0x204 full_duplex=0x200

FreeBSD

   Установка full duplex:
      ifconfig xl0 media 100baseTX mediaopt full-duplex
   Установка half duplex:
      ifconfig xl0 media 100baseTX mediaopt half-duplex

IBM AIX

   Список адаптеров и проверка режима:
      lsdev -HCc adapter
      lsattr -d ent# 
   Установка full duplex:
     chdev  -l ent# -a media_speed=100_Full_Duplex -P
   Установка half duplex:
     chdev  -l ent# -a media_speed=100_Half_Duplex -P


HP-UX
   Список адаптеров и проверка режима:
      lanscan -n  (HP-UX 10.x)
      lanscan -p  (HP-UX 11.x)
      lanadmin -x NMid# (HP-UX 10.x)
      lanadmin -x PPA#  (HP-UX 11.x)
  Установка full duplex:
      lanadmin -X 100FD NMid# (HP-UX 10.x)
      lanadmin -X 100FD PPA#  (HP-UX 11.x)
 Установка half duplex:
      lanadmin -X 100HD NMid# (HP-UX 10.x)
      lanadmin -X 100HD PPA#  (HP-UX 11.x)
 
Как увеличить размер таблицы контроля сессий ip_conntrack в Linux   Автор: [есть мнение]
 
Если ядро ругается "kernel: ip_conntrack: table full, dropping packet.", причину флуда 
(скорее всего вирус или сканирование портов) можно найти по списку /proc/net/ip_conntrack
Если просто общая загрузка большая, увеличить размер таблицы можно через /proc/sys/net/ipv4/ip_conntrack_max

Также можно увеличить размерность хэша через параметр  hashsize модуля ip_conntrack:
/etc/modules.conf:
   options ip_conntrack hashsize=N

Более тонкий тюнинг можно произвести через переменные определенные в /proc/sys/net/ipv4/netfilter
 
Примеры использования ngrep для выборки и просмотра содержимого пакетов (1)   Автор: Mayank Sharma  [обсудить]
 
ngrep служит для отображения проходящих сетевых пакетов удовлетворяющих заданной маске.
Как мне кажется ngrep гораздо проще и удобнее, чем tcpdump. Вот несколько примеров:

Показать содержимое всех пакетов, прошедших по 80 порту, со словом google 
   ngrep google port 80 


Вывод пакетов удовлетворяющих маске по одному в строке, для интерфейса eth0:
   ngrep -i \'game*|chat|recipe\' -W byline -d eth0

Слушать весь SMTP трафик на всех сетевых интерфейсах:
   ngrep -i \'rcpt to|mail from\' -d any tcp port smtp

Показать текущее время для каждого совпадения (кто и когда заходит на машину телнетом):
   ngrep -q -t -wi "login" port 23
 
Почему в FreeBSD 5.3 не работает форвадинг пакетов (ipfw fwd) (1)   Автор: Bushi  [есть мнение]
 
Это ошибка в FreeBSD 5.3, патч здесь:

http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/71910
 
Как сгенерировать IPv6 пакет для отладки сети. (1)   Автор: [обсудить]
 
# netwox 142 --device "Eth0" --eth-dst "0:8:9:a:b:c" --ip6-src "fec0:0:0:1::1" 
     --ip6-dst "fec0:0:0:1::2" --tcp-src "1234" --tcp-dst "80" --tcp-syn
# netwox 142 --device "Eth0" --eth-src "00:11:22:33:44:55" --eth-dst "0:8:9:a:b:c" 
     --ip6-src "fec0:0:0:1::1" --ip6-dst "fec0:0:0:1::2" --tcp-src "1235" --tcp-dst "80" --tcp-syn

142 - код операции "Spoof EthernetIp6Tcp", netwox - http://laurentconstantin.by.ru/ru/
 
Почему при использовании туннеля возникают проблемы с некоторыми хостами. (1)   Автор: [есть мнение]
 
Выход - поставить на интерфейсе туннеля MTU 1500, вместо 1476.
Проблема возникает при попытке протолкнуть пакет размером 1500 байт 
с выставленным DF (don't fragment запрещена фрагментация) битом через интерфейс 1476 байт. 
Другие решения:
interface ethernet0 

 ip policy route-map clear-df 
route-map clear-df permit 10 
 match ip address 101 
 set ip df 0 
access-list 101 permit tcp 10.1.3.0 0.0.0.255 any 

или
interface tunnel0 
 ip tcp adjust-mss 1436
 
В чем может быть причина неработы ассиметричного рутинга под Linux. (1)   Автор: [обсудить]
 
Linux отказывается маршрутизировать пакеты между двумя сетевыми 
картами, кода пакет входит через один интерфейс и выходит через другой, если включен rp_filter (RFC1812).

Необходимо отключить rp_filter:
   /sbin/sysctl -w net.ipv4.conf.default.rp_filter = 0
   /sbin/sysctl -w net.ipv4.conf.all.rp_filter = 0

Для FreeBSD можно посоветовать:
   в /etc/rc.conf: tcp_extensions="NO"
   или sysctl -w net.inet.tcp.rfc1323=0
   А так же sysctl -w net.inet.tcp.rfc1644=1 и sysctl -w net.inet.tcp.rfc1323=0
 
С чем может быть связаны потери пакетов и нестабильная работа ethernet карт ? (1)   Автор: [есть мнение]
 
Приходилось сталкиваться с проблемами согласования режимов работы карт Intel EtherExpress 100 и 
Reltek  RTL-8139 c коммутаторами и концентраторами различных производителей. Несогласование 
проявляется, например в работе карты в режиме half-duplex, а свича в full-duplex и т.д. (в linux: /sbin/mii-tool -F 100baseTx-FD eth0)

 
Почему выкачиваются данные с машины нормально, как только пытаюсь что-то закачать - соединение останавливается, даже через ssh больше 5 мин. не удается поработать. Другие машины работают нормально.   Автор: [есть мнение]
 
Неоднократно замечена проблема работы сетевых карт на базе RealTek 8129/8139 (машины под FreeBSD, 
но с другими ОС тоже проявляется) с некоторыми концентраторами и коммутаторами. 
Проявляется в замирании  сессий до истечения таймаута. 
Диагностика: ping -s N remote_ip, при больших N не проходят.
Решение: Смените сетевую карту, например, на Intel EtherExpress Pro.

 
Почему лог почтового сервера изобилует сообщениями о разрыве по Timeout, часто, при приеме большого объема данных, прокачка останавливается и замирает до истечения таймаута ?   Автор: [есть мнение]
 
Вероятные причины: Туннель, блокировка ICMP, "path MTU discovery" и ECN (Explicit Congestion Notification, 
ECN проявляется в основном при доступе через Proxy).
При блокировке ICMP трафика, возможно блокируется не только echo_replay/echo_request ICMP сообщения, 
но и другие важные сообщения
передаваемые по ICMP. При блокировке ICMP сообщений типа 3.4 (fragmentation needed and DF set) возможно 
нарушение нормальной фрагментации пакетов, что вполне может проявляться как внезапная остановка передачи 
данных большого объема и разрыв сесcии по таймауту, например, если на пути трафика встречается туннель.
Одним из путей решением проблемы, является установка на туннеле MTU > 1500 и отмена блокировки ICMP трафика.
Проблемы с ECN в Linux лечатся: 

    echo 0 >/proc/sys/net/ipv4/tcp_ecn 
path MTU discovery:
    Linux: echo 1 > /proc/sys/net/ipv4/ip_no_pmtu_disc
    FreeBSD: sysctl -w net.inet.tcp.rfc1323=0
 

   Туннелинг, VPN, VLAN

Туннели с использованием SSH. Режим эмуляции Socks proxy в SSH (1) (2)   Автор: Vladimir Brednikov  [есть мнение]
 
1. Режим эмуляции Socks proxy в SSH

Допустим, у нас есть рабочая станция в локальной сети за firewall'ом;
также имеется ssh-доступ на сервер в Интернете. Кроме ssh, никакой связи с внешним миром не имеется, 
а очень хочется, например, подключиться к какому-нибудь jabber-серверу.

На рабочей станции запускаем простую команду:

   ssh -D 5555 user@remotehost -f -N

, где -D 5555 - эмуляция SOCKS сервера через порт 5555 
-f  - работа в фоне, после аутентификации
-N - не запускать shell на удаленном хосте.

Теперь, указав в настройках XMPP-клиента (например, Pidgin'а) в качестве SOCKS5 прокси localhost:5555, 
получим желаемый результат: Pidgin соединяется с сервером через внешний сервер.


2. Туннель ssh

Дано: сервер локальной сети ourproxy.provider.ru, доступный извне.

Требуется: получить из дома доступ к ресурсам внутри локальной сети, например, к интранет-серверу 10.10.5.1:80

Решение: выполнить на домашней машине команду, пробрасывающую туннель к искомому IP-адресу через ourproxy.provider.ru:

    ssh -f -N user@ourproxy.provider.ru -L 8080:10.10.5.1:80


Опция -f говорит ssh, что после соединения нужно уйти в background.
Опция -N указывает, что никаких команд выполнять не нужно
Ключ -L означает, что соединения к localhost на порт 8080 нужно перенаправлять на 80 порт IP-адреса 10.10.5.1

Таким образом, набирая в браузере адрес http://localhost:8080, попадаем на нужный сервер.


3. Обратный туннель ssh


Дано: компьютер на работе, находящийся за firewall'ом и nat'ом; компьютер дома с доступом в интернет; 
сервер ourproxy.provider.ru с работающим sshd, доступный обоим компьютерам. 
Но в данном случае прямой доступ с ourproxy.provider.ru к рабочей машине отсутствует.

Требуется: получить из дома доступ к сервису sshd на рабочем компьютере.

Решение: на рабочей машине выполнить команду:

    ssh -f -N user@ourproxy.provider.ru -R 12345:localhost:22

Опции -f и -N описаны несколькими строчками выше.
Ключ -R означает, что подключения к порту 12345 на ourproxy.provider.ru будут перенаправляться на 22 порт рабочего компьютера.

После выполнения этой команды с рабочей машины можно будет попасть на эту машину с ourproxy.provider.ru, 
выполнив команду:

    ssh -p 12345 user@locahost

По этому же принципу можно получить доступ к прочим ресурсам локальной сети. Вот еще один пример.

На рабочей машине:

    ssh -f -N user@ourproxy.provider.ru -R 8080:10.10.5.1:80

На домашней машине:

    ssh -f -N user@ourproxy.provider.ru -L localhost:8080:localhost:8080


Теперь, набрав в адресной строке браузера на домашнем компьютере http://localhost:8080, 
получаем доступ к интранет-серверу за семью замками двумя firewall-ами.

Конечно же, это приводит к серьёзной бреши в корпоративной безопасности, 
поэтому крайне не рекомендуется злоупотреблять этим советом.
 
OpenVPN с TAP в OpenBSD   Автор: Вадим Жуков  [обсудить]
 
OpenBSD не имеет устройства tap(4), которое по своей сути является простым туннелем 2-го уровня OSI. 
Вместо этого необходимо использовать tun(4), причём для последнего нужно перед запуском openvpn установить link0. 
Также, при использовании --pool следует учесть, что openvpn передаёт различные параметры настройки 
для TAP- и tun-соединений, из-за чего необходимо отказываться от предлагаемого выполнения ifconfig 
самим OpenVPN и вместо этого юзать свой скрипт, в который в простейшем случаю жёстко прописываются 
адрес удалённого конца туннеля и broadcast-адрес. В итоге получается примерно такой набор команд:

$ sudo cat /etc/hostname.tun1

   up link0
   !openvpn --config /etc/openvpn/mytunnel --verb 0 & sleep 5
   $ sudo cat /etc/openvpn/mytunnel.conf
   dev tun1
   dev-type tap
   pull
   ifconfig-noexec
   up "/etc/openvpn/mytunnel.up"
   auth-user-pass "/etc/openvpn/mytunnel.pwd"

$ cat /etc/openvpn/mytunnel.up

   #!/bin/sh
   TUN_DEV="$1"; shift
   TUN_MTU="$1"; shift
   LINK_MTU="$1"; shift
   LOCAL_IP="$1"; shift
   NETMASK="$1"; shift
   MODE="$1"; shift
   ifconfig $TUN_DEV $LOCAL_IP 10.1.2.1 netmask $NETMASK broadcast 10.1.2.255 mtu $TUN_MTU

Учтите, что для того, чтобы auth-user-pass позволял указывать файл для чтения паролей, 
необходимо собирать OpenVPN с опцией "--enable-password-save", которая в текущей версии 
порта (openvpn-2.1_rc7) не используется. Для исправления этой проблемы лучше всего подправить 
/usr/ports/net/openvpn/Makefile, добавив "--enable-password-save" в CONFIGURE_ARGS.  
Разумеется, в этом нет необходимости, если не требуется обеспечить полностью автоматический запуск OpenVPN.
 
Прозрачный переброс VPN соединения на другой сервер (1)   Автор: AxeleRaT  [есть мнение]
 
Была задача, сделать прозрачный переброс пользователей с одного VPN (PPTPD) сервера 
на другой (PPTPD), с условием, что пользователям ничего менять в настройках  VPN соединения не приедеться. 

В итоге на несколько разных VPN серверов (Fedora 3,4,6, APSlinux 11) был установлен 
прозрачный редирект туннеля на центральные сервер, с единой базой данных о клиентах.

Использованное ПО:

   pptpproxy-2.9.tar.bz2

Пример запуска:

   #./pptpproxy -p 111.111.111.111:1723,222.222.222.222:1723 -a 10.0.0.0/255.0.0.0  -l /var/log/pptp_redirect

Параметр -p
   111.111.111.111:1723  какой интерфейс:порт слушать
   222.222.222.222:1723  на какой адрес:порт перенаправлять

Параметр -a
   10.0.0.0/255.0.0.0  acl на соединение с определенное сети


Параметр -l
   /var/log/pptp_redirect  куда писать лог

Таким образом избежали множества проблем с клиентами.
В первую очередь данное ПО, как следует из названия, предназначено для  проброса VPN туннелей через NAT.

Использованные ОС:
   APSLinux 11
   CentOS 5
   Fedora
 
Как пробросить TCP порт средствами xinted (1)   Автор: Евгений  [есть мнение]
 
Пробросить TCP порт 1604 с 192.168.25.22 на машину  172.16.1.2 во внутренней сети.

/etc/xinetd.conf

    service ica
    {
        disable = no
        port = 1604
        bind = 192.168.25.22
        socket_type = stream
        user = root
        redirect = 172.16.1.2 1604
        type = UNLISTED
        wait = no
    }

redirect работает только для TCP.
 
Остановка netgraph нод после mpd (1)   Автор: Roman Y. Bogdanov  [есть мнение]
 
С помощью этого маленького скрипта, можно выполнить освобождение netgraph нод, 
которые оставляет за собой упавший в "корку" MPD3.

#!/bin/sh

for j in "" 1 2 3 4 5 6 7 8 9 10 11 12; do
  for i in 0 1 2 3 4 5 6 7 8 9; do
    echo $j$i
    ngctl shutdown ng$j$i:
    ngctl shutdown mpd$1-pptp$j$i:
  done
done
 
Как "протянуть" 802.1q tagged порт через ip-сеть.   Автор: Roman Timofeev aka ^rage^  [есть мнение]
 
Дано: 

Есть hostA, который воткнут в каталист, в trunk (т.е. тегированный) порт, инкапсуляция 802.1q. 

Есть hostB, который маршрут до hostA. маршрут живой, ip-пакеты между хостами безпроблемно бегают. 

Задача: надо с hostA "притащить" виланы на hostB. 

Решение: vtund + bridge.

описание клиента в vtund.conf

   homepeer { 
      passwd qwerty; 
      type ether; 
      device home; 
      proto tcp; 
      compress yes; 
      stat yes;
      persist yes; 

      up { 
         ifconfig "%% up"; 
         program "brctl addbr br0"; 
         program "brctl addif br0 %%"; 
         program "brctl addif br0 eth0"; 
         ifconfig "br0 up"; 
      }; 

      down { 
         ifconfig "%% down"; 
         ifconfig "br0 down"; 
         program "brctl delbr br0"; 
      }; 
   }

описание пира из конфига сервера


   homepeer { 
      passwd qwerty; # Password 
      type ether; # Ethernet tunnel 
      device work; # Device tap1 
      proto tcp; 
      compress yes; 

      up { 
         ifconfig "%% up"; 
      }; 
      down { 
         ifconfig "%% down"; 
      }; 
   } 

Теперь на той Linux машине, куда кидаем порт:

   vconfig set_name_type VLAN_PLUS_VID_NO_PAD
   vconfig add work 4
   ifconfig vlan4 10.1.1.1 netmask 255.255.255.0 up
   vconfig add vlan4 8
   ifconfig vlan8 192.168.1.1 netmask 255.255.255.0 up

Замечание:
Клиент - хост, с которого мы тащим порт. Он живёт в серой сети и имеет выход в internet через NAT.
Сервер - машина с публичным ip.
 
Q-in-Q (VLAN stacking) в Linux   Автор: ^rage^  [есть мнение]
 
Q-in-Q  - проброс VLAN внутри  другого VLAN.

host1:

   vconfig set_name_type VLAN_PLUS_VID_NO_PAD
   vconfig add eth0 4
   ifconfig vlan4 10.1.1.1 netmask 255.255.255.0 up
   vconfig add vlan4 8
   ifconfig vlan8 192.168.1.1 netmask 255.255.255.0 up

host2:


   vconfig set_name_type VLAN_PLUS_VID_NO_PAD
   vconfig add eth0 4
   ifconfig vlan4 10.1.1.2 netmask 255.255.255.0 up
   vconfig add vlan4 8
   ifconfig vlan8 192.168.1.2 netmask 255.255.255.0 up

ragahost ~ # ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.820 ms

ragahost ~ # tcpdump -e -i eth0
22:40:47.297489 00:0e:0c:9b:fa:ce (oui Unknown) > 00:13:d4:8b:c8:b6 (oui Unknown), 
ethertype 802.1Q (0x8100), length 106: vlan 4, p 0, ethertype 802.1Q, vlan 8, p 0, 
ethertype IPv4, 192.168.1.2 > 192.168.1.1: ICMP echo request, id 64531, seq 146, length 64
 
Интеграция VPN на базе mpd в Active Directory.   Автор: spherix  [есть мнение]
 
Было дано:
 - Домен на Windows2003 с поднятым Kerberos.
 - FreeBSD на шлюзе, куда должны были подключаться пользователи.
 - VPN-демон mpd.

Задача: заставить mpd брать пароли из домена.

Решение:

 - Ставим третью самбу с поддержкой кербероса.
 - Настраиваем керберос
 - Подсоединяем самбу в домен.
 - Оставляем от нее только winbindd 
 - Ставим freeradius.
 - Сцепляем радиус с самбой.
 - Скручиваем mpd с радиусом и настраиваем сам mpd.


Итог: управляем учетными записями VPN-пользователей через обычные средства AD, 
а не пишем руками данные в файл. 

Примечание1. Документация гласит, что можно связать радиус с керберосом. 
То есть теоретически можно отказаться от самбы. Я так не делал, 
поскольку подцепить через самбу мне лично было проще.

Примечание2. Если использовать poptop, то можно не использовать 
радиус, а использовать ntlm_auth из самбы. Тоже вариант.


Файлы конфигурации: http://www.opennet.ru/base/net/mpd_win2003.txt.html
 
Настройка PPTP Client под управлением OpenBSD (1)   Автор: dreamcatcher.ru  [есть мнение]
 
Автор: Алексей Гнедин
Редактор: Олег Сафулин

Используемое ПО: pptp-1.6.0.tgz , OpenBSD 3.8 (GENERIC)

Особенности данного подключения состоят в том ,что VPN сервер разрешает подключатся 
только с авторизацией MSChapV2, и явно включённым шифрованием MPPE 128 STATELESS.


      cd /etc/ppp
      vi /etc/ppp/ppp.conf 

Добавляем следующие строки:

      default:
       set log Phase Chat LCP IPCP CCP tun command
      pptp1:
       set device "!/usr/local/sbin/pptp  IPADDR_VPN_SERVER --nolaunchpppd"
       set log Phase LCP IPCP CCP tun command
       disable acfcomp protocomp
       deny acfcomp
       enable lqr
       set lqrperiod 5
       set cd 5
       set redial 30
       set timeout 0
       set authname <username>
       set authkey <userpass>

       set dial
       set login
       add! default HISADDR
       enable mssfixup
       disable ipv6cp
       accept MSChapV2
       set mppe 128 stateless

Далее:

     touch /etc/hosname.tun0 ; vi  /etc/hostname.tun0 

Добавляем следующие строки:

      !/usr/sbin/ppp -ddial pptp1 >/dev/null 2>&1
      sysctl -w net.inet.gre.allow=1
      reboot

После загрузки машина автоматически соединится с VPN сервером. 
 
popa3d + TLS/SSL (stunnel) на FreeBSD 5.4   Автор: Вотинцев Сергей А.  [есть мнение]
 
Установка stunnel:

   cd /usr/ports/security/stunnel
   make && make install (!) не торопимся делать clean
   Копируем из папки work в /usr/local/etc/stunnel - stunnel.cnf, затем делаем make clean.


Создаем сертификат:
   cd /usr/local/etc/stunnel && openssl req -new -x509 -days 365 \
      -nodes -config stunnel.cnf -out stunnel.pem -keyout stunnel.pem
   chmod 600 stunnel.pem && chown root:wheel stunnel.pem

Конфиг для stunnel:

   cert = /usr/local/etc/stunnel/stunnel.pem
   RNDfile = /usr/local/etc/stunnel/stunnel.rnd
   chroot = /usr/local/var/stunnel/
   setuid = stunnel
   setgid = stunnel
   pid = /run/stunnel.pid
   output = /var/log/stunnel.log
   ciphers = HIGH
   debug = 6
   compression = rle
   [pop3s]
   accept  = 995
   connect = 127.0.0.1:110

Делаем chroot:

   cd /usr/local/var && mkdir stunnel && cd stunnel
   mkdir etc && touch hosts.allow
   cd .. && mkdir run


Содержание hosts.allow:

   pop3s : ALL : allow
   ALL : ALL : deny

Права на директории /usr/local/var/stunnel

   drwxr-xr-x  2 root     wheel    512 Jul 30 20:31 etc
   drwxr-xr-x  2 stunnel  stunnel  512 Aug  3 15:55 run

Правим rc.conf, если у Вас запускается только popa3d из inetd:

   inetd_flags="-wWa 127.0.0.1"
   /usr/local/etc/rc.d/stunnel.sh start

Просмотр ciphers:

   openssl ciphers -v 'HIGH'
 
Защищенный канал связи используя stunnel   Автор: Wely  [есть мнение]
 
Мне потребовалось сделать защищённый канал для связи, под FreeBSD 5.4. 
Выбрал самый легкий путь для моих условий: поставить stunnel. 
Эта программа занимается перенаправлением портов через ssl-канал к обычным портам. итак:

1) portupgrade -fN stunnel

2) такой скрипт для создания самоподписанного ssl сертификата:

   !/bin/sh
   openssl genrsa -des3 -out ca.key 1024
   openssl req -new -x509 -days 365 -key ca.key -out ca.crt
   openssl req -new -nodes -out req.pem -keyout cert.pem
   chmod 600 cert.pem
   chown root:0 cert.pem
   openssl x509 -req -CA ca.crt -CAkey ca.key -days 365 -in req.pem -out signed-req.pem -CAcreateserial
   cat signed-req.pem >> cert.pem
   echo Сертификат готов в файле : cert.pem

3) копируем cert.pem в /usr/local/etc/stunnel

4) правим /usr/local/etc/stunnel/stunnel.conf

5) запускаем stunnel и коннектимся к адресу:порту
 
Шифрованная передача текста (openssl+nc)   Автор: ZEDER  [обсудить]
 
Передаём на хост .1 в порт 666 текст предварительно его зашифровав паролем "paSSw0rd":
   echo ТЕКСТ | openssl des3 -salt -k paSSw0rd | nc 192.168.48.1 666

принимаем на порту 666 текст:
   nc -l -p 666 | openssl des3 -d -k paSSw0rd
 
Как создать шифрованный туннель используя SSH (1)   Автор: [есть мнение]
 
ssh dmzserver -R 9999:mirrorserver:80
ssh -R 9999:localhost:80 dmzserver
ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com
 
Поднятие IP-IP туннеля между FreeBSD и Linux   Автор: Alexey N. Kovyrin  [есть мнение]
 
Пусть имеется 2 машины PC1 (FreeBSD, ip-адрес IP1, интерфейс INT1) и PC2 (Linux, IP2, INT2).
Для построения IP-IP туннеля (на стороне FreeBSD будет адрес TUN1, Linux - TUN2):

  bsd# nos-tun -t /dev/tun0 -s TUN1 -d TUN2 -p 4 IP2
  bsd# ifconfig tun0 mtu 1500
  bsd# ifconfig tun0 up

  linux# ip tunnel add tun0 mode ipip remote IP1 local IP2 dev INT2
  linux# ifconfig tun0 TUN2 pointopoint TUN1
  linux# ifconfig tun0 mtu 1500
  linux# ifconfig tun0 up
 
Включение поддержки IPv6 в FreeBSD (1)   Автор: [обсудить]
 
Ядро:
  options         INET6           # IPv6 communications protocols
  pseudo-device   gif             # IPv6 and IPv4 tunneling
  pseudo-device   faith   1       # IPv6-to-IPv4 relaying (translation)

Регистрация и получение IP (http://www.freenet6.net или http://www.tunnelbroker.net)

  cd /usr/ports/net/freenet6/
  # make install clean
  # /usr/local/etc/rc.d/freenet6.sh start

Подъем IPv6 вручную
  ifconfig gif0 create 
  ifconfig gif0 tunnel your-local-ipv4  remote-ipv4-of-your-broker
  ifconfig gif0 inet6  ipv6-given-by-the-broker ipv6-of-your-broker   prefixlen 128
  route -n add -inet6 default ipv6-of-your-broker

/etc/rc.conf:
  ipv6_enable="YES"
  ipv6_defaultrouter="brokeripv6"
  ipv6_gateway_enable="YES"
  ipv6_network_interfaces="de0 gif0"
  ipv6_ifconfig_gif0="brokeripv6 prefixlen 128"
  ipv6_ifconfig_de0="youripv6::1 prefixlen 64"
  ipv6_static_routes="global"
  ipv6_route_global="2000:: -prefixlen 3 youripv6"
  gif_interfaces="gif0"
  gifconfig_gif0="youripv4 brokeripv4"

Фаервол (Ipfilter):
  /etc/ipf6.rules
     pass in all
     pass out all
  ipf -6 -f /etc/ipf6.rules
 
Использование в Linux IEEE 802.1Q VLAN'ов совместно с Cisco Catalyst Switch   Автор: J  [обсудить]
 
Linux:
  /sbin/vconfig add eth1 5
  /sbin/vconfig add eth1 4
  /sbin/ifconfig eth1.4 192.0.0.8 netmask 255.255.255.240 up
  /sbin/ifconfig eth1.5 192.0.1.8 netmask 255.255.255.240 up

Catalyst:
  conf t
  int fa0/0
   switchport mode trunk
   switchport trunk allowed vlan 4,5,1002-1005
 
Создание gif туннеля в FreeBSD   Автор: kont  [обсудить]
 
1) Собрать ядро с "pseudo-device   gif"
2) В /etc/rc.conf добавить в список сетевых интерфейсов gif0
3) В /etc создать файл под именем start_if.gif0 и сделать ему chmod +x
4) Вставить в файл примерно следующее содержание:
#!/bin/sh
/sbin/ifconfig gif0 create inet virtual-local-ip virtual-remote-ip\
       netmask 255.255.255.252 tunnel source-addr remote-addr mtu 1500 up
/sbin/route add default your-default-router
/sbin/route add -net localnetwork-at-remote virtual-remote-ip
 
Как поднять туннель между Cisco и Linux   Автор: [есть мнение]
 
Linux (192.168.2.1):
   /sbin/ip tunnel add tunl1 mode ipip remote 192.168.1.1
   /sbin/ifconfig tunl1 192.168.3.2 pointopoint 192.168.3.1 netmask 255.255.255.252 mtu 1500

Cisco (192.168.1.1):
  interface Tunnel0
    ip address 192.168.3.1 255.255.255.252
    ip mtu 1500
    tunnel source 192.168.1.1
    tunnel destination 192.168.2.1
    tunnel mode ipip
 
Создание шифрованного туннеля используя zebedee (1)   Автор: [обсудить]
 
Запуск на сервере, куда будем соединятся с клиента:

  washin% zebedee ╜s 

Телнет сессия с клиента:
  isshin% zebedee 9000:washin:telnet
  telnet localhost 9000 
или одной командой:
  zebedee  ╜e "telnet localhost %d" washin
 
Как создать простейший туннель используя утилиту netcat (1)   Автор: [обсудить]
 
Простейший echo-туннель:
  Серверный процесс: nc -l -p 5600
  Клиент: nc 10.0.1.1 5600

netcat для пересылки файла:
 Сервер (куда писать файл): nc -v -w 30 -p 5600 l- > filename.back
 Клиент: nc -v -w 2 10.0.1.1 5600 < filename

Перенаправление ввода/вывода на программу:
  Сервер: nc -l -p 5600 -e /bin/bash
  Клиент: nc 10.0.1.1. 5600

 
Настройка PPTP-клиента под FreeBSD (1)   Автор: l0ner  [есть мнение]
 
Необходимо установить из портов пакет pptpclient
/etc/ppp/ppp.conf
  vpn:
  set authname <LOGIN>
  set authkey <PASSWORD>
  set timeout 0
  set ifaddr 0 0
  add default HISADDR

Подключение к VBN серверу:

  /sbin/route add -host <IP_address_of_VPN_server> <gateway>
  /usr/local/sbin/pptp <IP_address_of_VPN_server> vpn &
 
Использование в FreeBSD IEEE 802.1Q VLAN'ов совместно с Cisco Catalyst Switch   Автор: [есть мнение]
 
В конфигурации FreeBSD ядра:
    pseudo-device vlan 20 # VLAN support (для динамической генерации в новых версиях - 20 можно не писать)
Поднимаем VLAN вручную (где 28 - vlan id на свиче, fxp0 - интерфейс воткнутый в свитч):
    ifconfig vlan0 inet 192.168.1.3 netmask 255.255.255.0 vlan 28 vlandev fxp0

Прописываем в /etc/rc.conf:
  cloned_interfaces="vlan0"
  ifconfig_vlan0="inet 192.168.1.3 netmask 255.255.255.0 vlan 28 vlandev fxp0"
На коммутаторе Cisco Catalyst:
    interface FastEthernet0/1  # линк к FreeBSD
        switchport mode trunk
    interface FastEthernet0/2
        switchport access vlan 28
 
Как с помощью утилиты netcat организовать инкапсуляцию UDP в TCP поток.   Автор: [обсудить]
 
Например, для доступа к syslog UDP порту через TCP соединение (клиент):
        nc -l -u -p syslog | nc localhost 2000
Обратное преобразование (сервер):
       nc -l -p 2000 | nc localhost -u syslog
В итоге можно организовать TCP туннель (например через SSH) для проброса информации для syslog.
 

   Сетевые сервисы

Шаблоны в конфигурационных файлах Asterisk (sip.conf) (1)   Автор: Romik  [есть мнение]
 
Никогда не обращал внимание на такую особенность sip.conf, случайно заметил, что если делать

------ cut ------
[100](!)
context=100
secret=cdm13m-0r9j345
type=friend
host=dynamic
nat=yes
disallow=all
allow=ulaw

[200](100)
context=200
secret=014nm015m9g-f,138n
------ cut ------

, то 200 сможет зарегистрироваться, а 100 - нет, и в sip show peers его тоже не будет, 
он может использоваться только как шаблон.

Правильный вариант будет таким:

------ cut ------ 
[simple-template](!)
type=friend
host=dynamic
nat=yes
disallow=all
allow=ulaw

[100](simple-template)
context=100
secret=cdm13m-0r9j345

[200](simple-template)
context=200
secret=014nm015m9g-f,138n
------ cut ------

То есть отдельно создается шаблон, и отдельно пиры/френды.

// Шаблоны в Asterisk IP PBX используются не только в sip.conf, но и в других конфигурационных файлах. 
См. http://www.voip-info.org/wiki/view/Asterisk+config+template и далее по ссылкам.

 
Настройка bluetooth соединения в Asus EeePC   Автор: [есть мнение]
 
Не смотря на то, что в EeePС нет встроенного bluetooth адаптера, 
к нему легко можно подключить внешний bluetooth брелок с USB интерфейсом.

Все необходимые консольные приложения доступны после установки пакета:


   apt-get install bluez-utils

К сожалению для eeepc отсутствуют GUI хелперы для связывания устройств, 
из того что есть в репозиториях debian etch и xandros (например kdebluetooth), 
из-за проблем с зависимостями пакетов, подходит только bluez-gnome.

Если bluetooth устройство самостоятельно может инициировать связывание, 
то все нормально, если нет - при попытке связать устройства используя только консольные 
средства начинаются проблемы, в bluez 3.x был изменен механизм связывания устройств, 
если ранее достаточно было создать простой скрипт для вывода PIN и прописать в options 
секцию  hcid.conf -  "pin_helper /etc/bluetooth/feed-pin.sh;", то теперь для получения PIN 
используется DBUS. В комплекте с bluez поставляется программа passkey-agent, 
предназначенная для связывания устройств, в пакет bluez-utils в Debian GNU/Linux эта программа 
по каким-то соображениям не была включена. Исходные тексты программы можно найти в 
/usr/share/doc/bluez-utils/examples, но для сборки потребуется установка окружения для сборки программ, 
что в условиях небольшого SSD диска не вполне оправдано. Запускается агент примерно так: 

   passkey-agent --default 1234

где, 1234 пароль для связывания.

Выход нашелся в апплете bluetooth-applet, который входит в состав пакета bluez-gnome. 
Запустив который при попытке связывания появляется  диалоговое окно для ввода пароля связывания.


Для настройки GPRS через сотовый телефон с Bluetooth интерфейсом можно использовать пакет 3egprs 
(устанавливает иконку на десктоп и скрипт /usr/sbin/gprsconf) с сайта http://www.3eportal.com/

Другой вариант - инициирование ppp сессии из консоли. Ниже пример настройки:

Подключаем bluetooth адаптер в USB порт. Через dmesg смотрим, нашелся ли дня него драйвер.

Запускаем инициализацию bluez:
   /etc/init.d/bluetooth start

Смотрим поднялся ли интерфейс:
   hciconfig 


Если статус down, поднимаем его:
   hcicofig hci0 up

Сканируем доступные устройства:
   hcitool scan

Запоминаем адрес устройства. Для примера проверяем его доступность:
   l2ping 00:0A:0B:0C:0D:0E

Адрес можно посмотреть командой:
   hcitool dev


а определить поддерживаем ли bluetooth устройство GPRS:
   sdptool search DUN

Создаем rfcomm интерфейс:
   rfcomm bind 0 [полученный адрес] 1

По идее rfcomm должен создаться автоматически, при надлежащей настройке /etc/bluetooth/rfcomm.conf, 
например: 

   rfcomm0 { 
        bind yes;
        device 00:0A:0B:0C:0D:0E;
        channel 1;
        comment "Mobile";
   }

Далее создаем файл конфигурации для pppd, /etc/ppp/peers/mts:

   lcp-echo-failure 0
   lcp-echo-interval 0
   /dev/rfcomm0
   connect "/usr/sbin/chat -v -f /etc/ppp/peers/gprs"
   115200
   crtscts
   debug
   ipcp-accept-local
   noauth
   usepeerdns
   defaultroute
   noipdefault
   nodetach

/etc/ppp/peers/gprs:


   ABORT  BUSY  ABORT  'NO CARRIER' ABORT VOICE ABORT 'NO DIALTONE' ABORT
   'NO DIAL TONE' ABORT 'NO ANSWER' ABORT DELAYED
   '' 'AT'
   'OK' 'AT+CGDCONT=1,"IP","internet.mts.ru"'
   'OK' 'ATDT*99***1#'
   TIMEOUT 30
   CONNECT

Для beeline заменяем "internet.mts.ru" на "internet.beeline.ru", для мегафона пишем просто "internet".

Подключаемся выполнив команду:
   pppd call mts

Перевод wiki-страницы о настройке Bluetooth в Asus EeePC, выполненный
Сгибневым Михаилом, 
можно найти на странице: http://www.opennet.ru/base/modem/bluetooth_eeepc.txt.html
 
Установка и настройка JUD для Jabberd2 под FreeBSD 6.1 (1)   Автор: protonix  [обсудить]
 
0. Создание пользователя jabber из группы jabber

   #adduser


1. Установка Jabber думую не вызывает проблем - в портах /usr/ports/net-im/jabberd 

   #make install clean

2. Настройка

Можно ниче не менять и оставить все поумолчанию,но желательно изменить в файлах 
   /usr/local/etc/jabberd/sm.xml 
   /usr/local/etc/jabberd/c2s.xml

Если сервер будет не только для локальной сети, а со связью с глобальными, то также меняем в
   /usr/local/etc/jabberd/s2s.xml
   /usr/local/etc/jabberd/resolver.xml

Если нет то можно закоментить в jabber.cfg эти части
меняем имя сервера, и пароль (хотя можно и не менять)
id имя сервера - это то что после @ =) может быть любое (по умолчанию localhost)
user имя для router.xml (jabberd)
pass пароль тоже для router.xml (secret)

Еще проблемы были с паролем в файле router-users.xml - если везде поменяли, то и здесь не забудьте

3. Настройка БД

по умолчанию используется MySQL, ниче менять не будем.
заходим под рутом в MySQL и запускаем скрипт (должны находиться в папке со скриптом /usr/local/share/jabberd)

   mysql -u root -p
   mysql>\. db-setup.mysql


добавляем пользователя (jabberd2) БД и пароль (secret) к нему

   GRANT select,insert,delete,update ON jabberd2.* to jabberd2@localhost IDENTIFIED by 'secret';

если изменили, не забудьте изменить и в sm.xml

на всякий случай делаем ссылку
   ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock 


Попробуйте запустить - заходим под jabber и набираем
   >jabberd

В /var/logs/messages смотрим результат - должно быть реди 
если не запустился,то гдето косяк,запускаем в отладочном режиме
   >jabberd -D


смотрим на чем сервер умирает и исправляем

4. Установка users-agent

   /usr/ports/net-im/jabber-users-agent 
   #make install clean

5. Настройка users-agent

в /usr/local/etc/ опять изменяем конфиг имя,пароль,имя БД(jud),пароль БД(jud)

6. Настройка БД

можно наверно запустить скрипт,но говорят он не работает,поэтому пишем сами

   CREATE DATABASE JUD;
   GRANT ALL PRIVILEGES ON JUD.* to jud@localhost IDENTIFIED BY 'jud';
   CREATE TABLE JUD.jud (jid VARCHAR(100) PRIMARY KEY, name VARCHAR(100),
                       first VARCHAR(50), last VARCHAR(50),nick VARCHAR(50),
                       email VARCHAR(50), INDEX ind_name (name), INDEX ind_first (first),
                       INDEX ind_last (last), INDEX ind_nick (nick),
                       INDEX ind_email (email));

7. Все запускаем из под пользователя jabber - сначала сам джаббер-сервер

   >jabberd 

можно в фоновом режиме с параметром -B
Потом users-agent

в папке /usr/local/lib/jabber/users-agent

   >./users-agent


Все проверяйте в PSI - создавать аккаунты и пытаться найти себя=)

Какие были у меня проблемы:

Читал всякие вики и ртфм и запутался=) :

а)Проблемы с правами доступа, так как запускать можно только от 
пользователя Jabber,не забудьте для конфигов поставить права доступа

б)Исправление файла router-users.xml - нигде вроде не встречал, поэтому и не исправлял

в)Устанавливать надо jabber-users-agent, а не jabber-JUD =)

г)Перловский скрипт запускается с ./ =)

д)Если был до другой джаббер сервер все сносите деинсталом и подчищайте вручную

Вообщето все лежит на 
http://jabberd.jabberstudio.org/2/docs/jabberd_guide.html 

но там много и на английском.И еще помогло 
http://ru.gentoo-wiki.comНастройка_JUD_на_сервере_Jabberd_версии_2.x
 
Как в программе, запущенной через inetd, узнать IP адрес клиента.   Автор: [обсудить]
 
В /etc/hosts.allow (man hosts_access;man hosts_options):
# IP в REMOTE_ADDR
  popa3d: ALL : setenv REMOTE_ADDR %a : allow
# имя хоста в REMOTE_ADDR
  popa3d: ALL : setenv REMOTE_ADDR %h : allow
В программе IP адрес получаем через getenv("REMOTE_ADDR").
 

   DNS

MAC DNS лист   Автор: Vladimir Shingarev  [есть мнение]
 
Иногда нужно узнать какому производителю принадлежит оконечное оборудование, 
наблюдая только его мак на интерфейсе. А открывать браузер для этого лениво.

В таком случае удобно создать MAC-based dns лист. Пользоваться просто:

   ket:/home/sva# host -t txt 001243.macl.nov.ru
   001243.macl.nov.ru descriptive text "Cisco"
   ket:/home/sva# host -t txt 0050ba.macl.nov.ru
   0050ba.macl.nov.ru descriptive text "D-LINK"
 
DNS: Как делегировать неполную (не /24) сеть in-addr.arpa клиенту   Автор: nikl  [есть мнение]
 
Предположим, вы провайдер (provider1) и подключившийся к вам клиент (firma1) взял в пользование сеть /28
Как обеспечить ему самостоятельное управление обратными доменами в его подсети?
Можно делигировать ему неполную сеть, на примере:

У вас есть большая сеть 200.100.100.100/24, клиент из нее взял себе блок 200.100.100.176/28

В своем файле зоны прописываете:

   100.100.200.in-addr.arpa  IN SOA  ns1.provider1.ru. hostmaster.provider1.ru. (
                                2005102000 ; serial
                                36000      ; refresh
                                3600       ; retry
                                1728000    ; expire
                                172800     ; minimum
                                )
                        NS      ns1.provider1.ru.
                        NS      ns2.provider1.ru.

$ORIGIN 100.100.200.in-addr.arpa.

...


173                     PTR     client173-gw.provider1.ru.
174                     PTR     client174-gw.provider1.ru.
175                     PTR     client175-gw.provider1.ru.

176/28                  NS      ns.firma1.ru.
$GENERATE 176-191       $  CNAME   $.176/28

192                     PTR     client192-gw.provider1.ru.
193                     PTR     client193-gw.provider1.ru.

Админ клиента на своем NS'е (ns.firma1.ru) создает
зону "176/28.100.100.200.in-addr.arpa" , в которой спокойно
администрирует свои IP'ы, не отвлекая провайдера от работы.
 
Решение проблемы резолвинга при включенных forwarders в BIND 9   Автор: Vladimir V. Kamarzin  [есть мнение]
 
Если bind 9 одновременно является переадресующим сервером ( forwarders { s.o.m.e; }; ) и авторитативным 
для какой-либо зоны, при делегировании подзоны возникает проблема резолвинга хостов этой подзоны:

   subzone IN NS ns.subzone.zone.tld.
   ns.subzone IN A 192.168.0.1

   dig @ns.zone.tld. somehost.subzone.zone.tld. a

при этом бинд будет спрашивать запись A для хоста somehost.subzone.zone.tld. вовсе не у ns.subzone.zone.tld. , 
а у тех серверов, которые прописаны форвардерами в options!

Чтобы bind резолвил хосты напрямую, через ns.subzone.zone.tld. , необходимо в конфигурации зоны zone.tld. прописать:

        zone "zone.tld." {
                type master;
--->           forwarders { /* empty! */ };
                notify no;
                file "file";
                allow-query { any; };
                allow-transfer { s.o.m.e; };
        };
 
Почему на некоторые запросы named слишком долго (1-4 сек.) резолвит имя (1)   Автор: [есть мнение]
 
Проблемы на IPv4 хостах без IPv6 коннективити, обусловлены появлением IPv6 адресов у B и A корневых NS.

Решение представлено в BIND 9.2.5 и 9.3.1, которые еще не вышли.
Другой путь - собрать bind с ./configure --disable-ipv6 или запустить с опцией -4 (для bind 9.3.0).
 
Пример ведения расширенных логов в named   Автор: [есть мнение]
 
# named.conf
# для более делаьной информации о трансферах расскомментируйте "severity info"
logging {
         channel default_log {
                file "/var/log/dns.log";
#               severity info;
                severity notice;
                print-time yes;
                print-category yes;
                print-severity yes;

         };
         channel more_log {
                file "/var/log/dns_more.log";
        #       severity info;
                severity notice;
                print-time yes;
                print-category yes;
                print-severity yes;
         };
         category queries { default_log;};
         category xfer-in { default_log; };
         category xfer-out { default_log; };
         category security { more_log; };
         category resolver { more_log; };
         category client { more_log; };
         category unmatched { more_log; };
         category default { more_log; };
         category database { more_log; };
};
 
Настройка динамического обновления DNS зон. (1)   Автор: Jeff Garzik  [есть мнение]
 
Генерируем ключи:
    dnssec-keygen -a HMAC-MD5 -b 512 -n USER foo22.bar44.com.


Настройки сервера:

/etc/named.conf:
    include "keys.conf";
    ......
    zone  "bar44.com" {
        type master;
        file  "bar44.com.zone";
        update-policy {
	   grant laptop.bar44.com. name laptop.bar44.com. A TXT;
               grant foo22.bar44.com. subdomain bar44.com. ANY;
        };
        # или   
        #allow-update {
        #     key foo22.bar44.com.
        #};
    };

/etc/namedb/keys.conf:
    key foo22.bar44.com. {
	algorithm HMAC-MD5;
	secret "секретный ключ";

    };

Для обновления зоны:
    nsupdate -k Kfoo22.bar44.com.+157+12505.private -v cmd_file.txt

Пример cmd_file.txt:

    server ns.bar44.com
    zone bar44.com
    update delete somehost.bar44.com. A
    update add somehost.bar44.com. 86400 A 10.10.10.1
    show
    send
 
Оптимизация работы DNS резолвера, случайный выбор NS (1)   Автор: [обсудить]
 
В /etc/resolv.conf:
   options attempts=2, timeout=2, rotate
   ,где attempts - число попыток посылки запроса к серверу.
        timeout - таймаут запроса (по умолчанию 5 сек.)
        rotate   случайный выбор nameserver из списка, а не опрос по порядку.
        timeout - таймаут за который сервер должен успеть ответить.
    Для отладки удобно использовать "options debug"
 
Как организовать рекурсивные запросы только через жестко определенные сервера.   Автор: [обсудить]
 
options {
   # Если "first" - то если forwarders не ответил - запрашиваем сами.
   # Если "only" - сами никогда не запрашиваем, только через forwarders.
   forward only; 
   forwarders {192.168.1.1; 192.168.2.1;};
};
 
Как запретить рекурсивные запросы через DNS сервер для чужих клиентов   Автор: [есть мнение]
 
acl localnet { 192.168.1.0/24; 10.0.1.0/24; };
options {
   allow-recursion {localnet; 192.168.2.0/24};
   # Полностью запросы можно ограничить через "allow-query" или "blackhole"
};
 
Как запретить Bind показывать свою версию для внешнего мира. (1)   Автор: [есть мнение]
 
Узнать версию можно через:
  dig @ns.test.ru version.bind chaos txt

Чтобы запретить, нужно в options блоке named.conf прописать:
  options {
    ...
    version "0.1";
  };
 
Как разрешить полный трансфер DNS зоны только для избранных серверов.   Автор: [обсудить]
 
zone "host.ru" {
        type master;
        allow-transfer { 1.2.3.4; 1.2.3.5; 1.2.3.6;};
        file "host.ru";
}
 
Как избавиться от ограничения числа одновременных коннектов к named   Автор: [обсудить]
 
options {
        directory "/etc/namedb";
        recursive-clients 5000;
        tcp-clients 500;
};
 
Как в DNS прописать два образа одной и той же зоны для внутренней и внешней сети.   Автор: uldus  [есть мнение]
 
 view "internal" {
    match-clients { 192.168.0.0/16; };
    zone "test.ru" {
         type master;
         file "test.ru.int";
    };
 };
 view "external" {
    match-clients { any; };
    zone "test.ru" {
         type master;
         file "test.ru.ext";
    };
 };
 

   FTP

Настройка pure-ftpd в Debian GNU/Linux, с хранением учетных записей в PureDB (1)   Автор: Heckfy  [есть мнение]
 
Цель - отделить пользователей из /etc/passwd от пользователей ftp, 
но не устанавливая различных внешних средств для хранения базы пользователей. 
Из целого ряда ftp-серверов я остановился на pure-ftpd.

Вариант запуска был найден быстро, но при этом сервер должен был запускаться средствами (x)inetd:

   $ grep pure /etc/inetd.conf
   ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/pure-ftpd-virtualchroot -4 -A -E -d -lpuredb:/etc/pure-ftpd/pureftpd.pdb


Сделал так на другом сервере и понял, что у меня там нет inetd. 
Устанавливать не стал. Решил сделать сервис standalone.

   # dpkg-reconfigure pure-ftpd-common

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

   # /etc/init.d/pure-ftpd restart
   Restarting ftp server: Running: /usr/sbin/pure-ftpd-virtualchroot -l pam -d -4 -u 1000 -A -E -O clf:/var/log/pure-ftpd/transfer.log -B

Выключаю pam и включаю puredb
   # rm /etc/pure-ftpd/conf/PAMAuthentication /etc/pure-ftpd/auth/70pam
   # ln -s ../conf/PureDB /etc/pure-ftpd/auth/45puredb

Работа с учетными записями производится посредством pure-pw.

В заключение, пример рабочей конфирурации:

   $ grep -r . /etc/pure-ftpd/*/
   /etc/pure-ftpd/auth/45puredb:/etc/pure-ftpd/pureftpd.pdb
   /etc/pure-ftpd/auth/65unix:no
   /etc/pure-ftpd/conf/UnixAuthentication:no
   /etc/pure-ftpd/conf/VerboseLog:Yes
   /etc/pure-ftpd/conf/IPV4Only:Yes
   /etc/pure-ftpd/conf/MinUID:10000
   /etc/pure-ftpd/conf/ChrootEveryone:Yes
   /e tc/pure-ftpd/conf/NoAnonymous:yes
   /etc/pure-ftpd/conf/PureDB:/etc/pure-ftpd/pureftpd.pdb
   /etc/pure-ftpd/conf/AltLog:clf:/var/log/pure-ftpd/transfer.log
   
 
Как быстро расшарить директории через ftp в Linux   Автор: borey  [есть мнение]
 
На моей станции поднят ftp сервер (vsftpd). Как известно FTP cервер позволяет расшарить 
определённую директорию (в нашем случае /var/ftp/)/ Часто у меня возникали ситуации 
когда нужно что то расшарить по сети, а копировать это в раздел где расшаренная 
директория - места нет. Да и копировать это опять же или менять кофиг сервера и перерапускать сервис. 
Для себя нашёл очень простой и удобный способ как это сделать. 

Монтировать нужные директории в дерево /var/ftp используя 'mount --bind '. всё просто.

   [root@n100851 ~]# mkdir /var/ftp/pub/music
   [root@n100851 ~]# mount --bind /home/user/media/sound/ /var/ftp/pub/music/

и всё. анонимусы могут забирать музыку с FTP сервера.
 
Как гибко манипулировать настройками vsftp для разных сетей   Автор: dimus  [есть мнение]
 
Допустим у нас есть сеть 192.168.0.0/24, с которой надо что-то разрешить, а для остальных - запретить. 
Редактируем файл /etc/hosts.allow

   vsftpd: 192.168.0.0/255.255.255.0, 127.0.0.1: setenv VSFTPD_LOAD_CONF / etc/vsftpd-int.conf : nice 15
   vsftpd: ALL : nice 15

В результате при коннекте из нашей сети будет выполняться конфиг /etc/vsftpd-int.conf, 
а при коннекте из остальных сетей - /etc/vsftpd.conf 
Ну а прописать в разных конфигах разные фичи я думаю проблем не составит. 

У меня так регулируется скорость:

cat /etc/vsftpd-int.conf
   ...тут пропущен здоровый кусок конфига
   # Этот конфиг для внутренних нужд - скорость по максимуму
   anon_max_rate=0
   local_max_rate=0

cat /etc/vsftpd.conf
    ...тут пропущен здоровый кусок конфига
    anon_max_rate=32000
    local_max_rate=64000

 
Пример настройки vsftpd (1)   Автор: [есть мнение]
 
/etc/vsftpd.conf:

# Запускаем как демон, а не из inetd.
listen=YES
background=YES
listen_address=192.168.1.1

# Включаем возможность использования tcpwrapper, лимиты через /etc/hosts.allow
tcp_wrappers=YES

# Пускаем только пользователей имеющих валидный shell, присутствующий в /etc/shells
check_shell=YES

# Вместо реальных владельцев файлов всегда показываем ftp:ftp
hide_ids=YES

# Общее максиамльно допустимое число коннектов.
max_clients=100

# Разрешенное число коннектов с одного IP.
max_per_ip=5

# Таймаут при ожидании команды
idle_session_timeout=300

# Таймаут при передаче данных
data_connection_timeout=60

# Непривилегированный пользователь, для того чтобы делать под ним, что можно выполнить без root.
nopriv_user=ftp

# Запрещаем рекурсивный вызов "ls -R"
ls_recurse_enable=NO

# Ограничение скорости прокачки для анонимных и локальных пользователей (байт в сек.)
anon_max_rate=50000
local_max_rate=100000

# Включаем ведение лога операций.
xferlog_enable=YES
vsftpd_log_file=/var/log/vsftpd.log

# Расширенные логи всех команд
log_ftp_protocol=YES


# ------------ Настрйоки для анонимного сервера

# Если сервер публичный, пускающий анонимных пользователей
anonymous_enable=YES
anon_umask=077

# Корень анонимного ftp архива
anon_root=/usr/local/ftp

# Запрещаем анонимным пользователям запись данных, если нужно разрешить
# запись для локальных пользовтелей (write_enable=YES)
anon_upload_enable=NO

# Запрещаем создавать директории.
anon_mkdir_write_enable=NO

# Запрещаем переименовывать и удалять
anon_other_write_enable=NO

# Если нужно запретить доступ к определенным типам файлов по маске
# deny_file={*.mp3,*.mov, *.avi, .filelist}

# Если нужно скрыть определенные типы файлов при выводе списка, 
# но дать скачать тем кто знает точное имя.
# hide_file={*.mp3,*.mov, *.avi}

# Если анонимную закачку необходимо разрешить, нужно дополнительно 
# использовать chown_uploads=YES и chown_username=ftp_anon_user

# Если нужно пускать анонимных пользователей только при правильном введении 
# email (аналог паролей для ограничения доступа к публичному ftp), заданного в 
# файле определенном директивой email_password_file, нужно установить 
# secure_email_list_enable=YES


# ------------ Настрйоки для входа локальных пользователей

# Если сервер разрешает вход локальных пользователей, присутствующих в системе
local_enable=YES

# "-rw-r--r--"
local_umask=022

# Разрешаем показ файлов начинающихся с точки (например, .htaccess) для кривых ftp-клиентов
force_dot_files=YES

# Разрешаем пользователям записывать/изменять свою информацию на сервер.
# если нужно запретить запись данных - write_enable=NO
# Более тонкий тюнинг через "cmds_allowed=PASV,RETR,QUIT"
write_enable=YES

# Для всех пользователей делаем chroot, делаем корнем их домашнюю директорию,
# Список логинов для которых не нужно делать chroot задаем в vsftpd.chroot_list
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

# Активируем список пользователей которым запрещен вход по FTP (например, root)
userlist_enable=YES
userlist_file=/etc/ftpusers
 
Особенности использование ftp из-за фаервола ipfw/natd   Автор: globus  [есть мнение]
 
Необходимо выпустить пользователей на ftp сайты из локальной сети, но при этом не устанавливая 
дополнительного ПО, используя только возможности FreeBSD 4.10.
Этими возможностями, как ни странно, оказались ipfw и natd 
вот собственно как все это прописывается.

Исходные данные, FreeBSD 4.10 + настроенный nat правила для ipfw 
   ipfw -q add 100 divert natd from 192.168.20.0/24 to any 20, 21 out via $oif 
   ipfw -q add 200 divert natd from any 20, 21 to $iip in via $oif 
   ipfw -q add 300 allow tcp from any to any established 
   ipfw -q add 400 allow tcp from any to any setup 
где $oif и $iip соответственно внешний интерфейс и внешний IP 

теперь запускаем natd 
   /sbin/natd -m -s -u -punch_fw 500:200 -n xl1

заострю внимание на параметре "-punch_fw" -этот параметр создает в фаерволе "ходы", 
добавляя динамические правила. В моем случае эти правила начнутся с номера 500 и будет их добавлено 
максимум 200 (понятно чем больше сеть, те больше нужно правил).

Особое спасибо A Clockwork Orange.
 
Как настроить NAT (транслятор адресов) для нормальной работы с FTP и ICQ в Linux   Автор: [есть мнение]
 
iptables:
   modprobe iptable_nat
   modprobe ip_conntrack_ftp
   modprobe ip_nat_ftp                     
   modprobe ip_nat_irc
ipchains:
   modprobe ip_masq_ftp
   modprobe ip_masq_raudio
   modprobe ip_masq_irc
   modprobe ip_masq_icq
 
Как обеспечить работу active FTP режима в FreeBSD NAT   Автор: [обсудить]
 
В ipnat воспользуйтесь модулем ftp proxy:
  map fxp0 0/0 -> 0/32 proxy port ftp ftp/tcp
  map rl0 172.16.33.0/24 -> 212.46.231.50/32 proxy port ftp ftp/tcp

не забудьте поместить правило трансляции ftp перед общим правилом трансляции, 
порядок следования правил важен.
 

   INN

Как после краха INN перестроить group.index и содержимое overview   Автор: [обсудить]
 
  makehistory -O -x -F

 
Почему INN не запускается и ругается на отсутствие файла history   Автор: Andrey Slusar  [обсудить]
 
  makehistory -b -f history -O -l 30000 -I
  makedbz -f history -i -o -s 30000
 

   Mail, почта

Полезные команды exim (1)   Автор: Хостинг Помощь  [есть мнение]
 
Удаление почтового сообщения по ID
   /usr/sbin/exim -v -Mrm ID

Список сообщений в очереди
   /usr/sbin/exim -bp

Число сообщений в очереди
   /usr/sbin/exim -bpc


Удаление "замороженных" сообщений
   /usr/sbin/exim -bp | awk '$6~"frozen" { print $3 }' | xargs exim -Mrm

Принудительная рассылка всей почты в очереди (flush)
   /usr/sbin/exim -qff -v -C /etc/exim.conf &

"Заморозить" почту по email
   /usr/sbin/exiqgrep -i -f email | xargs exim -Mf

Удалить почту по email
   /usr/sbin/exiqgrep -i -f email | xargs exim -Mrm

 
Копирование писем в Exim. (1)   Автор: mr-tacitus  [есть мнение]
 
Перейдите в секцию ROUTERS файла конфигурации /usr/local/etc/exim/configure 
и перед роутером dnslookup добавьте:

   archive_all:
   driver = accept
   transport = tr_archive_all
   unseen

В секции TRANSPORTS добавьте:

   tr_archive_all:
   driver = appendfile
   maildir_format
   mode = 0660
   mode_fail_narrower = false
   envelope_to_add = true
   return_path_add = true
   directory = /var/mail/archive@domain.com

Перезагрузите Exim. Теперь вся входящая и исходящая почта будет сохраняться 
в директории /var/mail/archive@domain.com.
 
Проверка подлинности получателя в Sendmail + Exchange Server 2003   Автор: Дачкин Евгений  [есть мнение]
 
Проверка подлинности получателя сообщений
Sendmail + LDAP_ROUTING + AD + Exchange 2000/2003

Исходные данные:

AD на базе Win 2003, Exchange Server 2003 расположенный в корпоративной сети. 
Канал Internet и корпоративную сеть разделяет шлюз в DMZ которого располагается 
почтовый релей - сервер на базе FreeBSD + Sendmail.

Задача:

При попытке отправки письма пользователями Internet пользователям Exchange сервера, 
проверять подлинность адреса получателя,  тем самым сократив почтовый трафик 
и избавиться от ненужных NDR (Non-Delivery Report) сообщений.

Действия:

Завести в AD служебную учётную запись, от которой будут осуществляться запросы в LDAP каталог.

Пример:

Пользователь: CN=LDAP_Searcher,OU=Service Accounts,DC=mydomain,DC=com
Пароль: password

Собрать Sendmail с поддержкой LDAP

   # cd /usr/ports/mail/sendmail-ldap/
   # make
   # make install


Проверить корректность фильтра, соединения с сервером LDAP каталога (контроллером домена)

Фильтр:
   (&(|(objectclass=user)(objectclass=group))(proxyAddresses=smtp:myname@mydomain.com))

Пример запроса:

   #ldapsearch -L -x -D "CN=LDAP_Searcher,OU=Service Accounts,
      DC=mydomain,DC=com" -w "password" -h "192.168.0.1" -p 389 -s sub -b 
      "DC=MYDOMAIN,DC=COM" -d "0" "(&(|(objectclass=user)
      (objectclass=group))(proxyAddresses=smtp: myname@mydomain.com))"

Где 192.168.0.1 &#8211; IP адрес сервера LDAP каталога (контроллера домена).

Результатом работы данной команды мы должны получить полный список всех атрибутов объекта каталога 
и их значения, соответствующие пользователю или группе, среди smtp 
адресов которого встречается  myname@mydomain.com.

Исходя из положительного результата, приступаем к конфигурации Sendmail.

Добавляем в файл sendmail.mc следующие 3 строки:

define(`confLDAP_DEFAULT_SPEC', `-h "192.168.0.1" -b "DC=MYDOMAIN,
DC=COM" -d "CN=LDAP_Searcher,OU=Service Accounts,DC=mydomain,
DC=com" -MLDAP_AUTH_SIMPLE -P/etc/mail/ldap_pass')dnl

LDAPROUTE_DOMAIN_FILE(`/etc/mail/ldap_route_domains')dnl

FEATURE(`ldap_routing', `null', `ldap -1 -T<TMPF> -v mail -k 
(&(|(objectclass=user)(objectclass=group))(proxyAddresses=smtp:%0))',`bounce')dnl

Собираем sendmail.cf

/usr/bin/m4 /usr/share/sendmail/cf/m4/cf.m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

Содаём файл /etc/mail/ldap_pass, содержимым которого является пароль служебной 
учётной записи LDAP_Searcher в открытом виде. В нашем случае:
password

Создаём файл /etc/mail/ldap_route_domains, содержимым которого является:
mydomain.com

Запускаем Sendmail.cf

Внимательно проверяем результат.

 
Подсчет exim трафика с разделением на локальный и мировой   Автор: DelGod  [есть мнение]
 
В файле конфигурации exim пишем:

   log_file_path = /var/log/exim/exim-%s-%D.log
   log_selector = +delivery_size +sender_on_delivery +received_recipients

В файл /var/db/ukr_net ложим список украинских сетей

И собствено скрипт для подсчета трафика с разделением на украинский и мировой:

#!/usr/bin/perl -w

my ($nmin, $nmax) = (32,0);

open UKRNETS, "/var/db/ukr_net";
while (<UKRNETS>) {
  s/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\/([0-9]+)$//;
  $UkrIPs{substr(substr(unpack("B32", pack("N", $1)),24).substr(unpack("B32", pack("N", $2)),24).substr(unpack("B32", pack("N", $3)),24).substr(unpack("B32", pack("N", $4)),24),0,$5)}="$1.$2.$3.$4\/$5";
  $nmin = $5 if $5 < $nmin;
  $nmax = $5 if $5 > $nmax;
}
close UKRNETS;

open TRAFF, '/var/log/exim/exim-main-20060122.log';
while (<TRAFF>) {

  my ($mail_from,$mail_to,$ip,$bytes_in,$bytes_out);
  if      (/^[0-9-]+ [0-9:]+ [A-Za-z0-9]{6}-[A-Za-z0-9]{6}-[A-Za-z0-9]{2} <= ([^\@]+@[A-Za-z0-9-.]+).* H=.*\[([0-9.]+)\].* S=([0-9]+).* for ([^\@]+@[A-Za-z0-9-.]+)$/) {
    $mail_1=$1;
    $mail_2=$4;
    $ip=$2;
    $bytes_in=$3;
    $bytes_out=0;
  } elsif (/^[0-9-]+ [0-9:]+ [A-Za-z0-9]{6}-[A-Za-z0-9]{6}-[A-Za-z0-9]{2} [\=\-\*]\> ([^\@]+@[A-Za-z0-9-.]+).* F=\<([^\@]+@[A-Za-z0-9-.]+)\>.* T=remote_smtp S=([0-9]+).* H=.*\[([0-9.]+)\].*/) {
    $mail_1=$2;
    $mail_2=$1;
    $ip=$4;
    $bytes_in=0;
    $bytes_out=$3;
  }
  if ((defined($ip)) and ($ip =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/)) {
    my $ipB=substr(unpack("B32", pack("N", $1)),24)."".substr(unpack("B32", pack("N", $2)),24)."".substr(unpack("B32", pack("N", $3)),24)."".substr(unpack("B32", pack("N", $4)),24);
    for ($Ne=$nmax; $Ne>=$nmin; $Ne--) {
      my $ipBin=substr($ipB,0,$Ne);
      if ($UkrIPs{$ipBin}) {
        $m_from{$mail_1}{ukr}{in} +=$bytes_in;
        $m_from{$mail_2}{ukr}{in} +=$bytes_in;
        $m_from{$mail_1}{ukr}{out}+=$bytes_out;

        $m_from{$mail_1}{mir}{in} -=$bytes_in;
        $m_from{$mail_2}{mir}{in} -=$bytes_in;
        $m_from{$mail_1}{mir}{out}-=$bytes_out;
        last;
      }
    }
    $m_from{$mail_1}{mir}{in} +=$bytes_in;
    $m_from{$mail_2}{mir}{in} +=$bytes_in;
    $m_from{$mail_1}{mir}{out}+=$bytes_out;
  }
}
close TRAFF;

my $i=0;
foreach $mails (keys %m_from) {
  $i++;
  print "$i $mails 
  in  ukr $m_from{$mails}{ukr}{in}
  out ukr $m_from{$mails}{ukr}{out}
  in  mir $m_from{$mails}{mir}{in}
  out mir $m_from{$mails}{mir}{out}
";
}
 
Как забирать почту с одного ящика и раскладывать локальным пользователям (1)   Автор: universite  [обсудить]
 
Ниже настройки для fetchmail для забора почты с группового почтового ящика 
и распределения ее по локальным ящикам пользователей.

/usr/local/etc/fetchmailrc

  set daemon 905

  defaults
  set logfile /var/log/fetchmail/fetchmail.log

  poll mx2.yyyyyyy.od.ua
    proto pop3
    envelope X-Envelope-To localdomains yyyyyyy.od.ua
    user "halo"
    pass "qwerty"
    is root
    nokeep
    fetchall
    flush
    smtpaddress smtp.xxxxx.odessa.ua
    fetchdomains yyyyyyy.od.ua
    is "*" = to "*"
    norewrite
    smtphost 127.0.0.1
  ##############

chmod 710 /usr/local/etc/fetchmailrc # выставляем привелегии для конфига
chown fetchmail:wheel /usr/local/etc/fetchmailrc # выставляем владельца и группу конфига
echo 'fetchmail_enable="YES"' >> /etc/rc.conf  # прописываем для старта в rc.conf 
/usr/local/etc/rc.d/./fetchmail start # запускаем демона

set daemon 905  - проверять ящик каждые 905 сек.
mx2.yyyyyyy.od.ua - имя сервера, откуда почту забираешь
yyyyyyy.od.ua - твой домен
halo - логин на ящике и ниже его пароль
smtp.xxxxx.odessa.ua - smtp провайдера или твой релей

Сортируется по заголовкам "X-Envelope-To"
 
Дублирование доставки почты в Postfix c авторизацией в mysql   Автор: triz0r  [есть мнение]
 
Есть Postfix + авторизация пользователей в mysql. Так вот появилась необходимость почту, 
приходящую на какой-нить адрес ещё пересылать кому-угодно. Т.е. не форвардить письмо, 
а именно копию отсылать на нужный адрес. Притом хочется чтобы всё было красиво и понятно.

Решение: 

Postfix ищет virtual_maps в базе mysql
   virtual_maps=hash:/etc/postfix/virtual_maps.cf


virtual_maps.cf содержит запрос который по адресу email выдает alias.  
Что-то типа такого:

   user = postfix
   password = postfix
   dbname = mail
   table = alias
   select_field = goto
   where_field = address
   hosts = 127.0.0.1

На goto идет почта, которая предназначается для address. Т.е. на один физический maildir 
(или другой конечный пункт) собирается почта от разных алиасов. 
Проблема в том что при такой конфигурации не сделать так чтобы почта для user@domain.com 
шла и на alias1@domain.com и на alias2@domain2.com

После анализа того, как механизм Postfix читает возврат от mysql получаем:

Нужно чтобы почта для локального юзера user@domain.com приходила на user@domain.com + на mail@domain2.com 
и + ещё куда нить :) При этом везде должна лежать копия. 

Обычно таблица alias содержит вот что:

   address goto
   email1   email2
   email3   email2
   ...
   email5   email_other

Надо сделать так.

   address   goto
   email     other_email1,other_email2,...

Т.е. через запятую без пробелом указываем все те адреса куда надо послать копию письма. 
hash:/mysql примет строку и КОРРЕКТНО подставит её куда надо, а сам Postfix нормально 
всё выставит в очередь сообщений и отправит. Там же указываем адрес локальной доставки. 
И всё :) Никаких скиптов, procmail и прочей бурды. 

Теперь представьте гибкость и легкость с такими вещами как redirect, forwarding, copy + mysql.
 
 
Авторизация пользователей в postfix с использованием Cyrus-SASL2 и MySQL   Автор: Case Dorsett  [есть мнение]
 
Все делалось на FreeBSD 5.4.

Ставим cyrus-sasl2:
   # cd /usr/ports/security/cyrus-sasl2
   # make -DWITHOUT_NTLP -DWITHOUT_OTP -DWITH_MYSQL install clean


Ставим postfix:
   # cd /usr/ports/mail/postfix
   # make install clean

Появится менюшка, где надо выбрать с поддержкой чего собирать, нам нужно минимум SASL2, 
жмем ОК и ждем окончания сборки, после:
в файл /usr/local/lib/sasl2/smtpd.conf пишем следующее (ессно заменить информацию о mysql на свою):

   pwcheck_method: auxprop
   auxprop_plugin: sql
   mech_list: sql plain login
   sql_engine: mysql
   sql_hostnames: localhost
   sql_user: postfix
   sql_passwd: <li><li>*
   sql_database: mail
   sql_select: select password from users where login='%u@%r'
   sql_verbose: yes

В /usr/local/etc/postfix/main.cf дописываем:
   broken_sasl_auth_clients = yes
   smtpd_sasl_auth_enable = yes
   smtpd_sasl_local_domain =
   smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks
   smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject

   # postfix reload


После наполняем mysql и все.. авторизация проходит..

Таких статей конечно много, но при всем их количестве - ушло 2 дня что бы собрать рабочую конфигурацию.. 
то в одной статье опечатка, то в другой вообще уже устаревшая информация.. 
здесь я обобщил просто то, что получилось именно у меня в конкретном случае..
 
Пример боевой конфигурации Postfix   Автор: Вотинцев Сергей А.  [есть мнение]
 
queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix

sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
setgid_group = maildrop
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix

mail_name = ESMTP
mail_owner = postfix
myhostname = domain.ru
mydomain = domain.ru
myorigin = $mydomain

virtual_alias_domains = virtual.domain.ru
virtual_alias_maps = hash:/usr/local/etc/postfix/virtual

inet_interfaces = all
mydestination = $mydomain, localhost.$mydomain, localhost

mynetworks_style = host
mynetworks = hash:/etc/mail/popauth

relay_domains =

allow_mail_to_commands = alias
allow_mail_to_files = alias

local_recipient_maps = hash:/usr/local/etc/postfix/users $alias_maps
alias_maps = hash:/usr/local/etc/postfix/aliases
alias_database = hash:/usr/local/etc/postfix/aliases
header_checks = regexp:/usr/local/etc/postfix/header_checks
address_verify_map = btree:/usr/local/etc/postfix/verify

unknown_local_recipient_reject_code = 550

in_flow_delay = 1s

smtpd_banner = $myhostname ESMTP
smtpd_helo_required = yes
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
show_user_unknown_table_name = no
smtpd_client_event_limit_exceptions =
smtpd_delay_reject = no

default_process_limit = 50
smtpd_client_connection_count_limit = 15
smtpd_client_connection_rate_limit = 10
smtpd_client_message_rate_limit = 5
anvil_rate_time_unit = 30s
smtpd_recipient_limit = 5
smtpd_recipient_overshoot_limit = 5

local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10

message_size_limit = 5242880
mailbox_size_limit = 26214400
header_size_limit = 51200

smtpd_timeout = 30s
smtpd_junk_command_limit = 5
smtpd_error_sleep_time = 10s
smtpd_soft_error_limit = 3
smtpd_hard_error_limit = 5

hopcount_limit = 5

smtpd_etrn_restrictions = reject
smtpd_reject_unlisted_recipient = yes
smtpd_reject_unlisted_sender = yes
address_verify_sender = abuse

smtpd_client_restrictions = check_client_access hash:/usr/local/etc/postfix/access,
			    reject_rbl_client relays.ordb.org,
			    reject_rbl_client list.dsbl.org,
			    reject_multi_recipient_bounce,
			    reject_unauth_pipelining
			    
smtpd_helo_restrictions = reject_unknown_hostname,
			    reject_invalid_hostname,
			    reject_non_fqdn_hostname

smtpd_recipient_restrictions = reject_non_fqdn_recipient,
				reject_unknown_recipient_domain,
				reject_unlisted_recipient,
				permit_mynetworks,
				reject_unauth_destination

smtpd_sender_restrictions = reject_non_fqdn_sender,
			    reject_unknown_sender_domain,
			    reject_unlisted_sender,
			    permit_mynetworks,
			    check_sender_access hash:/usr/local/etc/postfix/sender,
			    reject_unverified_sender 
 
Использование pop-before-sendmail.patch для popa3d и Postfix   Автор: Вотинцев Сергей А.  [есть мнение]
 
Последовательность действий для установки POP Before SMTP на popa3d + Postfix 

1: cd /usr/ports/mail/popa3d
2: make
3: cd work/popa3d-popa3d-1.0
4: cp ../../files/pop-before-sendmail.patch pop-before-sendmail.patch
5: patch < pop-before-sendmail.patch
правим если нужно params.h
6: make
7: cd ../../
8: make install && make clean
9: cd /etc/mail/ && touch popauth && postmap popauth

Правим main.cf:
10: mynetworks = hash:/etc/mail/popauth
11: postfix reload

Правим inetd.conf
12: pop3    stream  tcp     nowait/10/5/2  root    /usr/local/libexec/popa3d   popa3d

перезапускаем inetd.

 
Как перезапустить очередь в postfix   Автор: Nikolaev D./  [есть мнение]
 
Иногда после изменений в конфигурации необходимо перезапустить очередь
 что бы сообщения в очереди начали обрабатываться заново:
   postsuper -r ALL

Для очистки очереди:
   postsuper -d ALL
 
Почему при обработке почты скриптом в Postfix возникает "mail forwarding loop"   Автор: [есть мнение]
 
Для предотвращения эффекта игры в "пинг-понг" Postfix добавляет к
каждому полученному сообщению заголовок "Delivered-To:" (изменить
подобное поведение можно через директиву prepend_delivered_header, но
крайне не рекомендуется, из-за возможности появления замкнутых петель).

Если письмо обрабатывает скрипт и затем пересылает на другой email
(например, менеджер почтовых рассылок), оставив поле "Delivered-To:"
в неизменном состоянии, то ложно срабатывает защита.

В качестве решения рекомендуется вырезать заголовок "Delivered-To:"
на этапе получения письма в скрипте.

Например:
    while (<STDIN>){
        if (! /^delivered-to:/i){
            ....
        }
    }
 
Как обеспечить работу SMTP сервера при dial-up соединении   Автор: [есть мнение]
 
- Диалап с фиксированным IP;
- MTA провайдера должен быть MX'ом для domain.com (с прописанным почтовым рутингом и "hold" спулом);
- После выхода в сеть, посылаем команду "ETRN domain.com", которая приведет к инициированию 
процесса отправки сообщений из спула для domain.com:
   echo -e "HELO dial.domain.com\nETRN domain.com\nQUIT\n"| nc relay.domain.com 25
 
Как удалить письмо из очереди Postfix   Автор: [есть мнение]
 
postsuper -d <id> deferred (-d ALL - удалить все сообщения из очереди)
Для удаления группы писем от определенного адресата, можно использовать:

  mailq|grep 'test@test.ru'|awk '{print $1}'|xargs -J{} -n1 postsuper -d {} deferred
 
Как в postfix осуществить преобразования UUCP формата email адреса или внести изменения в адрес.   Автор: [есть мнение]
 
man 5 canonical (см. canonical_map, recipient_canonical_maps,  sender_canonical_maps)
main.cf:
   canonical_maps = regexp:/etc/postfix/canonical_regexp
canonical_regexp:
   /^.*!(.*)!(.*)$/        $2@$1
   /^([^!]+)!([^@]+)@.*$/  $2@$1
Преобразуем из вида uutest6!uutest6.uucp.test.ru!user318 в вид user318@uutest.uucp.test.ru
 
Как организовать в sendmail пересылку всей почты (или для выбранных доменов) только через определенный релей.   Автор: [есть мнение]
 
в sendmail.cf: DSesmtp:[relay.somehost.ru]
или для m4 скриптов:
    define(`SMART_HOST',`relay.somehost.ru')dnl
или для игнорирования MX значения (далее в квадратных скобках):
    define(`SMART_HOST',`[relay.somehost.ru]')dnl
Для описания пути транспортировки почты (почтового роутинга) для определенных доменов:
FEATURE(`mailertable', `hash /etc/mail/mailertable')dnl
/etc/mail/mailertable
domain1         esmtp:relay1.somehost.ru
domain2         smtp:[relay2.somehost.ru]
 
Как в postfix настроить маршрутизацию почты в обход значения MX   Автор: [есть мнение]
 
Для отправки почты для test.ru только через relay2.test.ru в обход MX:
  main.cf:
      transport_maps = hash:/usr/local/etc/postfix/transport
  transport:
      test.ru :[relay2.test.ru]                           
Для того чтобы всю почты пересылать через релэй, 
нужно использовать в main.cf опцию relayhost

 
Как в postfix и sendmail перенаправить почту для несуществующих пользователей на определенный email ?   Автор: [есть мнение]
 
Postfix:

    luser_relay = vasia@pupkin.org
Или, для виртуального домена в virtual, перенаправим всю почту для домена test.ru на vasia@pupkin.org, в viruals :
   test.ru test.ru
   @test.ru     vasia@pupkin.org
Sendmail, используя m4:
    define(`LUSER_RELAY',`mail.somehost.ru')  # перенаправление на почтовый сервер
    define(`LUSER_RELAY',`local:pupkin') # перенаправление локальному пользователю.
 

   Безопасность и установка ограничений

Создание ограничений входящей и исходящей почты в Postfix для определенных пользователей (1)   Автор: Резников Алексей  [есть мнение]
 
Ситуация:есть Postfix выставленный в Интернет,который допустим выступает шлюзом для Exchange в LAN.
Задача: разрешить отправку почты в Интернет и обратно только определенным пользователям. 
Выход: используем классы разрешений, Postfix restriction classes.


Создаем два класса users_out для исходящих писем,users_in соответственно для входящих.

   smtpd_restriction_classes = users_out, users_in

В классах будут проверятся пользователи которым разрешено отправлять и получать почту,
именно этим и занимаются правила check_*_access

   users_in = check_recipient_access hash:/etc/postfix/users, reject
   users_out = check_sender_access hash:/etc/postfix/users, reject


В smtpd_*_restrictions указываем проверку на наш почтовый домен domain.ru 
к которому будет  применяться созданные классы.

   smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/senders
   smtpd_recipient_restrictions = permit_mynetworks,
                              check_recipient_access hash:/etc/postfix/destinations,
                              reject_unauth_destination

Файл destinations с нашим доменом и указанием классов которые будут применятся к ним у

   domain.ru         users_in

Содержимое файла senders

   domain.ru         users_out

Файл users со списком пользователей которым разрешено отправлять и получать почту

   test@domain.ru        OK
   boss@domain.ru        OK
   billy@domain.ru       OK

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

 
Настройка SASL аутентификации для Postfix   Автор: Астафьев Григорий  [есть мнение]
 
Статья о том как сделать sasl на postfix'е и убедиться в его работоспособности.

Задача:

Установить sasl и postfix и сделать авторизацию вида:
1) отправлять письма могут только пользователи системы (/etc/passwd).
2) все остальные не пропускать.

Система: FreeBSD 7.0


Установка:

1) /usr/ports/secutiry/cyrus-sasl2

   [+] AUTHDAEMOND
   [+] LOGIN
   [+] PLAIN

   make install clean

(если программы уже были установлены то повторно вызвать меню опций при установке можно командой make config)

2) /usr/ports/security/cyrus-sasl2-saslauthd

    make install clean

3) создаем и редактируем /usr/local/lib/sasl2/smtpd.conf:

   pwcheck_method: saslauthd
   mech_list: plain login

далее добавляем в /etc/rc.conf:


   saslauthd_enable="YES"
   saslauthd_flags="-a pam"

4) Теперь постифкс 
   /usr/ports/mail/postfix
   [+]SASL2

   make install clean

при установке на все вопросы ответить утвердительно "y"

5) теперь мини-рабочий конфиг постфикса:

/usr/local/etc/postfix/main.cf

   queue_directory = /var/spool/postfix
   command_directory = /usr/local/sbin
   daemon_directory = /usr/local/libexec/postfix
   mail_owner = postfix
   myhostname = host.domain.ru
   mydomain = domain.ru
   mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
   smtpd_sasl_auth_enable = yes
   smtpd_security_options = noanonymous
   smtpd_client_restrictions =
    permit_sasl_authenticated,
    reject_plaintext_session
   smtpd_sender_restrictions =
    permit_sasl_authenticated,
    reject_plaintext_session


(!!! Внимание, господа, эта статья требует чтобы в конфиге postfix не было упоминаний mynetworks)

6) Теперь просто в консоли из под рута 

   newaliases


эта команда создаст файл /etc/aliases.db необходимый для постфикса

7) Для тестирования желательно иметь php на машинке потому как sasl механизм login и plain используют 
технологию шифрования base64 и для обработки "руками" логина и пароля нужно будет написать скриптик:

   <?php
   print base64_encode("логин");
   print "\n";
   print base64_encode("пароль");
   print "\n";
   ?>

P.S. (Кому интересно plain это base64_encode("логин\0логин\0пароль");)

тоже самое на Perl:

   perl -e 'use MIME::Base64; print encode_base64("логин") . "\n" .encode_base64("пароль"). "\n"'


8) Перезагружаем postfix


Тестирование SASL.

1) тестирование "руками":

   telnet айпиадрес 25

оно оветит:

   220 host.domain.ru ESMTP Postfix


говорим ему:

   ehlo host

(где host -имя машины)
оно ответит:

   220 host.domain.ru ESMTP Postfix
   250-host.domain.ru
   250-PIPELINING
   250-SIZE 10240000
   250-VRFY
   250-ETRN
   250-AUTH LOGIN PLAIN
   250-ENHANCEDSTATUSCODES
   250-8BITMIME
   250 DSN

если есть строка 250-AUTH LOGIN PLAIN - то значит есть вероятность успеха.
теперь заходим без авторизации и смотрим как наше сообщение не проходит:

   mail from: user@domain.ru

оно:

   250 2.1.0 Ok


мы:

   rcpt to: user2@domain.ru

оно:

   554 5.7.1 <user2@domain.ru>: Relay access denied

- значит все отлично нас не пустили просто так.
напечатайте

   quit

и теперь идем с регистрацией:

   telnet айпиадрес 25


   220 host.domain.ru ESMTP Postfix

   ehlo host

   250-host.domain.ru
   250-PIPELINING
   250-SIZE 10240000
   250-VRFY
   250-ETRN
   250-AUTH LOGIN PLAIN
   250-ENHANCEDSTATUSCODES
   250-8BITMIME
   250 DSN

теперь вводим:

   auth login

оно скажет нам сообщение вида:

   334 VXNlcm5hbWU6


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

   cGVuc2U=

на что сервер ответил

   334 UGFzc3dvcmQ6

теперь пароль в том же виде:

   cnZpZGlh

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

   235 2.0.0 Authentication successful


вот оно - авторизация пройдена.
теперь соответственно

   mail from:
   rcpt to:
   data
  hello world
  .
  quit

все. письмо отправлено.
 
popa3d + TLS/SSL (stunnel) на FreeBSD 5.4   Автор: Вотинцев Сергей А.  [есть мнение]
 
Установка stunnel:

   cd /usr/ports/security/stunnel
   make && make install (!) не торопимся делать clean
   Копируем из папки work в /usr/local/etc/stunnel - stunnel.cnf, затем делаем make clean.

Создаем сертификат:
   cd /usr/local/etc/stunnel && openssl req -new -x509 -days 365 \
      -nodes -config stunnel.cnf -out stunnel.pem -keyout stunnel.pem
   chmod 600 stunnel.pem && chown root:wheel stunnel.pem


Конфиг для stunnel:

   cert = /usr/local/etc/stunnel/stunnel.pem
   RNDfile = /usr/local/etc/stunnel/stunnel.rnd
   chroot = /usr/local/var/stunnel/
   setuid = stunnel
   setgid = stunnel
   pid = /run/stunnel.pid
   output = /var/log/stunnel.log
   ciphers = HIGH
   debug = 6
   compression = rle
   [pop3s]
   accept  = 995
   connect = 127.0.0.1:110

Делаем chroot:

   cd /usr/local/var && mkdir stunnel && cd stunnel
   mkdir etc && touch hosts.allow
   cd .. && mkdir run


Содержание hosts.allow:

   pop3s : ALL : allow
   ALL : ALL : deny

Права на директории /usr/local/var/stunnel

   drwxr-xr-x  2 root     wheel    512 Jul 30 20:31 etc
   drwxr-xr-x  2 stunnel  stunnel  512 Aug  3 15:55 run

Правим rc.conf, если у Вас запускается только popa3d из inetd:

   inetd_flags="-wWa 127.0.0.1"
   /usr/local/etc/rc.d/stunnel.sh start

Просмотр ciphers:

   openssl ciphers -v 'HIGH'
 
Ограничение приема внешней почты в postfix. (1)   Автор: SHRDLU  [обсудить]
 
Пример введения ограничений на прием внешней почты для определенных адресов. 
В конкретном примере, пользователь с адресом test@domain.com имеет право на прием и передачу сообщений 
только в пределах domain.com. Ни написать на другие адреса, ни принять почту с них он не может. 
Остальные пользователи спокойно пишут куда хотят и получают почту с любых адресов.

/etc/postfix/main.cf:
    smtpd_recipient_restrictions = hash:/etc/postfix/protected_destinations,  
              check_sender_access hash:/etc/postfix/restricted_senders, 
              permit_sasl_authenticated, permit_auth_destination, reject
    smtpd_restriction_classes = local_only, insiders_only
    local_only = check_recipient_access hash:/etc/postfix/local_domains, reject
    insiders_only = check_sender_access hash:/etc/postfix/local_domains, reject

В /etc/postfix/restricted_senders:
    test@domain.com           local_only
    test@mail.domain.com      local_only

В /etc/postfix/local_domains:
    domain.com     OK
    mail.domain.com  OK

В /etc/postfix/protected_destinations:
    test@domain.com insiders_only
    test@mail.domain.com insiders_only


И не забыть потом:
    postmap /etc/postfix/restricted_senders
    postmap /etc/postfix/local_domains
    postmap /etc/postfix/protected_destinations
    postfix reload 

См. также http://www.opennet.ru/base/net/postfix_per_user_acl.txt.html 
 
Запуск postfix в chroot окружении   Автор: [обсудить]
 
1. В /var/spool/postfix создаем директории dev и etc.
    В etc копируем файлы /etc/host.conf /etc/localtime /etc/services /etc/resolv.conf

2. Правим master.cf, ставим в колонке chroot символ 'y' у следующих процессов:
    smtp, pickup, cleanup, qmgr, rewrite, bounce, defer, trace, verify, flush, relay, showq, error
3. Активируем proxymap для чтения файлов из вне chroot окружения (/etc/passwd, aliases, различные "map"-файлы), например:
    local_recipient_maps = $alias_maps proxy:unix:passwd.byname 
    relay_domains = $mydestination, proxy:hash:/usr/local/etc/postfix/relay_domains
    smtpd_sender_restrictions = check_sender_access proxy:hash:/usr/local/etc/postfix/ access, 
               reject_non_fqdn_sender, reject_unknown_sender_domain
    smtpd_client_restrictions = check_client_access proxy:hash:/usr/local/etc/postfix/access_clients,
               check_recipient_access proxy:hash:/usr/local/etc/postfix/spam_allowed,
               check_client_access proxy:hash:/usr/local/etc/postfix/antispam/blocklist/block_list,
               check_client_access proxy:hash:/usr/local/etc/postfix/antispam/blocklist/block_list_arc,
               check_client_access regexp:/usr/local/etc/postfix/dsl_stoplist.txt,
               reject_rbl_client rbl.test.ru
    smtpd_recipient_restrictions = check_recipient_access proxy:hash:/usr/local/etc/postfix/fullboxes,
               reject_non_fqdn_recipient,
               permit_mynetworks,
               reject_unknown_recipient_domain,
               reject_unauth_destination
    transport_maps = proxy:hash:/usr/local/etc/postfix/transport
    proxy_read_maps = $smtpd_helo_restrictions $smtpd_recipient_restrictions $smtpd_sender_restrictions \
               $smtpd_client_restrictions $local_recipient_maps $mydestination $virtual_alias_maps \
               $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps \
               $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps \
               $relocated_maps $transport_maps $mynetworks


3. Создаем дополнительный syslog сокет в chroot окружении:
    FreeBSD: "syslogd -l /var/spool/postfix/dev/log" 
    Linux: "syslogd -a /var/spool/postfix/dev/log"
 
Как запретить выполнение программ через .forward файл.   Автор: [обсудить]
 
Часто ограничив cgi скрипты пользователей и доcтуп по FTP, 
забывают про возможность запуска программ через "|script" опцию в .forward файле.
Запрещение выполнения скриптов через .forward в Postfix (для агента доставки local):
  allow_mail_to_commands = alias
  local_command_shell=/dev/null
Вообще запретить .forward, через изменение пути поиска:
  forward_path = $home/.forward
 
Как заставить postfix проверять наличие локального пользователя в системе на этапе соединения   Автор: [есть мнение]
 
В main.cf добавьте строчку:
    local_recipient_maps = $alias_maps unix:passwd.byname
Без данной опции, postfix полностью принимает письмо для любого пользователя, 
даже для несуществующего, и лишь потом рассылает bounce сообщение.
С local_recipient_maps ошибка генерируется сразу на этапе RCPT TO:
 
Тестирование на открытый relaying   Автор: [обсудить]
 
telnet domen 25
HELO hostname
VRFY email_адрес
EXPN email_addr
MAIL FROM: email_адрес_от_кого
RCPT TO: email_адрес_кому
DATA
test
.
QUIT
 
Как заставить sendmail не отправлять все тело письма при ошибке   Автор: [есть мнение]
 
В sendmail.cf добавить nobodyreturn, например:
    O PrivacyOptions=authwarnings, novrfy, noexpn, nobodyreturn
При использовании, M4: 
    define(`conf_PRIVACY_FLAGS', `authwarnings, noexpn, novrfy, nobodyreturn')
В Postfix:
    bounce_size_limit = 10000

 
какие ограничения нужно установить в sendmail.cf   Автор: [есть мнение]
 
в sendmail.cf
O MaxRecipientsPerMessage=20
O MaxMessageSize=1000000
При использовании M4 макросов:
define('confMAX_RCPTS_PER_MESSAGE', '20')
define('confMAX_MESSAGE_SIZE', '1000000')

 
Какие ограничения для пользователей выставить в Postfix.   Автор: [есть мнение]
 
# Ограничиваем размер сообщения в 1 Мб.
message_size_limit = 1024000
# Ограничичиваем число CC в одном письме.
smtpd_recipient_limit = 5
# Ограничиваем размер ящика 
mailbox_size_limit = 51200000
Если patch.mailbox:
# формат inbox-size-override: login макс_размер
default_mailbox_size = 5000
mailbox_size_map = hash:/etc/postfix/inbox-size-override

 
Как заблокировать проверку наличия аккаунта в системе через SMTP   Автор: [есть мнение]
 
Проверку через "expn логин_пользователя" или "vrfy логин_пользователя",
можно заблокировать в sendmail:
В sendmail.cf добавить "O PrivacyOptions=authwarnings, noexpn, novrfy"
(можно использовать опции needexpnhelo, needvrfyhelo, которые требуют
 наличия предварительного HELO для выполнения EXPN или VRFY)
или m4 макросом 
define(`conf_PRIVACY_FLAGS', `authwarnings, noexpn, novrfy')
В Рostfix: disable_vrfy_command = yes

 

   Борьба со спамом, фильтрация почты

Сборка exim с поддержкой SPF и DomainKeys в Debian GNU/Linux (1)   Автор: Pavel Piatruk  [обсудить]
 
echo 'deb-src ftp://ftp.nl.debian.org/debian/ testing main contrib non-free' >> /etc/apt/sources.list
apt-get update
apt-get build-dep exim4 
apt-get install libspf2-dev libspf2-2
cd 
wget http://www.kibibyte.se/download/debian/libdomainkeys0_0.68-1_i386.deb
wget http://www.kibibyte.se/download/debian/libdomainkeys0-dev_0.68-1_i386.deb
dpkg -i libdomainkeys0_0.68-1_i386.deb
dpkg -i libdomainkeys0-dev_0.68-1_i386.deb
cd /usr/src
apt-get source exim4
cd exim4-4.68

fakeroot debian/rules unpack-configs
cp EDITME.exim4-heavy EDITME.exim4-custom
vi EDITME.exim4-custom

# uncomment next lines:
 EXPERIMENTAL_SPF=yes
 LDFLAGS += -lspf2
# add next lines
EXPERIMENTAL_DOMAINKEYS=yes
LDFLAGS += -ldomainkeys

fakeroot debian/rules pack-configs
fakeroot debian/rules extradaemonpackages=exim4-daemon-custom binary

ls ../*deb

#TEST:
cd ..
dpkg -X exim4-daemon-custom_4.68-2_i386.deb EXIM
ldd EXIM/usr/sbin/exim4  | grep -e domainkeys -e spf
        #libspf2.so.2 => /usr/lib/libspf2.so.2 (0xb7752000)
        #libdomainkeys.so.0 => /usr/lib/libdomainkeys.so.0 (0xb774c000)

 
Блокировка отброшенных SMTP сервером IP адресов/подсетей.   Автор: Забудкин Лев Мирославович  [есть мнение]
 
#!/bin/sh
#
#REJECTSPAMMERS v0.1b Lev Zabudkin. zabudkin@mail.ru
#
#Описание:
#   Данный скрипт аккумулирует (создаёт/пополняет) уникальный список IP адресов,
#   которые были отброшены SMTP сервером.
#   Скрипт создан с той целью, чтобы REJECT'ить в дальнейшем все пакеты с таких адресов.
#
#Действие:
#   После выполнения будут созданы файлы в папке указанной в SCRIPTDIR (см. ниже):
#   rejectspammers.run.iptables.block.byip.add             - Блокировать IP адреса
#   rejectspammers.run.iptables.block.byip.delete          - Убрать прежнюю блокировку IP адресов
#   rejectspammers.run.iptables.block.byip.subnet24.add    - Блокировать всю подсеть 255.255.255.0 IP адресов
#   rejectspammers.run.iptables.block.byip.subnet24.delete - Убрать прежнюю блокировку подсети 255.255.0.0
#   rejectspammers.run.iptables.block.byip.subnet16.add    - Блокировать всю подсеть 255.255.0.0 IP адресов
#   rejectspammers.run.iptables.block.byip.subnet16.delete - Убрать прежнюю блокировку подсети 255.0.0.0
#   rejectspammers.run.iptables.block.byip.subnet8.add     - Блокировать всю подсеть 255.0.0.0 IP адресов
#   rejectspammers.run.iptables.block.byip.subnet8.delete  - Убрать прежнюю блокировку подсети 255.0.0.0
#
# Соответственно для нужной блокировки запустите нужный файл.
#

#Создавать ли файлы с цепочками DELETE
MAKEDELETEOLD=yes

#Файл с логами SMTP сервера
MAILLOG=/var/log/maillog

#Каталог, в котором создавать скрипты iptables
SCRIPTDIR=/

#Временный каталог
TEMPDIR=/tmp


cat $MAILLOG | grep rejected >$TEMPDIR/rejectedspammers
awk '{user[tolower($10)]=$10} END {for(i in user) {print i}}' $TEMPDIR/rejectedspammers >$TEMPDIR/rejectedspammers.list
cat $TEMPDIR/rejectedspammers.list |cut -d '[' -f2|cut -d ']' -f1 | uniq >$TEMPDIR/rejectspammers.ips
awk --field-separator=. '{print "iptables -A INPUT -s "$1"."$2"."$3"."$4" -p tcp --dport 25 -j REJECT";}' \
   $TEMPDIR/rejectspammers.ips>>$SCRIPTDIR/rejectspammers.run.iptables.block.byip.add
awk --field-separator=. '{print "iptables -A INPUT -s "$1"."$2"."$3".".0/24" -p tcp --dport 25 -j REJECT";}' \
   $TEMPDIR/rejectspammers.ips>>$SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet24.add
awk --field-separator=. '{print "iptables -A INPUT -s "$1"."$2".".0/16" -p tcp --dport 25 -j REJECT";}' \
   $TEMPDIR/rejectspammers.ips>>$SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet16.add
awk --field-separator=. '{print "iptables -A INPUT -s "$1".".0/8" -p tcp --dport 25 -j REJECT";}' \

   $TEMPDIR/rejectspammers.ips>>$SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet8.add
cat $SCRIPTDIR/rejectspammers.run.iptables.block.byip.add | sort | uniq \
   >$TEMPDIR/rejectspammers.run.iptables.block.byip.add.temp
cat $TEMPDIR/rejectspammers.run.iptables.block.byip.add.temp >$SCRIPTDIR/rejectspammers.run.iptables.block.byip.add
cat $SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet24.add | sort | uniq \
   >$TEMPDIR/rejectspammers.run.iptables.block.bysubnet24.add.temp
cat $TEMPDIR/rejectspammers.run.iptables.block.bysubnet24.add.temp >$SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet24.add
cat $SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet16.add | sort | uniq \
   >$TEMPDIR/rejectspammers.run.iptables.block.bysubnet16.add.temp
cat $TEMPDIR/rejectspammers.run.iptables.block.bysubnet16.add.temp >$SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet16.add
cat $SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet8.add | sort | uniq \
   >$TEMPDIR/rejectspammers.run.iptables.block.bysubnet8.add.temp

cat $TEMPDIR/rejectspammers.run.iptables.block.bysubnet8.add.temp >$SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet8.add


if [ "$MAKEDELETEOLD" == "yes" ]; then
 awk --field-separator=. '{print "iptables -D INPUT -s "$1"."$2"."$3"."$4" -p tcp --dport 25 -j REJECT";}' \
   $TEMPDIR/rejectspammers.ips>>$SCRIPTDIR/rejectspammers.run.iptables.block.byip.delete
 awk --field-separator=. '{print "iptables -D INPUT -s "$1"."$2"."$3".".0/24" -p tcp --dport 25 -j REJECT";}' \
   $TEMPDIR/rejectspammers.ips>>$SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet24.delete
 awk --field-separator=. '{print "iptables -D INPUT -s "$1"."$2".".0/16" -p tcp --dport 25 -j REJECT";}' \
   $TEMPDIR/rejectspammers.ips>>$SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet16.delete
 awk --field-separator=. '{print "iptables -D INPUT -s "$1".".0/8" -p tcp --dport 25 -j REJECT";}' \
   $TEMPDIR/rejectspammers.ips>>$SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet8.delete
 cat $SCRIPTDIR/rejectspammers.run.iptables.block.byip.delete | sort | uniq \
   >$TEMPDIR/rejectspammers.run.iptables.block.byip.delete.temp
 cat $TEMPDIR/rejectspammers.run.iptables.block.byip.delete.temp >$SCRIPTDIR/rejectspammers.run.iptables.block.byip.delete
 cat $SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet24.delete | sort | uniq \
   >$TEMPDIR/rejectspammers.run.iptables.block.bysubnet24.delete.temp
 cat $TEMPDIR/rejectspammers.run.iptables.block.bysubnet24.delete.temp >$SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet24.delete
 cat $SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet16.delete | sort | uniq \
   >$TEMPDIR/rejectspammers.run.iptables.block.bysubnet16.delete.temp
 cat $TEMPDIR/rejectspammers.run.iptables.block.bysubnet16.delete.temp >$SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet16.delete
 cat $SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet8.delete | sort | uniq \
   >$TEMPDIR/rejectspammers.run.iptables.block.bysubnet8.delete.temp
 cat $TEMPDIR/rejectspammers.run.iptables.block.bysubnet8.delete.temp >$SCRIPTDIR/rejectspammers.run.iptables.block.bysubnet8.delete
fi

chmod +0755 $SCRIPTDIR/rejectspammers.run.iptables.block.*

 
Особенность использования Dspam в связке с qmail+vpopmail   Автор: Олег  [есть мнение]
 
Следует отметить, что если вы используете dspam в связке с qmail+vpopmail 
последний должен быть версии не ниже 5.3.7 (с опцией --enable-make-seekable, она yes по умолчанию), 
иначе не работает конструкция вида:

   /usr/local/dspam/bin/dspam --user local_part@domain.com \
    --deliver=innocent,spam | /var/vpopmail/bin/vdelivermail '' bounce-no-mailbox

vdelivermail отваливается с ошибкой на несикабельность пайпа (errno 29).
 
Фильтрация спама силами Postfix.   Автор: Дмитрий Кустов  [есть мнение]
 
Привожу выдержки из настроек в main.cf для фильтрации спама в версии Postfix 2.2 его собственными силами.
Использую также SASL2 для аутентификации (это не обязательно) и PCRE (аналог regexp).

/etc/postfix/main.cf

====================
   disable_vrfy_command = yes
   strict_rfc821_envelopes = yes
   smtpd_etrn_restriction = reject
   smtpd_sasl_auth_enable = yes
   smtpd_helo_required = yes
   smtpd_helo_restrictions =

   smtpd_recipient_restrictions =
        permit_sasl_authenticated,
        permit_mynetworks,
        reject_non_fqdn_recipient,
        check_recipient_access pcre:/etc/postfix/recipient_checks.pcre,
        reject_unknown_recipient_domain,
        reject_unverified_recipient,
        reject_unauth_destination,
        reject_unauth_pipelining,
        permit_auth_destination

   smtpd_data_restrictions =
        reject_unauth_pipelining,
        reject_multi_recipient_bounce,
        permit

   smtpd_delay_reject=no


   # здесь у меня пусто, но можно ввести свой контроль
   smtpd_client_restrictions =
   #       check_client_access hash:/etc/postfix/maps/access_client

   # количество RBL серверов регулируйте сами, я дал наиболее распространённые, на мой взгляд
   smtpd_sender_restrictions =
        permit_sasl_authenticated,
        permit_mynetworks,
        reject_invalid_hostname,
        reject_non_fqdn_hostname,
        reject_non_fqdn_sender,
        check_sender_access hash:/etc/postfix/maps/ not_our_domain_as_sender,
        reject_unknown_client,
        reject_unknown_sender_domain,
        reject_unknown_hostname,
        check_client_access pcre:/etc/postfix/client_checks.pcre,
        check_helo_access pcre:/etc/postfix/helo_checks.pcre,
        reject_rbl_client bl.spamcop.net,
        reject_rbl_client sbl-xbl.spamhaus.org,
        reject_rbl_client dul.dnsbl.sorbs.net,
        reject_rbl_client list.dsbl.org,
        reject_rbl_client dnsbl.njabl.org,
        reject_rbl_client relays.ordb.org,
        reject_rbl_client cbl.abuseat.org,
        reject_rbl_client opm.blitzed.org,
        reject_rbl_client dul.ru,
        reject_rhsbl_sender dsn.rfc-ignorant.org
====================

/etc/postfix/client_checks.pcre

====================
   /(modem|dia(l|lup)|cp[ce]|dsl|p[cp]p|cable|catv|poo(l|les)|pppoe|dhcp|client|
   customer|user|host|[0-9]{4,})(-|_|\.|[0-9])/ REJECT Invalid hostname (client)

   /[0-9]+-[0-9]+/                 REJECT Invalid hostname (D-D)
====================

/etc/postfix/helo_checks.pcre

====================
   /[^[] *[0-9]+((\.|-|_)[0-9]+){3}/ REJECT Invalid hostname (ipable)

   /(modem|dia(l|lup)|cp[ce]|dsl|p[cp]p|cable|catv|poo(l|les)|pppoe|dhcp|client|
   customer|user|host|[0-9]{4,})(-|_|\.|[0-9])/ REJECT Invalid hostname (client)


   /[0-9]+-[0-9]+/                 REJECT Invalid hostname (D-D)
====================


/etc/postfix/recipient_checks.pcre

====================
   /[@!%].*[@!%]/ 550 Please use user@domain address forms only.
====================

/etc/postfix/maps/not_our_domain_as_sender

====================
   yourdomain.tld     554 Go away, bloody spammer!
====================
 
Kaspersky + Postfix с ограничениями для адресов   Автор: BrUYE  [обсудить]
 
При автоматической установке Касперского для Postfix при настроенных ограничениях для адресов 
(smtpd_recipient_restrictions, sender_restrictions, etc) в логи валятся сообщения типа:

   postfix/smtpd[20375]: connect from localhost.localdomain[127.0.0.1]
   postfix/smtpd[20375]: warning: unknown smtpd restriction: "restricted_recipients"
   postfix/smtpd[20375]: NOQUEUE: reject: RCPT from localhost.localdomain[127.0.0.1]: 
      451 Server configuration error; from=<user@domain.com> to=<group@domain.com>


  postfix/lmtp[20197]: 00499FCF34: to=<group@domain.com>, relay=127.0.0.1[127.0.0.1], delay=10, 
      status=deferred (host 127.0.0.1[127.0.0.1] said: 421 <group@domain.com> Error ! (in reply to end of DATA command))

Необходимо убрать/закомментировать в /etc/postfix/master.cf параметры, 
которые прописал KAV и которые конфликтуют с параметрами в /etc/postfix/main.cf.

У меня секция KAV в /etc/postfix/master.cf имеет вид:

127.0.0.1:10030     inet  n      n      n      -      20     spawn
          user=kluser   argv=/opt/kav/5.5/kav4mailservers/bin/smtpscanner 

127.0.0.1:10031    inet  n      -      n      -      21      smtpd
         -o content_filter=
#        -o local_recipient_maps=
#        -o relay_recipient_maps=
#        -o smtpd_restriction_classes=
#        -o smtpd_client_restrictions=
#        -o smtpd_helo_restrictions=    
#        -o smtpd_sender_restrictions=
#        -o mynetworks=127.0.0.0/8

         -o strict_rfc821_envelopes=yes
         -o smtpd_error_sleep_time=0
         -o smtpd_soft_error_limit=1001
         -o smtpd_hard_error_limit=1000
         -o myhostname=mail.domain.com

Потом 
   mail# postfix reload; postqueue -f
 
Какие эффективные DNSBL списки дают наименьшее число ложных срабатываний.   Автор: [есть мнение]
 
Советую использовать list.dsbl.org (http://dsbl.org/) и dnsbl.njabl.org (http://dnsbl.njabl.org/).
 
Блокирование спама в postfix используя маски для домена в HELO   Автор: Евгений Егоров  [есть мнение]
 
Открыл недавно несколько возможностей в Постфиксе для отсеивания нежелательной почты на этапе HELO.
Теперь у меня сервер отсеивает от 90 до 98% почты сразу. Антивирус (clamAV) и SA отдыхают. 

Коэффициент SA задрал до 7.3. Все равно до него мало что доходит.

Итак в main.cf стоит:
   smtpd_recipient_restrictions =
       permit_mynetworks,
       reject_non_fqdn_recipient,
       reject_unauth_destination,
       check_helo_access hash:/etc/postfix/helo_checks,
       check_helo_access pcre:/etc/postfix/helo_checks_pcre,
       check_sender_access hash:/etc/postfix/sender_checks,
       check_client_access hash:/etc/postfix/client_checks,
       check_sender_mx_access cidr:/etc/postfix/mx_access,
       check_recipient_mx_access cidr:/etc/postfix/mx_access,
       reject_rbl_client relays.ordb.org,
       reject_rbl_client sbl.spamhaus.org,
       reject_unknown_sender_domain,
       reject_unknown_recipient_domain

/etc/postfix/helo_checks:

      # Reject anybody that HELO's as being in our own domain(s)
      # (Note that if you followed the order suggested in the main.cf
      # examples, above, that machines in mynetworks will be okay.)
      <Мой домен>                  REJECT You are not in trala.la


      # Somebody HELO'ing with our IP address?
      <мой IP>          REJECT You are not me

Это хорошо помогает против вирус и зомби.

/etc/postfix/helo_checks.pcre:
      # Initial expression
      #/^[0-9]+(\.[0-9]+){3}$/        REJECT Invalid hostname (plain D)
      # expression modified by Eugene 22.03.2005
      /[^[] *[0-9]+((\.|-)[0-9]+){3}/ REJECT Invalid hostname (ipable)
      #
      /(modem|dia(l|lup)|dsl|p[cp]p|cable|catv|poo(l|les)|dhcp|client|customer|user|[0
-9]{4,})(-|\.|[0-9])/ REJECT Invalid hostname (client)
      #
      /[0-9]+-[0-9]+/                 REJECT Invalid hostname (D-D)
 
Postfix и фильтр запрещенных атачей с уведомлением (1)   Автор: JackSoft  [есть мнение]
 
Пример конфигурации для  Postfix 2.1.x, позволяющей ограничить доступ  писем с определенными атачами, 
с генерацией отчета о недоставке отправителю,  c указанием причины блокировки.

main.cf: 

   mydomain = test.ru
   myorigin = $mydomain
   soft_bounce = no
   bounce_size_limit = 50000
   relayhost = mail.test.ru
   queue_directory = /var/spool/postfix
   command_directory = /usr/local/sbin
   daemon_directory = /usr/local/libexec/postfix
   mail_owner = fcmail
   default_privs = nobody
   mynetworks_style = subnet
   mynetworks = 192.168.0.0/16
   alias_maps = hash:/etc/mail/aliases
   alias_database = hash:/etc/mail/aliases
   mail_spool_directory = /var/mail
   smtp_always_send_ehlo = yes
   transport_maps = hash:/usr/local/etc/postfix/transport
   smtpd_helo_required = yes
   message_size_limit = 5242880
   readme_directory = no
   sample_directory = /usr/local/etc/postfix
   sendmail_path = /usr/local/sbin/sendmail
   setgid_group = maildrop
   manpage_directory = /usr/local/man
   newaliases_path = /usr/local/bin/newaliases
   mailq_path = /usr/local/bin/mailq
   local_recipient_maps = $alias_maps unix:passwd.byname
   notify_classes = delay, protocol, resource, software, policy
   header_checks=regexp:/usr/local/etc/postfix/header_checks
   header_checks=pcre:/usr/local/etc/postfix/header_checks
   mime_header_checks=regexp:/usr/local/etc/postfix/mime_checks
   mime_header_checks=pcre:/usr/local/etc/postfix/mime_checks
   default_process_limit=500
   smtpd_sender_restrictions = check_sender_access
   hash:/usr/local/etc/postfix/smtpd.sender, permit
   relocated_maps=hash:/usr/local/etc/postfix/relocated
   maximal_queue_lifetime = 1h
   delay_warning_time = 1h
   bounce_notice_recipient = it
   2bounce_notice_recipient = it
   error_notice_recipient = it
   smtp_skip_4xx_greeting = yes
   smtp_skip_5xx_greeting = no
   access_map_reject_code = 550
   reject_code = 550
   unknown_client_reject_code = 550

Правила фильтрации в файле mime_checks:

   /^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+\.(lnk|asd|hlp|ocx|reg\
      |bat|c[ho]m|cmd|exe|dll|vxd|pif|scr|hta|jse?|sh[mbs]|vb[esx]|ws[fh]\
      |wav|mov|wmf|xl|jpg|bmp|gif|mp3))"?\s*$/ \
      REJECT 550 Attachment type not allowed. File "$2" has unacceptable extension "$3"

Для дублирования уведомлений на служебный адрес, нужно указать:
       bounce_notice_recipient = it
       2bounce_notice_recipient = it
       error_notice_recipient = it
   где it - Ваше е-mail или группа рассылки.
 
Проверка фильтров postfix (1)   Автор: Roman Y. Bogdanov  [обсудить]
 
Как проверить фильтры для postfix? Очень просто:
  $ postmap -q "Content-Type: 1.exe" regexp:/etc/postfix/header_checks


Или просто входом с файла
  $ postmap -q - regexp:/etc/postfix/body_checks < msg_file

Замечание: postmap не делает различий между header, subject и bodymessage.
 
Запрещение внешней почты с указанием собственным домена в качестве отправителя. (1)   Автор: Roman Y. Bogdanov  [есть мнение]
 
Когда спам идет от адреса домена пользователю домена.
   helo somehost
   mail from: me@mydomain.ru
   rcpt to: me@mydomain.ru
  data

Т.е. когда почта принимается с любого IP адреса для $mydestination на MX. 
А с внешнего адреса она к нам приходить не может. Это не есть правильно. Лечить в Postfix так (main.conf):
   smtpd_recipient_restrictions =
   permit_mynetworks,
   check_sender_access hash:/usr/local/etc/postfix/antispam/wtf,
   ограничения дальше,
   ...


потом, в antispam/wtf
   brj.pp.ru 554 brj.pp.ru sender? What the fuck? You're not in mynetworks!

потом
   makemap hash /usr/local/etc/postfix/antispam/wtf.db < /usr/local/etc/postfix/antispam/wtf
 
Ограничения для адреса отправителя в Postfix   Автор: Косенков Игорь  [есть мнение]
 
Иногда требуется ограничить прием почты для Postfix только с определенных доменов.
Пример - внутренний почтовый сервер для приема и отправки почты только в локальной сети.
В этом случае нам нужно , чтобы почта ходила только внутри некоего домена - mydomain.ru.

Делаем следующее. В main.cf:
   smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access, reject
В файле access:
   #здесь перечисляем домен(ы) для которых почта разрешена почта
   mydomain.ru  OK
Затем 
   postmap access
   postfix reload

Теперь будет приниматься почта только для тех, у кого в поле MAIL FROM стоит mydomain.ru. 
Для всех остальных - генериться код "Acces denied".
 
Проверка наличия пользователя на этапе соединения в Postfix (2 способ)   Автор: Косенков Игорь  [есть мнение]
 
2 способ позволяет среди всех пользователей в системе
 отобрать тех, которым ДЕЙСТВИТЕЛЬНО нужна почта.
В main.cf:
        local_recipient_maps = hash:/etc/postfix/users
Сюда же можно добавить $alias_maps.

В /etc/postfix/users заносим всех пользователей, для которых надо принимать почту:
   user1 здесь_что-нибудь
   user2 здесь_что-нибудь
"здесь_что-нибудь" - это набор все равно каких символов, чтобы выполнилась команда postmap.

Затем postmap /etc/postfix/users. И, конечно, postfix reload.

Теперь почта будет приниматься только для пользователей из файла users.
Для остальных  будет генериться "User unknown in local recipient table" на этапе соединения. 
 
Подключение RBL и списков блокировки в Postfix 2   Автор: awk  [есть мнение]
 
smtpd_client_restrictions = ...
              reject_rbl_client list.dsbl.org
              check_recipient_access hash:/etc/postfix/skipcheck,
              reject_unknown_client
Предпоследняя строка позволяет разрешить получение почты для некоторых получателей с unknown адресов.
только для этого необходимо указать в конфиге smtpd_delay_reject=yes

тогда даже на этапе HELO можно указывать исключения на основе адреса получателя:
smtpd_helo_restrictions = permit_mynetworks,
                       reject_invalid_hostname,
                       reject_non_fqdn_hostname,
                       check_recipient_access hash:/etc/postfix/skipcheck,
                       reject_unknown_hostname
 
Фильтры в Postfix для копирования исходящей почты (1)   Автор: Косенков Игорь  [есть мнение]
 
1. В master.cf добавить строку:
    backup unix - n n - - pipe flags=R user=postfix argv=/etc/postfix/script ${sender} ${recipient}
2. В /etc/postfix/script должно быть:
    #!/bin/bash
    /usr/sbin/sendmail -f $1 $2 backup@mydomain.ru
3.Добавить в main.cf:
    smtpd_sender_restrictions = что там есть, hash:/etc/postfix/smtpd.sender
4. Создать файлик /etc/postfix/smtpd.sender такого вида (потом сделать postmap smtpd.sender):
    user@mydomain.ru FILTER backup:
 
Простые и эффективные regex для блокирования спама по имени домена   Автор: [есть мнение]
 
/^dsl.*\..*\..*/i       553 AUTO_DSL spam
/[ax]dsl.*\..*\..*/i    553 AUTO_XDSL spam
/client.*\..*\..*/i     553 AUTO_CLIENT spam
/cable.*\..*\..*/i      553 AUTO_CABLE spam
/pool.*\..*\..*/i       553 AUTO_POOL spam
/dial.*\..*\..*/i       553 AUTO_DIAL spam
/ppp.*\..*\..*/i        553 AUTO_PPP spam
/dslam.*\..*\..*/i      553 AUTO_DSLAM spam
/node.*\..*\..*/i       553 AUTO_NODE spam

Подключение для Postfix: в main.cf, к smtpd_client_restrictions списку добавить regexp:путь
 
Как в Exim отфильтровать спам по базе открытых релеев.   Автор: dawnshade  [обсудить]
 
После строки "require verify = sender"
   deny    message       = Access denied - $sender_host_address listed by $dnslist_domain\n$dnslist_text
           dnslists      = dnsbl.sorbs.net
   deny    message       = message from $sender_host_address rejected - see http://njabl.org/

           dnslists      = dnsbl.njabl.org
   deny    message       = rejected because $sender_host_address for bad WHOIS info, see http://www.rfc-ignorant.org/
           dnslists      = ipwhois.rfc-ignorant.org
   deny    message       = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text
           dnslists      = dialups.mail-abuse.org
   deny    message       = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text
           dnslists      = list.dsbl.org
   deny    message       = Spam blocked see: http://www.spamcop.net/w3m?action=checkblock&ip=$sender_host_address
           dnslists      = bl.spamcop.net
   deny    message       = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text
           dnslists      = relays.ordb.org
   deny    message       = rejected, $sender_host_address Open Proxy, see: $dnslist_domain\n$dnslist_text
           dnslists      = dnsbl.void.ru
 
Как отфильтровать в postfix ALC спам   Автор: Antony  [есть мнение]
 
Postfix:
    body_checks = regexp:/etc/postfix/body_checks

Пример для "AMER ICAN  LA NGUAGE CENTER" 
/etc/postfix/body_checks:
~^[[:alnum:]+/]{60,}[[:space:]]*$~     OK
/.*A.*M.*E.*R.*I.*C.*A.*N.*L.*A.*N.*G.*U.*A.*G.*E.*C.*E.*N.*T.*E.*R.*/     REJECT Body Spam Rule NN

 
Как отфильтровать спам по базе открытых релеев.   Автор: [есть мнение]
 
Postfix:

    maps_rbl_domains = work.drbl.caravan.ru, dul.ru, relays.ordb.org
    maps_rbl_reject_code = 550
    smtpd_client_restrictions = reject_maps_rbl
Sendmail (в sendmail.mc):
    FEATURE('dnsbl', 'dul.ru', 'Use mail relays of your ISP')dnl
    FEATURE('dnsbl', 'work.drbl.caravan.ru', `Use mail relays of your ISP')dnl
    FEATURE('dnsbl', 'relays.ordb.org', 'Spam bloked from open relay.')dnl
Ссылки: http://www.drbl.ofisp.org/zones.html , http://www.dul.ru/ ,  http://ordb.org/faq/
 
Где взять примеры написания фильтров к MTA для блокирования вирусов.   Автор: [есть мнение]
 
Exim: ftp://ftp.exim.org/pub/filter/
Подключается через: message_filter = /etc/exim/system_filter.exim
Procmail: ftp://ftp.rubyriver.com/pub/jhardin/antispam/html-trap.procmail

Postfix: http://www.mrbill.net/postfix/
         http://www.opennet.ru/base/net/postfix_filter.txt.html
 
Как через procmail блокировать спам.   Автор: [обсудить]
 
Вот пример моего .procmailrc, фильтует наиболее примитивные попытки спэма:
        :0
        * ^To: undisclosed-recipients
        /home/mc/Mail/Trash
        :0
        * !^To: .*@
        /home/mc/Mail/Trash
        :0
        * ^X-Mailer:.*Advanced Mass
        /home/mc/Mail/Trash
        :0
        * ^Content-Type.*indows-1251
        /home/mc/Mail/Trash
        :0
        * ^Content-Disposition: attachment;  filename=.*\.(pif|bat|com|exe|lnk)
        /home/mc/Mail/Trash
 
Как вырезать вирусы из письма используя Postfix   Автор: [обсудить]
 
/etc/postfix/main.cf:
body_checks = regexp:/etc/postfix/body_checks
header_checks = regexp:/etc/postfix/header_checks
/etc/postfix/body_checks:
# Вырезаем EXE файлы.
# в скобках [     ] - один пробел и один символ табуляции.
/^[     ]*name=.*\.(exe|dll|eml|vbs|pif|com|bat|scr|lnk)\"?$/           REJECT
/\<iframe src=cid\:.* height=0 width=0\>/i      REJECT
/^Content-Disposition: attachment; *filename=.*\.(exe|dll|eml|vbs|pif|com|bat|scr|lnk).*/i   REJECT
/etc/postfix/header_checks:
# Sircam
/^Content-Type:multipart.*"----[A-F0-9]+_Outlook_Express_message_boundary"/i    
# Nimbda
/^X-Unsent: 1/  REJECT
/^X-Mailer: Advanced Mass Sender/       REJECT                                 
/^X-Mailer: Mail Bomber/        REJECT                                      
/^X-Mailer: .*\-VC_IPA \[/      REJECT
 

   Отправка и пересылка сообщений на уровне пользователя

Отправка gmail почти через msmtp (1)   Автор: Roman Y. Bogdanov  [есть мнение]
 
Проблема. Хожу я с ноутбуком по разным местам. Разные провайдеры. Разные настройки. 
Необходимо с ноутбука доставлять почту для мира. Ноутбук работает под FreeBSD. Как решить проблему? 
Ответ очень простой. Нужно установить пакет msmtp. Он занимается доставкой почты от клиента к серверу. 
Правильно назвать это будет MDA - Mail Delivery Agent. У меня есть почта в системе google. 
Собственно через smtp gmail я и буду делать доставку. Сначала необходимо установить msmtp. Вот файл настроек:

   $ cat .msmtprc
   account default host smtp.gmail.com port 587
   protocol smtp auth on from mylogin@gmail.com user mylogin@gmail.com
   password пароль tls on tls_starttls on 
 
Как прикрепить 48x48 иконку к письму (1) (2)   Автор: [есть мнение]
 
Содержимое черно-белой 48x48 иконки передается через заголовк X-Face, цветной - Face 
(PNG картинка, размером после base64 кодирования не больше 998 байт, разбивка по 79 символов в строке).

Скрипт для преобразования Jpeg в "Face:"

#!/bin/bash

jpg=$1
png=$2

if [ "$jpg" = "" -o "$png" = "" ]; then
   echo "Usage: make-face <JPG-FILE> <BASE64-FILE>"
   exit
fi

quant=16
found=false
tmp=/tmp/make-face.$$.tmp

while [ "$found" = "false" ]; do
    echo -n "Trying quantization $quant ($jpg)..."
    djpeg "$jpg"\
	| ppmnorm\
	| pnmscale -width 48 -height 48\
	| ppmquant $quant\
	| pnmtopng\
	| mimencode > $tmp
    size=`ls -l $tmp | awk '{ print $5; }'`
    if [ $size -lt 993 ]; then
	echo -n "Face:" > "$png"
	for i in `cat $tmp`; do
	    echo -n " " >> "$png"
	    echo "$i" >> "$png"
	done
	rm $tmp
	found=true
	echo "done"
    else
	quant=`expr $quant - 2`
	echo "too big ($size)"
    fi

done

    
 
Как послать письмо с аттачем из shell (1)   Автор: Vadim Fedorov  [есть мнение]
 
metasend -b -s "$SUBJECT" -f $TXTFILE -m text/plain -e none -n \
         -f $ATTFILE -m application/octet-stream -e base64 -t $MAILTO
  
mpack -s "$SUBJECT" -c application/octet-stream $ATTFILE $MAILTO
 
mutt -a $ATTFILE -s "$SUBJECT" $MAILTO < $TXTFILE
 
Как из командной строки послать письмо с приаттаченным файлом   Автор: [обсудить]
 
metasend
В зависимости от типа файла, в качестве Content-type пишем:
application/gzip
application/zip
application/postscript
image/jpeg
image/png
audio/basic
audio/mpeg3
audio/wav
 
Как отправить все сообщения из mailbox на другой email   Автор: [обсудить]
 
cat /var/spool/mail/user_name | formail -s sendmail some@email

Во FreeBSD утилита formail идет в комплекте с портом procmail
 

   NFS

Настройка NFS сервера и NFS клиента под FreeBSD и Linux   Автор: [есть мнение]
 
NFS сервер (FreeBSD):

/etc/rc.conf:

    portmap_enable="YES"
    nfs_server_enable="YES"
    nfs_reserved_port_only="YES"

/etc/exports (man exports):
    /usr/local/nfs -rw 192.168.1.2
    /usr/local/nfs -ro -mapall=nobody -network 192.168.1 -mask 255.255.255.0
    /cdrom -alldirs,quiet,ro -network 192.168.33.0 -mask 255.255.255.0


Для Linux /etc/exports будет выглядеть примерно так (запуск - service start portmap и nfs):

    /usr/local/nfs  192.168.1.0/255.255.255.0(ro) 192.168.2.1(rw)

NFS клиент:

/etc/rc.conf: 
   portmap_enable="YES", nfs_client_enable="YES"

/etc/fstab:
    192.168.1.1:/usr/local/nfs          /home/nfs   nfs ro  0   0

или вручную:
   /sbin/mount_nfs -r 32768 -w 32768 -i noatime 192.168.1.1:/usr/local/nfs /home/nfs 


Для оптимизации производительности рекомендуется при монтировании в Linux указывать параметры:
   rsize=32768,wsize=32768,intr,noatime

Число запущенных клиентов и серверов под FreeBSD регулируется 
через параметр "-n" в переменных rc.conf: nfs_client_flags и nfs_server_flags

В некоторых Linux дистрибутивах число серверов задается в файле /etc/sysconfig/nfs, 
переменная NFSDCOUNT, значение которой передается как аргумент при запуске rpc.nfsd.
 

   SNMP

Как по SNMP скинуть dialup пользователя с линии (Cisco AS)   Автор: [есть мнение]
 
Скинуть пользователя по заданному порту (N) можно через OID:
        1.3.6.1.4.1.9.9.150.1.1.3.1.5.N
        snmpset as-1.test.ru private .1.3.6.1.4.1.9.9.150.1.1.3.1.5.N i 1
Соспоставить логин с номером порта можно через OID:
        1.3.6.1.4.1.9.9.150.1.1.3.1.2
Или из FAQ: snmpset -v1 as-1.test.ru private .1.3.6.1.4.1.9.2.9.10.0 i $line
 
Как в UCD-SNMP прописать скрипт для обработки нужного MIB ObjectID   Автор: [обсудить]
 
Полный контроль над MIBOID осуществляется с помощью команды pass.
pass MIBOID EXEC-COMMAND
Например: 
pass .1.3.6.1.4.1.2021.255 /bin/sh /usr/local/local/passtest
Как писать обработчик passtest, можно найти в поставке ucd-snmp.
Если просто нужно выдать результат выполнения скрипта, можно использовать exec:
exec .1.3.6.1.4.1.2021.51 ps /bin/ps 
 

   Samba

Пример блокирования файлов по расширениям на samba сервере (1)   Автор: izya12  [есть мнение]
 
Пример запрещения записи файлов по расширению (veto files переписать в одну строку):

   [SOUND]
   path = /mnt/sde/music
   comment = звуковой-сервер
   username = roma,vnelubin,gtcvet,eolax,mlapin,kkorobejnikov
   only user = yes
   public = yes
   writable = yes
   create mode = 0775
   force create mode = 0775
   directory mode = 0775
   force directory mode = 0775
   veto oplock files = /*.mp3/*.wav/
   veto files = /*.a*/*.A*/*.b*/*.B*/*.c*/*.C*/*.D*/*.d*/*.E*/*.e*/*.F*/*.f*/*.G*/*.g*/*.H*/*.h*
     /*.I*/*.i*/*.J*/*.j*/*.K*/*.k*/*.L*/*.l*/*.N*/*.n*/*.O*/*.o*/*.P*/*.p*/*.Q*/*.q*
     /*.R*/*.r*/*.S*/*.s*/*.T*/*.t*/*.U*/*.u*/*.Y*/*.y*/*.V*/*.v*/*.X*/*.x*/*.Z*/*.z*
     /*.1*/*.2*/*.3*/*.4*/*.5*/*.6*/*.7*/*.8*/*.9*/*.0*/*.vob/*.VOB/*.iso/*.ISO/*.nrg
     /*.NRG/*.IFO/*.ifo/*.BUP/*.bup/*.zip/*.ZIP/*.rar/*.RAR/*.TXT/*.txt/*.TAR/*.tar
     /*.EXE/*.exe/*.DLL/*.dll/*.CFG/*.cfg/*.HT*/*.ht*/*.aa*/*.ab*/*.ac*/*.ad*/*.ae*
     /*.af*/*.ag*/*.ah*/*.ai*/*.aj*/*.ak*/*.al*/*.am*/*.an*/*.ao*/*.ap*/*.aq*/*.ar*
     /*.as*/*.at*/*.au*/*.ay*/*.ax*/*.az*/*.wb*/*.wc*/*.wd*/*.we*/*.wf*/*.wg*/*.wh*
     /*.wi*/*.wj*/*.wk*/*.wl*/*.wm*/*.wn*/*.wo*/*.wp*/*.wq*/*.wr*/*.ws*/*.wt*/*.wu*
     /*.wy*/*.wx*/*.wz*/*.wv*/
   delete veto files = yes

Для самбы версии 3 и выше регистр значения не имеет.

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

   hide veto files = yes


ещё пример:

   veto oplock files = /*.xls/*.XLS/*.mdb/*.MDB/*.ldb/*.LDB/
   veto files = /*.avi/*.mp*
 
apache2 + mod_ntlm2 на FreeBSD (1)   Автор: Comatoz  [есть мнение]
 
Прозрачная авторизация пользователя через его доменную учетную запись

Использовавшие источники
   http://www.lissyara.su/?id=1510&commented=1#comment_2138
   http://wiki.bestpractical.com/view/NtlmAuthentication

В портах появился, но не собирается как надо (на 1.10.07 г.), поэтому

   cd /usr/ports/www/mod_ntlm2


Необходимо поправить файл  mod_ntlm.c

   make fetch && make extract


diff mod_ntlm2-0.1/mod_ntlm.c mod_ntlm2-0.1-fixed/mod_ntlm.c
590c590,596
<     apr_pool_sub_make(&sp,p,NULL);
---
>     /*
>      * apr_pool_sub_make(&sp,p,NULL);

>      *
>      * This function call is not longer available with apache 2.2
>      * Try replacing it with apr_pool_create_ex()
>      */
>     apr_pool_create_ex(&sp,p,NULL,NULL);

Теперь собираем и устанавливаем

   make install

Пример настройки /usr/local/etc/apache22/Includes/nagios.conf

...
  ScriptAlias /nagios/cgi-bin/ /usr/local/www/nagios/cgi-bin/
  Alias /nagios/  /usr/local/www/nagios/
  Alias /nagios  /usr/local/www/nagios/


<Location /nagios/cgi-bin>
    AuthType NTLM
    NTLMAuth on
    NTLMAuthoritative on
    NTLMDomain NAME_DOMAIN # ИМЯ домена
    NTLMServer dc1	# имя PDC
    NTLMBackup dc2	# имя BDC
    Require valid-user
</Location>
...

Если обращаться из IE - все работает, IE отдает данные авторизации любому.
Если обращаться из Mozilla Firefox не будет работать -  FF не отдает 
данные авторизации кому попало, сначала надо определить кому можно 
отдавать. Для этого в FF(about:config) в параметре  network.automatic-
ntlm-auth.trusted-uris установить имя сервера которому можно отдавать 
данные авторизации.
 
Создание общедоступного по SMB/CIFS протоколу хранилища файлов (1)   Автор: [обсудить]
 
smb.conf:

   interfaces = lo eth1
   bind interfaces only = true
   ... 
   security = share
   ...
   guest account = nobody
   ...
   [Guest Share]
        comment = Guest access share
        path = /path/to/dir/to/share
        browseable = yes
        read only = yes
        guest ok = yes
 
Авторизация пользователей по доменным группам AD в squid (1)   Автор: Nichls  [есть мнение]
 
В squid.conf

#Здесь описываем внешие ACL
external_acl_type InetGroup-proxy-08-20ww %LOGIN /usr/local/squid/libexec/wbinfo_group.pl
# accesse in internet in work week from 08-00 to 20-00
external_acl_type InetGroup-proxy-08-20aw %LOGIN /usr/local/squid/libexec/wbinfo_group.pl
# accesse in internet in all week from 08-00 to 20-00
external_acl_type InetGroup-proxy-00-24all %LOGIN /usr/local/squid/libexec/wbinfo_group.pl
# accesse in internet in all week from 00-00 to 24-00

# Проверь свои пути
auth_param ntlm children 20
auth_param ntlm program /usr/local/samba/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm max_challenge_reuses 0
auth_param ntlm max_challenge_lifetime 2 minutes

auth_param basic children 20
auth_param basic program /usr/local/samba/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

# Говорим, что нужна авторизация
acl you_domain proxy_auth REQUIRED

# Разграничиваем доступ по времени
acl work-week time MTWHF 08:00-20:00 #  Доступ с 08-00 до 20-00 с понедельника по пятницу
acl all-week time SMTWHFA 08:00-20:00 # Доступ с 08-00 до 20-00 всю неделю
acl all-time time SMTWHFA 00:00-24:00 # Доступ круглосуточно всю неделю

# Осуществляем проверку на принадлежность к нужно группе
acl InetAccess-proxy-08-20ww external InetGroup-proxy-08-20ww proxy-08-20ww
acl InetAccess-proxy-08-20aw external InetGroup-proxy-08-20aw proxy-08-20aw
acl InetAccess-proxy-00-24all external InetGroup-proxy-00-24all proxy-00-24all

# Собираем все в кучу и проверяем на предмет получения дуступа к ИНТЕРНЕТ
http_access allow you_domain work-week InetAccess-proxy-08-20ww
http_access allow you_domain all-week InetAccess-proxy-08-20aw
http_access allow you_domain all-time InetAccess-proxy-00-24all

----------------------

proxy-08-20ww, proxy-08-20aw, proxy-00-24all - Группы в домене. В них заносишь тех юзеров, которым разрешен доступ.

wbinfo_group.pl - Используй именно этот скрипт. В том, что идет в комплекте со squid имеется ошибка.
Здесь она исправлена.

#!/usr/bin/perl -w
#
# external_acl helper to Squid to verify NT Domain group
# membership using /usr/local/samba/bin/wbinfo
#
# This program is put in the public domain by Jerry Murdock
# <jmurdock@itraktech.com>. It is distributed in the hope that it will
# be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Author:
#   Jerry Murdock <jmurdock@itraktech.com>

#
# Version history:
#   2002-07-05 Jerry Murdock <jmurdock@itraktech.com>
#               Initial release
#

# external_acl uses shell style lines in it's protocol
require 'shellwords.pl';

# Disable output buffering
$|=1;

sub debug {
        # Uncomment this to enable debugging
        print STDERR "@_\n";
}

#
# Check if a user belongs to a group
#
sub check {
        local($user, $group) = @_;
        $groupSID = `/usr/local/samba/bin/wbinfo -n "$group"`;
#        chop  $groupSID;
        # because wbinfo -n also returns the group number
        $groupSID = substr($groupSID,0,index($groupSID," ",0));
        $groupGID = `/usr/local/samba/bin/wbinfo -Y "$groupSID"`;
        chop $groupGID;
#       &debug( "User:  -$user-\nGroup: -$group-\nSID:   -$groupSID-\nGID:   -$groupGID-");
        return 'OK' if(`/usr/local/samba/bin/wbinfo -r \Q$user\E` =~ /^$groupGID$/m);
        return 'ERR';
}
#
# Main loop
#
while (<STDIN>) {

        chop;
        &debug ("Got $_ from squid");
        ($user, $group) = &shellwords;
        $ans = &check($user, $group);
        &debug ("Sending $ans to squid");
        print "$ans\n";
}

----------------------------------------------------------------------------------------------------------
smb.conf

[global]
        workgroup = YOU-DOMAIN
        realm = YOU-DOMAIN.RU
        netbios name = demon
        server string =  Proxy Server
        hosts allow = 10. 127.
        winbind separator = \\ # Обрати на это внимание
        winbind use default domain = yes
        winbind uid = 10000-20000
        winbind gid = 10000-20000
        winbind enum users = yes
        winbind enum groups = yes
        template homedir = /home/winnt/%D/%U
        template shell = /usr/local/bin/bash
        max log size = 50
        security = domain
        password server = srv1 srv3
        encrypt passwords = yes

srv1 и srv3 - PRIMARY and BACKUP контроллеры домена

----------------------------------------------------------------------------------------------------------
root@demon#tail -f /usr/local/squid/var/logs/cache.log
Got YOU-DOMAIN\\user1 proxy-08-20ww from squid
Sending ERR to squid
Got YOU-DOMAIN\\user1 proxy-08-20aw from squid
Sending ERR to squid
Got YOU-DOMAIN\\user1 proxy-00-24all from squid
Sending OK to squid
# Тут явно видно, что пользователя user1 нашли в группе proxy-00-24all и squid'у передано OK
Got YOU-DOMAIN\\user2 proxy-08-20ww from squid
Sending OK to squid
Got YOU-DOMAIN\\user3 proxy-08-20ww from squid
Sending OK to squid

root@demon#tail -f /usr/local/squid/var/logs/access.log
1147851551.270     20 10.66.107.56 TCP_IMS_HIT/304 251 GET http://img.mail.ru/mail/ru/css/mail-main1.css YOU-DOMAIN\user1 NONE/- text/css


Небольшое дополнение:

Информация о членстве в группе хранится в кеше squida (по умолчанию) 1 час, а в кеше Winbinda - 300 сек.
 Чтобы не ждать столько времени при перемещении пользователя из одной группы в другую 
советую добавить в squid.conf при описании внешиx ACL опцию ttl,примерно так:

external_acl_type InetGroup-proxy-08-20ww ttl=0 %LOGIN /usr/local/squid/libexec/wbinfo_group.pl

а в smb.conf:

[global]

         winbind cache time = 0
 
Интеграция VPN на базе mpd в Active Directory.   Автор: spherix  [есть мнение]
 
Было дано:
 - Домен на Windows2003 с поднятым Kerberos.
 - FreeBSD на шлюзе, куда должны были подключаться пользователи.
 - VPN-демон mpd.

Задача: заставить mpd брать пароли из домена.

Решение:

 - Ставим третью самбу с поддержкой кербероса.
 - Настраиваем керберос
 - Подсоединяем самбу в домен.
 - Оставляем от нее только winbindd 
 - Ставим freeradius.
 - Сцепляем радиус с самбой.
 - Скручиваем mpd с радиусом и настраиваем сам mpd.

Итог: управляем учетными записями VPN-пользователей через обычные средства AD, 
а не пишем руками данные в файл. 

Примечание1. Документация гласит, что можно связать радиус с керберосом. 
То есть теоретически можно отказаться от самбы. Я так не делал, 
поскольку подцепить через самбу мне лично было проще.

Примечание2. Если использовать poptop, то можно не использовать 
радиус, а использовать ntlm_auth из самбы. Тоже вариант.


Файлы конфигурации: http://www.opennet.ru/base/net/mpd_win2003.txt.html
 
Samba 3 в качестве PDC.   Автор: AlxJoin  [есть мнение]
 
1.Программные пакеты которые пригодятся при установке и настройке PDC.
   samba-client-3.0.23-0.1.14rc2 или любая другая версия не ниже третьей.
   samba-3.0.23-0.1.14rc2 или любая другая версия не ниже третьей.
   webmin-1.270-1 для администрирования через веб-интерфейс.


Пакет Samba последней версии можно скачать с сайта разработчика http://www.samba.org 
и программу для администрирования через веб-интерфейс по адресу http://www.opencountry.com

Для начала устанавливаем Samba и Webmin.

После того как установили Samba нам потребуется отредактировать файл smb.conf 
который находится в директории /etc/samba. 
Пример рабочего файла который можно не править.

# smb.conf is the main Samba configuration file. You find a full commented
# version at /usr/share/doc/packages/samba/examples/smb.conf.SUSE if the
# samba-doc package is installed.
# Date: 2006-05-02
[global]
	workgroup = univer.local
	printing = cups
	printcap name = cups
	printcap cache time = 750
	cups options = raw
	map to guest = Bad User
	include = /etc/samba/dhcp.conf
	logon path = \\%L\profiles\.msprofile
	logon home = \\%L\%U\.9xprofile
	logon drive = P:
	add machine script = /usr/sbin/useradd  -c Machine -d /var/lib/nobody -s /bin/false %m$
	domain logons = Yes
	domain master = Yes
	local master = Yes
	netbios name = netserv1
	os level = 65
	preferred master = Yes
	security = user
	idmap gid = 10000-20000
	idmap uid = 10000-20000
[homes]
	comment = Home Directories
	valid users = %S, %D%w%S
	browseable = No
	read only = No
	inherit acls = Yes
[profiles]
	comment = Network Profiles Service
	path = %H
	read only = No
	store dos attributes = Yes
	create mask = 0600
	directory mask = 0700
[users]

	comment = All users
	path = /home
	read only = No
	inherit acls = Yes
	veto files = /aquota.user/groups/shares/
[groups]
	comment = All groups
	path = /home/groups
	read only = No
	inherit acls = Yes
[printers]
	comment = All Printers
	path = /var/tmp
	printable = Yes
	create mask = 0600
	browseable = No
[print$]
	comment = Printer Drivers
	path = /var/lib/samba/drivers
	write list = @ntadmin root
	force group = ntadmin
	create mask = 0664
	directory mask = 0775
[netlogon]
	comment = Network Logon Service
	path = /var/lib/samba/netlogon
	write list = root

Для того что бы администрировать сервер придется поставить 
программу удаленного администрирования через веб-интерфейс &#8211; Webmin. 
После установки к серверу можно подключится через веб интерфейс по адресу https://localhost:10000 
и там в службах есть настройка SMB-сервера, где можно Linux-пользователей копировать в SMB-пользователей.

 
Сборка Samba с авторизацией в домене 2003 на FreeBSD   Автор: Артём  [есть мнение]
 Решил рассказать про проблемы с которыми я столкнулся при сборке самбы:
  1. В самбе 3.14a наблюдается некорректная запись в логи даже при правильной настройке.
  2. Были проблемы при сборке с heimdal. Команда id не выводила пользователей доменов при правильных конфигах, хотя всё работало.
  3. Чтобы керберос работал по tcp надо писать tcp/имя сервера:порт, а не kdc = tcp/server !
  4. Пока не обновил порты и не пересобрал базу портов ( смотрите статью "хитрости работы с портами") 5 керберос не собирался.
  5. После того как я решил переджойнить машину в домен, билет не хотел обновляться ни в какую. Пришлось ждать 10 часов пока он умрёт. Желающие могут поразвлекаться с утилитой управления билетами, которая входит в 2003 recourse kit и называется kutil.
  6. Решение - сразу обновить порты собирать только новое ! 3.0.22 на данный момент + 5 kerberos . Сразу включать его работу через tcp . После того как всё завелось ничего не переджойнивать и преспокойно раздавать шары.
  7. Без обновлений портов работала связка 3.0.14a + krb4 но ошибка в логи валилась и на живой домен я так и не смог это поднять , только на виртуальной машине.
 
SQUID в сети SAMBA + LDAP, использование групповых ACL   Автор: Афлетдинов Андрей  [есть мнение]
 
Имеем:
   1. Учетные записи пользователей и групп в LDAP
   2. Поднят домен на SAMBA-3.

На стороне сервера SQUID конфигурируем:
   1. /etc/ldap.conf и /etc/nsswith.conf в результате getent passwd и getent group выдает список пользователей и групп

   2. минимальный /etc/smb.conf:
   
      [global]
          workgroup = domain
          netbios name = squid
          load printers = no
          printcap name = /dev/null
          security = domain
          password server = sambaserver
          local master = no
          os level = 33
          domain master = no
          preferred master = no
          wins support = no
          winbind use default domain = yes
          winbind cache time = 1200

   3. Заводим в домен net -Uadministrator join

   4. Запускаем winbind, но при этом в /etc/nsswith.conf его _не_прописываем_


   5. разрешаем чтение pipe winbindd процессу squid любым доступным способом, 
       например: setfacl -g:squid:rx /var/lib/samba/winbindd_privileged

   6. samba в дальнейшем не нужна

   7. далее в squid.conf:

      # стандартные опции авторизации
      auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
      auth_param ntlm children 5
      auth_param ntlm max_challenge_reuses 0
      auth_param ntlm max_challenge_lifetime 2 minutes
      auth_param ntlm use_ntlm_negotiate off
      auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
      auth_param basic children 5
      auth_param basic realm Squid proxy-caching web server
      auth_param basic credentialsttl 2 hours
      auth_param basic casesensitive off

      # авторизация обязательна
      acl NTLMauth proxy_auth REQUIRED

      # определяем типы ACL
      external_acl_type type_ldap_group1 ttl=60 children=1 %LOGIN 
           /usr/lib/squid/   squid_ldap_group.pl -b "cn=group1,ou=group,dc=ldap,dc=local" -H ldaps://ldap.local
      external_acl_type type_ldap_group2 ttl=60 children=1 %LOGIN 
          /usr/lib/squid/squid_ldap_group.pl -b "cn=group2,ou=group,dc=ldap,dc=local" -H ldaps://ldap.local
      external_acl_type type_ldap_group3 ttl=60 children=1 %LOGIN 
          /usr/lib/squid/squid_ldap_group.pl -b "cn=group3,ou=group,dc=ldap,dc=local" -H ldaps://ldap.local


      # и сами ACL
      acl acl_group1 external type_ldap_group1
      acl acl_group2 external type_ldap_group2
      acl acl_group3 external type_ldap_group3

ВСЕ. Дальше с ними можно работать как с обычными ACL, начиная от простого
     http_access allow acl_group1
и заканчивая в вариантах пула и по времени.

При изменении информации в группе LDAP, squid примет изменения только через
время определенное в ttl, таким образом перезапускать его как -kreconfigure нет необходимости, что уже плюс!

Да вот еще, сам скрипт /usr/lib/squid/squid_ldap_group.pl очень прост:

#!/usr/bin/perl
#
# squid ldap group
# mailto:afletdinov\@dc.baikal.ru
#

use Getopt::Long qw(:config no_ignore_case);
use Net::LDAP;
use strict;

# const
my $VERSION = '20051122';

# variables
my $ldap;
my $user;
my $result;
#my $pass;

my $opt_groupdn = '';
my $opt_binddn = '';
my $opt_bindpasswd = '';
my $opt_secretfile = '';
my $opt_uri = '';

GetOptions(
            'b=s' => \$opt_groupdn,
            'D=s' => \$opt_binddn,
            'w=s' => \$opt_bindpasswd,
            'W=s' => \$opt_secretfile,
            'H=s' => \$opt_uri );


# check: requires param
&usage unless($opt_groupdn and $opt_uri);

#connect
$ldap = Net::LDAP->new($opt_uri) or die("connect $opt_uri failed!");

# bind
if($opt_binddn){

    # check: secretfile
    if($opt_secretfile){
        open(FILE, "<$opt_secretfile") or die("error read $opt_secretfile");
        $opt_bindpasswd = <FILE>;
        close(FILE); }

    $result = $ldap->bind($opt_binddn, password=>$opt_bindpasswd);

# anonymous bind
}else{ $result = $ldap->bind(); }

$result->code and die($result->error);

# use buffers off
$| = 1;

# BASIC

    while(<STDIN>){
        chomp;

        # format: user password
        unless(/^(\S+)\s*(\S*)$/){ print "ERR\n"; next; }

        $user = $1;
        #$pass = $2;

        # check: valid group
        $result = $ldap->search(base=>$opt_groupdn, , filter=>"(memberUid=$user)");


        # not found
        unless($result->count){ print "ERR\n"; next; }

        # auth: OK group: OK
        print "OK\n";
    }

exit;

sub usage(){
    print <<EOF;
squid_ldap_group.pl version $VERSION

Usage: squid_ldap_group.pl -b "cn=www-access,ou=group,dc=ldap,dc=local" -H ldaps://ldap.local

        -b GroupBaseDN    (REQUIRED)
        -H LdapURI        (REQUIRED)
        -D BindDN     
        -w BindPasswd
        -W SecretFile

EOF
    exit;

}
 
Работа samba совместно с group policy   Автор: Andrey  [есть мнение]
 Group policy работают по схеме NT4. Для этого необходим poledit.exe winnt.adm common.adm.

Запускаем poledit, загружаем необходимые шаблоны, редактируем default user либо отдельного пользователя, либо группу пользователей потом сохраняем в файл ntconfig.pol

Почти все настройки определены в одном файле 1_ALLinONE.adm Только одно отличие, для win2k и winxp(win2k3) необходимы разные шаблоны. Его можно найти здесь.

Сам файл ntconfig.pol необходимо разместить в параметре самбы netlogon path.

Различия типов операционных систем решается просто через самбу в параметре netlogon path необходимо добавить параметр %a (тип клиентской системы), и в создать папки Win2K WinXP Win2K3, где и будут размещаться необходимый файлы ntconfig.pol

 
Как запустить Samba в jail (FreeBSD)   Автор: TLM  [есть мнение]
 
Мне удалось запустить Samba 3.0.11 в jail на FreeBSD 4.10 только после того, 
как в smb.conf были вписаны следующие строчки:

   interfaces = 192.168.1.123/32
   bind interfaces only = yes
 
Использование smbfs через autofs   Автор: Konstantin  [есть мнение]
 
Пишем скрипт /etc/auto.smbfs примерно такой:
   #!/bin/sh
   a="${1/@//}"
   a="${a//\ /\\ }"
   echo -fstype=smbfs,username=guest,password=fmask=666,iocharset=cp1251,codepage=cp866 :"//$a"


Параметры - по вкусу. automount как-то небрежно относится к пробелам в имени, но так работает.
Ставим на файл бит исполнения:
   chmod +x /etc/auto.smbfs

Далее в /etc/auto.master добавляется строка
   /var/autofs/smb   /etc/auto.smbfs
   где /var/autofs/smb  - точка монтирования.

Стартуем:
   /etc/init.d/autofs restart

Для удобства:
   ln -s /var/autofs/smb /smb

Теперь можно обращатся к шаре "share" на хосте "host" вот так: 

   cd /smb/host@share
по IP тоже работать должно.

Всё написанное верно для дистрибутива debian sarge. Нужны пакеты autofs и smbfs.
Желающие могут расширить фунциональность, прикрутив  к скрипту передачу логина\пароля через путь.
 
Как выключить w2k машину средствами samba (1)   Автор: arruah  [есть мнение]
 
rpcclient -c shutdowninit -U <пользователь с правами администратора%пароль> <ip удаленной машины>
 
шара bin в Samba   Автор: awk  [есть мнение]
 
Если подключиться к шаре bin на сервере samba, и пользователь bin не заведен в smbpasswd, 
то получим доступ к / под freebsd и к /bin под linux. Причем доступ получаем от имени пользователя,
под которым залогонились. Т.е., в большинстве случаев, пользователь может получить доступ, 
как минимум по чтению, даже если шара от него закрыта, используя шару bin.
Решается, путем добавления пользователя bin в smbpasswd или созданием и направлением шары bin на /dev/null
 
Монтирование SMB ресурса в FreeBSD   Автор: Николай Сеньков  [есть мнение]
 
Пересобираем ядро:
  options NETSMB             #SMB/CIFS requester
  options NETSMBCRYPTO  #encrypted password support for SMB
  options LIBMCHAIN     #mbuf management library
  options LIBICONV
  options SMBFS

Коннектимся к удаленному SMB серверу:
   smbutil login //jwarner@smbserver1
Монтируем русурс:
   mount_smbfs -N //jwarner@smbserver1/sharename /backup
Отсоединяемся от SMB сервера:
   smbutil logout //jwarner@smbserver1
 
Символы подстановки переменных в Samba.   Автор: P.Kert  [обсудить]
 
%S Имя текущей службы
%P Корневой каталог текущей службы
%u Пользователь текущей службы
%g Основная группа %u
%U Имя пользователя для сеанса (может отличаться от имени,запрошенного клиентом)
%G Основная группа %U
%H Домашний каталог пользователя
%v Версия Samba
%h Имя хоста, на котором работает Samba
%m NetBIOS-имя компьютера-клиента
%L NetBIOS имя сервера 
%M Имя хоста для компьютера-клиента
%N Имя NIS-сервера домашних каталогов. Значение определяется при помощи файла настройки системы NIS auto map. 
   Если вы скомпилировали Samba  без automount, то значение совпадает с установленным для сервера NetBIOS именем
%p Путь к домашнему каталогу службы. Определяется при помощи файла настройки системы NIS auto map, как %N:%p
%R Выбранный после установления соединения уровень протокола
%d Номер текущего серверного процесса
%a Операционная система клиента (значение может быть неверным)
%I IP-адрес клиентской машины
%T Текущие дата и время
 
Как примонтировать удаленный SMB диск с русскими именами файлов.   Автор: [есть мнение]
 
Получаем список ресурсов:
     smbclient -L 192.168.0.9
Монтируем:
smbmount "//192.168.0.9/DISK (H)" /mnt/0 -o guest,iocharset=koi8-r,codepage=cp866
 
Как сделать Samb'у контроллером домена Windows NT/2000 (1)   Автор: Pasha Kustov  [есть мнение]
 
smb.conf:
  Domain logons=yes
  domain master=yes
  local master=yes
  os level=63
  preferred master=yes
  encrypt passwords=yes
  admin users=root pasha adm
  username map=/etc/samba/users.map
  admin group=@wheel
/etc/samba/users.map:
  root=administrator
# groupadd -d /home/samba -g 6666 SambaComputers
Для каждой машины-члена домена в сети:
# useradd -d /home/samba -u 66?? -g 6666 -s /bin/false ИмяМашины$
Затем:
# smbpasswd -a ИмяМашины$  (с пустым паролем)
 
Как включить поддержку SMBFS в FreeBSD и примонтировать удаленный windows ресурс.   Автор: [есть мнение]
 
пересобираем ядро:
  options NETSMB	      #SMB/CIFS requester
  options NETSMBCRYPTO  #encrypted password support for SMB
  options LIBMCHAIN     #mbuf management library
  options LIBICONV
  options SMBFS
Коннектимся к удаленному SMB серверу:
   smbutil login //jwarner@smbserver1
Монтируем русурс:
   mount_smbfs -N //jwarner@smbserver1/sharename /backup
Отсоединяемся от SMB сервера:

   smbutil logout //jwarner@smbserver1
 
Что можно сделать для увеличения производительности samba ? (1)   Автор: [есть мнение]
 
В smb.conf:
     socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=4096 SO_RCVBUF=4096
     read size = 32768
     read raw = no
     read prediction = true
     write raw = yes
     wide links = no
     oplocks = yes
     max xmit = 65535
     dead time = 15
     getwd cache = yes
     lpq cache = 30
     level2 oplocks = true
Linux:
    echo "100 1000 128 128 500 6000 6000 1884 2" >/proc/sys/vm/bdflush
FreeBSD:
   /sbin/sysctl -w net.local.stream.recvspace=65535
   /sbin/sysctl -w net.local.stream.sendspace=65535
   /sbin/sysctl -w net.inet.tcp.sendspace=65535
   /sbin/sysctl -w net.inet.tcp.recvspace=65535
 
Как запретить запись файлов по определенной маске на Samba сервер   Автор: bass  [есть мнение]
 
   veto files = /*.dll/
   veto files = /*.dll/*.exe/
   veto files = /*Security*/*.tmp/*root*/

 
Как позволить пользователям самим менять samba пароли со своих машин.   Автор: [есть мнение]
 
security = user
encrypt passwords = yes
smb passwd file = /etc/samba/smbpasswd
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = *New*password* %n\n *Please*retype*new*password* %n\n *password*successfully*updated* 

 
Как правильно описать доступ к samba через hosts allow   Автор: [обсудить]
 
hosts allow можно указывать в следующем виде:

    hosts allow = 192.168.1., 127.
    hosts allow = 192.168.1.0, 127.0.0.1/255.255.255.0
    hosts allow = 192.168., EXCEPT 192.168.1.100 
 
Как посмотреть список расшаренных ресурсов на Windows машине   Автор: [обсудить]
 
IP машины - 1.2.3.4
smbclient -I 1.2.3.4 -L NAME_SERVER
или: nmblookup -r -A 1.2.3.4
или: smbclient -N -L hostname -I 1.2.3.4
или скрипт: smbfind или findsmb
 

   Socks proxy

Туннели с использованием SSH. Режим эмуляции Socks proxy в SSH (1) (2)   Автор: Vladimir Brednikov  [есть мнение]
 
1. Режим эмуляции Socks proxy в SSH

Допустим, у нас есть рабочая станция в локальной сети за firewall'ом;
также имеется ssh-доступ на сервер в Интернете. Кроме ssh, никакой связи с внешним миром не имеется, 
а очень хочется, например, подключиться к какому-нибудь jabber-серверу.

На рабочей станции запускаем простую команду:

   ssh -D 5555 user@remotehost -f -N

, где -D 5555 - эмуляция SOCKS сервера через порт 5555 
-f  - работа в фоне, после аутентификации
-N - не запускать shell на удаленном хосте.

Теперь, указав в настройках XMPP-клиента (например, Pidgin'а) в качестве SOCKS5 прокси localhost:5555, 
получим желаемый результат: Pidgin соединяется с сервером через внешний сервер.


2. Туннель ssh

Дано: сервер локальной сети ourproxy.provider.ru, доступный извне.

Требуется: получить из дома доступ к ресурсам внутри локальной сети, например, к интранет-серверу 10.10.5.1:80

Решение: выполнить на домашней машине команду, пробрасывающую туннель к искомому IP-адресу через ourproxy.provider.ru:

    ssh -f -N user@ourproxy.provider.ru -L 8080:10.10.5.1:80

Опция -f говорит ssh, что после соединения нужно уйти в background.
Опция -N указывает, что никаких команд выполнять не нужно
Ключ -L означает, что соединения к localhost на порт 8080 нужно перенаправлять на 80 порт IP-адреса 10.10.5.1

Таким образом, набирая в браузере адрес http://localhost:8080, попадаем на нужный сервер.


3. Обратный туннель ssh


Дано: компьютер на работе, находящийся за firewall'ом и nat'ом; компьютер дома с доступом в интернет; 
сервер ourproxy.provider.ru с работающим sshd, доступный обоим компьютерам. 
Но в данном случае прямой доступ с ourproxy.provider.ru к рабочей машине отсутствует.

Требуется: получить из дома доступ к сервису sshd на рабочем компьютере.

Решение: на рабочей машине выполнить команду:


    ssh -f -N user@ourproxy.provider.ru -R 12345:localhost:22

Опции -f и -N описаны несколькими строчками выше.
Ключ -R означает, что подключения к порту 12345 на ourproxy.provider.ru будут перенаправляться на 22 порт рабочего компьютера.

После выполнения этой команды с рабочей машины можно будет попасть на эту машину с ourproxy.provider.ru, 
выполнив команду:

    ssh -p 12345 user@locahost

По этому же принципу можно получить доступ к прочим ресурсам локальной сети. Вот еще один пример.

На рабочей машине:

    ssh -f -N user@ourproxy.provider.ru -R 8080:10.10.5.1:80

На домашней машине:

    ssh -f -N user@ourproxy.provider.ru -L localhost:8080:localhost:8080

Теперь, набрав в адресной строке браузера на домашнем компьютере http://localhost:8080, 
получаем доступ к интранет-серверу за семью замками двумя firewall-ами.

Конечно же, это приводит к серьёзной бреши в корпоративной безопасности, 
поэтому крайне не рекомендуется злоупотреблять этим советом.

 
Как заставить любую программу работать через HTTP прокси (1)   Автор: zabivator  [есть мнение]
 
Ниже пример как заставить ICQ клиента, например http://kopete.kde.org, работать через HTTP прокси.
Суть метода: icq_client => socks => http_proxy

Ставим пакет dante-client - пользователям debian это сделать можно так:
    sudo apt-get install dante-client

Затем залазим в настройки ( в debian'e - /etc/dante.conf)
В конце файла прописываем:
   route {
      from: 0.0.0.0/0 to: 0.0.0.0/0 via: proxy.testhost.ru port = 3128
      proxyprotocol: http_v1.0
   }


Где proxy.testhost.ru - адрес http прокси, 3128 - порт прокси. П

Дальше запускаем kopete... следующим образом:

   socksify kopete

Пробрасывать весь трафик приложения через socks v.4 или v.5 сервер можно также используя http://tsocks.sourceforge.net/
 
3 шага для перехода на UTF-8 во FreeBSD (1)   Автор: Sokolov Alexey  [есть мнение]
 
1. в ~/.xinitrc пишем (именно сюда а не в /etc/profiles потому как
системная консоль FreeBSD не поддерживает юникод, посему локаль сия
будет использоваться только в иксах):

  export LANG='ru_RU.UTF-8'
  export LC_ALL='ru_RU.UTF-8'

2. выполняем конвертацию содержимого файловой системы из koi8-r в
UTF-8 (необходим порт converters/convmv):

   %convmv -f koi8-r -t UTF-8 путь_к_разделу/* --notest -r


3. далее все зависит от терминала, если у вас что-то вроде
gnome-terminal, то достаточно будет сменить кодировку в опциях на
UTF-8, если же у вас что-то вроде xterm'а, тогда в ~/.Xresources
необходимо будет поменять шрифт, например так (для этого шрифта
необходим пакет x11-fonts/terminus-font):

   XTerm*font: -*-terminus-medium-*-*-*-*-*-*-*-*-iso10646-1

для syscons(4) на i386:

1. ставим sysutils/jfbterm и textproc/uim-m17nlib
2. меняем стандартную переключалку языка с Shift+Space на Ctrl+\
   добавлением в ~/.uim

	(define-key generic-on-key? "<Control>\\")
	(define-key generic-off-key? "<Control>\\")

3. ставим локаль и добавляем запуск uim-fep и jfbterm в ~/.profile
	export LANG=ru_RU.UTF-8
	exec jfbterm -e uim-fep
   или в ~/.login (для tcsh)
	setenv LANG ru_RU.UTF-8
	exec jfbterm -e uim-fep

 
Как заставить приложение работать через Socks или посылать запрос с другого IP   Автор: [обсудить]
 
В комплекте socks сервера dante (http://www.inet.no/dante/) есть скрипт socksify, который позволяет 
прозрачно пробрасывать весь трафик приложения через socks сервер.
Например:

    socksify ssh

Предварительно, в /etc/socks.conf нужно прописать параметры сервера, например:
   route {
           from: 0.0.0.0/0   to: 0.0.0.0/0   via: 192.168.1.1 port = 1080
           protocol: tcp udp
           proxyprotocol: socks_v5
   }

где, 192.168.1.1 - адрес прокси сервера.

Другой вариант socks-враппера - tsocks (http://tsocks.sourceforge.net/)


Для переброса трафика через HTTP прокси (используя метод CONNECT), подходит библиотека libconnect 
(http://libconnect.sourceforge.net/). Пример скрипта:

   #!/bin/sh
   export LD_PRELOAD=/usr/lib/libconnect.so
   прграмма

Адрес прокси прописывается в /etc/libconnect.conf:
   p:192.168.1.1/3128   


Можно использовать враппер из комплекта:
    libconnect telnet 111.222.123.234 23



Для отправки запроса с другого IP, привязанного к сетевому интерфейсу (алиаса), можно использовать libsis
(http://www.palfrader.org/libsis/). Пример:

   #!/bin/sh
   export LD_PRELOAD=/usr/local/lib/libsis.so
   export SIS_SOURCE=192.168.10.99
   программа
 
Как разбалансировать равномерно в Squid трафик между несколькими линками   Автор: [есть мнение]
 
Пример равномерной балансировки по 3 каналам:

# acl rand1 dst 0.0.0.0/0.0.0.192
acl rand2 dst 0.0.0.64/0.0.0.192
acl rand3 dst 0.0.0.128/0.0.0.192
acl rand4 dst 0.0.0.192/0.0.0.192
acl rand5 dst 0.0.0.192/0.0.0.224
# acl rand6 dst 0.0.0.224/0.0.0.224

tcp_outgoing_address 10.1.1.1 rand2
tcp_outgoing_address 10.1.1.1 rand3
tcp_outgoing_address 10.1.1.2 rand4
tcp_outgoing_address 10.1.1.2 rand5
tcp_outgoing_address 10.1.1.3
 
Пример настройки dante socks сервера.   Автор: [есть мнение]
 
/etc/sockd.conf:
# Куда пишем логи.
   logoutput: /var/log/socks/socks.log
# На каком сетевом интерфейсе и порту обслуживаем socks клиентов.
   internal: rl0 port = 1080  # или можно указать IP: internal: 10.1.1.1 port = 1080

# С какого IP или интерфейса выходим во внешний мир.
   external: ed0 # или external: 1.2.3.4
# Используемый метод авторизации клиентов. none - без авторизации.
   method: username none #rfc931
# Разрешаем клиенту 192.168.0.2 выход через socks.
client pass {
       from: 192.168.0.2/32 to: 0.0.0.0/0
       log: connect disconnect iooperation
}
#Пример, как разрешить соединения от сервера.
pass {
        from: 0.0.0.0/0 to: 0.0.0.0/0
        command: connect udpassociate
        log: connect disconnect iooperation
}
# Пример, как запретить соединения от сервера
block {
       from: 0.0.0.0/0 to: 0.0.0.0/0
       log: connect error
}
 
Пример настройки хоста работающего через socks (клиента)   Автор: [обсудить]
 
/etc/socks.conf:
# Запросы к DNS серверу 192.168.1.2 - директом.
route { 
   from: 0.0.0.0/0 to: 192.168.1.2/32 port = domain via: direct

}
# Loopback трафик директом.
route{
   from: 0.0.0.0/0   to: 127.0.0.0/8  via: direct 
}
# Все запросы черех socks сервер 192.168.1.1 порт 1080.
route {
  from: 0.0.0.0/0   to: 0.0.0.0/0   via: 192.168.1.1 port = 1080
  protocol: tcp udp
  proxyprotocol: socks_v4  # Варианты: socks_v5, http_v1.0 - через http прокси, msproxy_v2
  method: none # username - когда нужна авторизация
}
 
Как в dante socks проконтролировать объем прокачиваемого трафика.   Автор: [обсудить]
 
logoutput: /var/log/socks/socks.log
pass {
    ....
   log: connect disconnect iooperation
}
 

   WWW, Apache httpd

Обеспечение работы системы мониторинга Nagios при помощи Nginx (1)   Автор: comatoz  [есть мнение]
 
Web-сервер apache наверное самый лучший web-сервер, но при настройке web-интерфейса для nagios 
можно обойтись и без него, что сейчас и будет описано.

Применительно к FreeBSD:

   portinstall /usr/ports/www/nginx

В /etc/rc.conf.local

   # nginx
   nginx_enable=YES


nginx не может выполнять php и cgi скрипты. Для этого можно использовать backend серверы.

Схема получается следующая:
                                      mini_httpd
                    ---*.cgi--->  192.168.0.200:1081
                   /
      nginx       /                    lighttpd
192.168.0.200:80------*.php--->   192.168.0.200:1082
                  \ 
                   \                    Каталог
                    ---*.html-->  /usr/local/www/...

В этой схеме nginx слущает на порту запросы, производит авторизацию, статические файлы отдает сам, 
cgi-скрипты перенаправляет к запущенному на внутреннем порту 127.0.0.1:1081 
mini_httpd (/usr/ports/www/mini_httpd), который в свою очередь и выполняет эти скрипты.

Схема может показатся сложной, но в моём случае переход на нее оправдался: 
опрос nagios производится 1 раз в минуту из Firefox (спец.плагин), и машина с nagios 
испытывала некоторые трудности с производительностью. После запуска данной схемы 
нагрузка на машину значительно снизилась.

Если используется pnp4nagios (http://www.pnp4nagios.org/pnp/install) для построения графиков 
производительности сервисов, то выполнение php-скриптов возможно с помощью запущенного 
на внутреннем порту 127.0.0.1:1082 lighttpd (/usr/ports/www/lighttpd).

Конфигурационные файлы nginx хранятся по умолчанию в /usr/local/etc/nginx/.

/usr/local/etc/nginx/nginx.conf

   user       www www;
   worker_processes  1;
   error_log  /var/log/nginx/error.log;
   pid        /var/run//nginx.pid;
   worker_rlimit_nofile 8192;


   events {
      worker_connections  4096;
   }

   http {
    include    mime.types;
    include    proxy.conf;
    default_type application/octet-stream;
    log_format   main '$remote_addr - $remote_user [$time_local] $status '
                      '"$request" $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log   /var/log/nginx/access.log  main;
    sendfile     on;
    tcp_nopush   on;
    server_names_hash_bucket_size 128; # this seems to  be required for some vhosts

   ## интранет
  server {
    listen 192.168.0.200:80;
    server_name 192.168.0.200 ns.contora.local;
    access_log /var/log/nginx/access.log;
      include nagios.conf;
      include nagios-pnp.conf;

    location / {
        root                    /usr/local/www/apache22/data/;
    }
    include error-pages.conf;
   }
  }


/usr/local/etc/nginx/nagios.conf


   location /nagios/ {
        auth_basic              "Nagios ";
        auth_basic_user_file    /usr/local/www/nagios/.htpasswd;
        alias                   /usr/local/www/nagios/;
   }


   location /nagios/cgi-bin/ {
        auth_basic              "Nagios ";
        auth_basic_user_file    /usr/local/www/nagios/.htpasswd;

        proxy_pass              http://localhost:1081;
        proxy_redirect          http://localhost:1081/nagios/cgi-bin/ /nagios/cgi-bin/;

        set                     $referer        $http_referer;
        proxy_set_header        Referer         $referer;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        Host            localhost:1081;
        proxy_set_header        REQUEST_METHOD  $request_method;
        proxy_set_header        REMOTE_USER     $remote_user;
        proxy_set_header        REMOTE_ADDR     $remote_addr;
        proxy_set_header        SERVER_NAME     localhost;
        proxy_set_header        SERVER_PORT     1081;
        proxy_set_header        HTTP_COOKIE     $http_cookie;
   }


/usr/local/etc/nginx/nagios-pnp.conf


        location ~* /pnp/.*\.php$ {
            root   /usr/local/share/;
            fastcgi_pass   127.0.0.1:1082;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nagios/share/$fastcgi_script_name;
            include        fastcgi_params;
        }
        location ~* /pnp/ {
                root   /usr/local/nagios/share/;
                index  index.php index.html index.htm;
        }


/usr/local/etc/nginx/error-pages.conf


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
         root   /usr/local/www/nginx-dist;
        }
        error_page   401  /401.html;
        location = /401.html {
          root   /usr/local/www/nginx-dist;
        }
        error_page   404  /404.html;
        location = /404.html {
          root   /usr/local/www/nginx-dist;
        }

Ссылки:
http://sysoev.ru/nginx/
http://www.lighttpd.net/
http://www.acme.com/software/mini_httpd/

http://www.lissyara.su/?id=1532
 
Как в nginx на лету изменить отдаваемый html   Автор: nginx-ru maillist  [обсудить]
 
Модуль ngx_http_sub_module изменяет в ответе одну заданную строку на другую.
http://sysoev.ru/nginx/docs/http/ngx_http_sub_module.html

location / {
    sub_filter        </head>
           '</head><script language="javascript" src="$script"></script>';
    sub_filter_once   on;
}

Модуль ngx_http_addition_module добавляет текст до и после ответа.

http://sysoev.ru/nginx/docs/http/ngx_http_addition_module.html
 
Отключаем избирательно в Apache чувствительность к регистру в URL   Автор: Андрей  [есть мнение]
 
Проверить загрузку модуля в файле конфигурации httpd.conf:

   LoadModule speling_module modules/mod_speling.so

в свойствах домена включаем опцию:

   <Directory ..>
       CheckSpelling on

проверено на RedHat EL5, httpd-2.2.3
 
Запуск Apache с разной конфигурацией в Gentoo Linux (1)   Автор: Eugeny Fomin  [обсудить]
 
Суть проблемы заключалось в том, что надо было запустить несколько вебсерверов с разной конфигурацией, 
например с разными модулями и на разных ip адресах. Для этого не нужно компилировать 
и устанавливать несколько апачей, а достаточно запускать один и тот же установленный в системе, 
со своим конфигурационным файлом.

Решение

Допустим нужно запустить два апача на разных ip, назовем их apache_v1 и apache_v2.
apache_v1 будет висеть на ip 192.168.0.1,
apache_v2 на 192.168.0.2

Будем считать, что установлен Apache2.

   # cp /etc/conf.d/apache2 /etc/conf.d/apache2_apache_v1
   # cp /etc/conf.d/apache2 /etc/conf.d/apache2_apache_v2

   # vi /etc/conf.d/apache2_apache_v1

   Добавляем строку:
      CONFIGFILE=/etc/apache2/httpd_apache_v1.conf

   # vi /etc/conf.d/apache2_apache_v2

   Добавляем строку:
      CONFIGFILE=/etc/apache2/httpd_apache_v2.conf

   # cp /etc/apache2/httpd.conf /etc/apache2/httpd_apache_v1.conf
   # cp /etc/apache2/httpd.conf /etc/apache2/httpd_apache_v2.conf


Правим *.conf фалы по вашему усмотрению.

   # vi /etc/apache2/httpd_apache_v1.conf

   Заменяем директивы на следующие:
      Listen 192.168.0.1:80
      PidFile "/var/run/apache2_apache_v1.pid"

   Аналогично и для apache_v2

   # vi /etc/apache2/httpd_apache_v2.conf
      Listen 192.168.0.2:80
      PidFile "/var/run/apache2_apache_v2.pid"

   # cp /etc/init.d/apache2 /etc/init.d/apache2_apache_v1
   # cp /etc/init.d/apache2 /etc/init.d/apache2_apache_v2


Добавляем их в автозагрузку:

   # rc-update -a apache2_apache_v1 default
   # rc-update -a apache2_apache_v2 default

Запускаем:

   # /etc/init.d/apache2_apache_v1 start
   # /etc/init.d/apache2_apache_v2 start

Материал предоставлен http://www.inode.ru/
 
Скрипт для автосборки Apache, mod_ssl, php5 и mysql   Автор: April  [есть мнение]
 
Простенький скриптик для автосборки Apache 1.3.x + openssl+mod_ssl + php5+mysql 
был написан из-за беспробудной лени автора

Для работы требуются (минимум):
   - FreeBSD 4.8 (проверено) и наверное выше
   - FreeBSD 5.1,5.2.1 (проверено) и наверное выше
   - установленные пакеты
     libxml2-2.6.2_1.tbz
     mm-1.3.0.tbz
     python-2.3.2_3.tbz
     unzip-5.50_2.tbz
     zip-2.3_1.tbz
     и связанные с ними пакеты, возможно для удобства еще надо мс

Кроме того необходимо чтобы версия Apache совпадала с версией mod_ssl

#!/bin/sh
#
#Apache 1.x.y compile!!!
#
#
####################################
# -=April (c)=- ###-=2005=-#
####################################
SRC=`pwd`
DST=/usr/local/server

ln -s $DST  /server
HTTPD_SRC=$SRC/apache
HTTPD_DST=$DST/apache

PHP_SRC=$SRC/php
PHP_DST=$DST/php

MYSQL_DST=$DST/mysql
MYSQL_SRC=$SRC/mysql

OPENSSL_SRC=$SRC/openssl
OPENSSL_DST=$DST/openssl

MODSSL_SRC=$SRC/mod_ssl
MODSSL_DST=$DST/mod_ssl

#prepare configuring APACHE
cd $HTTPD_SRC
./configure --prefix=$HTTPD_DST

prepare configuring MySQL
cd $MYSQL_SRC
./configure --prefix=$MYSQL_DST
make
make install

cd $PHP_SRC
./configure --prefix=$PHP_DST --with-apache=$HTTPD_SRC --with-mysql=$MYSQL_DST \
--enable-force-cgi-redirect --enable-sockets --with-mod_charset --with-xml
make
make install

cd $OPENSSL_SRC
./Configure 
make
make test
make certificate
make install

cp $PHP_SRC/.libs/libphp5.a $HTTPD_SRC/src/modules/php5
cd $MODSSL_SRC
./configure --prefix=$HTTPD_DST --with-apache=$HTTPD_SRC --with-ssl=$OPENSSL_SRC \
--activate-module=src/modules/php5/libphp5.a --enable-module=ssl --server-uid=www --server-gid=www

cd $HTTPD_SRC
#./configure --prefix=$HTTPD_DST  --activate-module=src/modules/php4/libphp4.a --enable-module=ssl \
#--server-uid=www --server-gid=www 

./configure --prefix=$HTTPD_DST  --enable-module=rewrite --enable-shared=rewrite  \
--activate-module=src/modules/php5/libphp5.a  --server-uid=www --server-gid=www 
make 
make certificate TYPE=custom
make install

 
Почему в apache может передаваться битая информация   Автор: [обсудить]
 
Если используется русский apache и после закачки через форму файл приходит битый:

   CharsetRecodeMultipartForms Off

Если пользователь скачивает битый файл (например, rar-архив):
    - Убедитесь, что для типа вашего файла присутствует корректная запись вmime.types;
   - Проверьте, какой тип по умолчанию установлен в httpd.conf, лучше поставить
        DefaultType application/octet-stream

Если PHP скрипт выдает битую информацию:
     См. заметку "В чем может быть причина битых бинарных файлов на выходе PHP"
     http://www.opennet.ruhttp://www.opennet.ru/tips/info/740.shtml
 
Особенности установки Tomcat 5.0 под FreeBSD 5.2   Автор: Александр Елисеенко  [есть мнение]
 
Итак, при построении jdk 1.4.2 из портов необходимо иметь разрешение
эмуляции Linux в ядре и монтированную файловую систему linprocfs.
Для этого в файле /etc/rc.conf необходимо указать
    #  linux_enable="YES"


а в файле /etc/fstab
    #  linprocfs  /compat/linux/proc linprocfs rw 0 0

По завершении установки необходимо установить переменную окружения 
JAVA_HOME, которая указывает на каталог с установленным jdk
Соответственно, в файле .cshrc необходимо добавить
    #  setenv JAVA_HOME /usr/local/jdk1.4.2

а в файле .profile
    #  export JAVA_HOME=/usr/local/jdk1.4.2

Установка Tomcat 5.0 из портов проблем не вызвала, но запуск программы
постоянно срывался. Изучение логов показало, что Tomcat пытался 
работать с протоколом IPv6, который не был установлен в моей системе. 

В соответствии с рекомендацией, данной в логах, делаем запрет на IPv6
    #  sysctl net.inet6.ip6.v6only=0

теперь все работает.

Как вариант, можно внести соответствующие изменения в catalina.sh
и сделать запуск java с ключем -Djava.net.preferIPv4Stack=true,
но через sysctl мне показалось проще.

 
Генерация сертификатов для mod_ssl (1)   Автор: Александр Елисеенко  [есть мнение]
 
В состав дистрибутива openssl входят скрипты CA.sh и CA.pl (/usr/local/openssl/misc)
создаем корневой сертификат
	./CA.sh -newca
генерируем личный ключ и сертификационный запрос сервера
	./CA.sh -newreq
и подписываем его своим корневым сертификатом.
	./CA.sh -sign
переписываем ключ и сертификат сервера в служебный каталог Apache
	cp newreq.pem   /usr/local/etc/apache/sslkey/server.key
	cp newcert.pem  /usr/local/etc/apache/ssl.crt/server.crt
Файл корневого сертификата ./demoCA/cacert.pem необходимо 
распространить по клиентским компьютерам.

 
Почему при использовании mod_bandwidth перестает работать метод POST   Автор: Roman Skopenko  [обсудить]
 
mod_bandwidth должен быть размещен вначале списка AddModule/LoadModule, т.е. до остальных модулей.

Если mod_bandwidth врезается в httpd, то при сборке нужно:
  ./configure --add-module=mod_bandwidth.c --permute-module=BEGIN:bandwidth
 
Как запретить русскому apache перекодировать страницы по Accept-Charset   Автор: [обсудить]
 
По умолчанию русский apache всегда выдает "Vary: accept-charset" и в случае 
получения от пользователя заголовка Accept-Charset перекодирует в указанную в нем кодировку.
Решается проблема добавлением директивы:
   CharsetDisableAcceptCharset On
 
Почему при скачивании по HTTP бинарного файла он скачивается битым.   Автор: [есть мнение]
 
Для файлов неизвестного типа (например, .rar) используется MIME тип определеный через DefaultType, 
как правило это text/plain, который может быть перекодирован russian-apache.
Существует два решения проблемы:
  1. DefaultType application/octet-stream в httpd.conf
  2. Явно определить MIME тип вашего файла в mime.types
 
Редирект незакрытых директорий на имя текущего алиаса виртуального хоста, а не на основной домен.   Автор: uldus  [обсудить]
 
> Как сделать чтобы автоматом перебрасывало http://host1.test.ru/dir на
> http://host1.test.ru/dir/, а не на http://www.test.ru/dir/
UseCanonicalName Off
 
Почему suexec может не работать при запуске Apache в режиме chroot. (1)   Автор: [обсудить]
 
1. В chroot окружении обязательно должен быть /etc/passwd с пользователями для которых используется suexec.
2. Помещена ли в bin директорию программа suexec ?
3. Установлен ли suid root флаг для программы suexec ? (при копировании suid флаг исчезает).
4. Все ли динамические библиотеки присутствуют:
   chroot /hst /usr/local/apache/bin/ldd /usr/local/apache/bin/httpd
   chroot /hst /usr/local/apache/bin/ldd /usr/local/apache/bin/suexec
    предварительно положив ldd в /hst/usr/local/apache/bin/
 
Как организовать показ мини-иконок favicon.ico на своем сайте.   Автор: [есть мнение]
 
1. Добавляем в mime.types в конфигурации Apache строку:
   image/x-icon ico
   (Если не добавить, при использовании Russian Apache иконка
   отображаться не будет !!)
2. Помещаем на html страницу код:
   <link rel="SHORTCUT ICON" href="/favicon.ico"> 
3. Создаем иконку 16x16 в любом графическом редакторе в формате PNG.
4. Выкачиваем конвертер ftp://ftp.kernel.org/pub/software/graphics/pngtoico/ и преобразуем png в ico:
   pngtoico favicon.png > favicon.ico
5. Копируем favicon.ico в корень сайта.

 
Как прописать русский charset в английском Apache   Автор: [обсудить]
 
AddDefaultCharset koi8-r

 
Как назначить cgi-скрипт как парсер файлов в прозрачном режиме   Автор: [обсудить]
 
Напрмер, нужно чтобы все html файлы выдавались при  их запросе после прохождения через 
скрипт-фильтр parser.cgi
В .htaccess:
AddType parsed-html .html
Action parsed-html /cgi-bin/parser.cgi

 
Как изменить expire дату для определенного типа файлов   Автор: [обсудить]
 
В .htaccess пишем:
ExpiresActive On
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresDefault "access plus 1 month"

 
Как посмотреть список текущих активных модулей в Apache   Автор: [обсудить]
 
httpd -l

 
Решение проблемы с постингом русских сообщений в phpBB+PostgreSQL   Автор: frozer  [обсудить]
 
Проблема: при постинге в форму сообщений на русском языки иногда вываливается ошибка скрипта 
   insludes/function_search.php

Решение: 
запустить psql
   >ALTER TABLE phpbb_search_wordlist DROP CONSTRAINT   phpbb_search_wordlist_pkey;
   >CREATE INDEX phpbb_search_wordlist_pkey ON phpbb_search_wordlist (word_text);
 

   Ограничение доступа и ресурсов, безопасность

Увеличение безопасности WordPress на типовом хостинге (1)   Автор: Pentarh Udi  [есть мнение]
 
Небольшой дайджест по обеспечению безопасности WordPress и других PHP OpenSource приложений.
Рассмотрено, что можно сделать на среднестатистическом хостинге.

В общем, safe_mode включать нельзя. Это урежет все до безобразия. Вместо этого мы:

   1. Включим open_basedir
   2. Подтюним некоторые настройки php
   3. Выключим шелл вызовы
   4. Выставим нужные права на директории
   5. Для особых извращенцев, включим mod_security

Так же не стоит брезговать базовыми правилами безопасности WordPress (http://www.awmpage.com/2008/10/bezopasnost-wordpress/).

Включаем open_basedir
---------------------

Тут все просто. Три настройки в виртуалхосте:

   php_admin_value open_basedir "/home/blogs/blog1.foobar.com"
   php_admin_value upload_tmp_dir "/home/blogs/blog1.foobar.com/wp-tmp"
   php_admin_value session.save_path "/home/blogs/blog1.foobar.com/wp-tmp"


Где "/home/blogs/blog1.foobar.com" - корень домена блога. Там необходимо создать директорию 
"wp-tmp", дать ей права 777 и желательно в эту директорию в том же виртуалхосте запретить доступ:

   <Directory /home/blogs/blog1.foobar.com/wp-tmp>
      Order Deny,Allow
      Deny from All
   </Directory>

Мало-ли, может кто то туда сможет чего то записать. И чтобы это что то не было доступно из веба. 
Так же как и ваши сессии. 

Некоторые дополнительные ограничения PHP5
-----------------------------------------

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

   php_admin_flag track_vars on
   php_admin_flag allow_url_fopen  off
   php_admin_flag allow_url_include off
   php_admin_value memory_limit 30M
   php_admin_flag enable_dl off

Думаю, это не все, что можно сделать с настройками - пожелания приветствуются.

Выключаем шелл вызовы
---------------------

open_basedir не распространяется на шелл вызовы php: system,exec,popen,passthru. 
С другой стороны, зачем вордпрессу эти вызовы? Ну вот и отключим их с помощью disable_functions.

   disable_functions="exec,system,passthru,popen"


Далее возникает желание добавить в конфигурацию virtual host такие строки:

   php_admin_value "disable_functions" "exec,system,passthru,popen"

Но это не сработает, т.к. disable_functions работает только когда включен в глобальном php.ini.

Конечно, в phpinfo() вы увидите правильное значение disable_functions, 
однако "отключенные" функции будут продолжать действовать. 
Разработчики объяснили это тем, что отключать функции на уровне конфигурации 
апача очень накладно, гораздо проще выключить их вообще из php.ini

Но с другой стороны, шелл вызовы достаточно часто используются в CLI скриптах, 
в то время как в веб скриптах в большинстве случаев их можно отключить. 
Значит нужно разделить конфиги CLI и Web. В первом конфиге оставить шелл вызовы, 
а во втором, более подверженном хаку, их отключить.

Предположим, что дефолтный конфиг php.ini лежит в /usr/local/lib (стандартное место на FreeBSD). 
Скопируем его в /usr/local/etc/apache2. И на новом месте пропишем нужные disable_functions. 
Далее, в httpd.conf пишем:

   PHPIniDir /usr/local/etc/apache2/conf

И рестартуем апач. Все, теперь CLI и Web версии PHP имеют независимые конфиги и в последнем отключены шелл вызовы.


Выставляем нужные права на директории
-------------------------------------

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

Предполагается, что директории блогов находятся в /home/blogs/{blog}.domain.com

Значит, на директории /home,/home/blogs,/home/blogs/{blog}.domain.com ставим права 711.

На директорию конфигов апача и ниже - так же ставим 711. Все файлы внутри будут иметь аттрибуты 600. 
Все директории и файлы в конфигах апача должны иметь овнера root.

Рекомендуется проделать эти телодвижения со всеми местами, где злоумышленник может найти полные пути к блогам.


Включаем mod_security
---------------------

Это тяжелая артилерия. Для тех, кто не в курсе, mod_security это модуль, 
который мониторит входящие GET/POST/HEAD запросы и исходящие text/* ответы сервера 
на предмет наиболее распространенных атак, инъекций и прочей ереси.

Здесь будет описываться mod_security2 для Apache v2.

Конечно, эта штука немного отяжелит апач, но по опыту скажу, что не фатально и оно того стоит. 
Как ставить mod_security можно узнать в гугле. В простейшем случае на FreeBSD это прекрасно 
ставится из портов. На CentOS mod_security ставится из репозитория http://www.jasonlitka.com/yum-repository/ . 
После прописывания репозитория просто набрать команду

   # yum install mod_security

Сразу скажу, mod_security рубит на корню phpmyadmin. По этому в тех приложениях, 
где mod_security явно вредит, можно его выключить опцией httpd.conf:


   SecRuleEngine Off

Так же mod_security откажется работать без модуля mod_unique_id.

Поговорим о том, как паранойю mod_security сделать здоровой :) Этот модуль хорош, 
когда правильно настроены правила. По умолчанию он идет с параноидальным набором правил. 
Многие из них вообще ни к чему и их можно свободно отключить. 

В файле modsecurity_crs_10_config.conf, думаю, стоит понизить значение SecDebugLogLevel до 0-2.

Следующие файлы с наборами правил стоит вообще либо закомментировать, либо удалить:

   modsecurity_crs_20_protocol_violations.conf
   modsecurity_crs_21_protocol_anomalies.conf
   modsecurity_crs_30_http_policy.conf
   modsecurity_crs_35_bad_robots.conf
   modsecurity_crs_55_marketing.conf

Остальные файлы нужно чуток подредактировать.

modsecurity_crs_40_generic_attacks.conf

Следующие секции я не нашел полезными:

    * Session fixation
    * Coldfusion injection
    * LDAP injection
    * HTTP Response Splitting

modsecurity_crs_45_trojans.conf - тут все впорядке

modsecurity_crs_50_outbound.conf - правила для исходящей информации. 
Я бы здесь оставил только SQL Errors leakage
 
Особенности работы длительно выполняющихся PHP скриптов в Apache (1)   Автор: mysqlperformanceblog.com  [есть мнение]
 Рассмотрим поведение Apache при принудительном закрытии клиентом окна браузера, в котором отображался вывод еще не завершенного PHP скрипта. Например, скрипт зациклился или пользователь устал ждать конца операции.

Особенность в том, что скрипт будет принудительно завершен, только в момент физического вывода данных, т.е. после сброса буфера, например после отправки большого числа данных или вызова функций ob_flush() и flush(). Если вывода данных клиенту не производится или буфер вывода остается несброшенным, то скрипт так и будет выполняться до истечении времени заданного через параметр настройки PHP - max_execution_time. При этом не важно, в какое значение в конфигурации PHP установлен параметр ignore_user_abort.

В качестве обходного пути для прерывания скриптов в течение длительного времени не производящих вывод данных, например, вследствие выполнения длительного SQL запроса, можно использовать расширение pcntl, вызывая функцию pcntl_alarm(таймаут). В отличие от max_execution_time/set_time_limit, определяющих максимальное время утилизации CPU (при выполнении запросов к SQL серверу процессорное время расходуется минимально и скрипт может оставаться висеть днями), функция pcntl_alarm оперирует секундами реального времени.

 
apache2 + mod_ntlm2 на FreeBSD (1)   Автор: Comatoz  [есть мнение]
 
Прозрачная авторизация пользователя через его доменную учетную запись

Использовавшие источники
   http://www.lissyara.su/?id=1510&commented=1#comment_2138
   http://wiki.bestpractical.com/view/NtlmAuthentication


В портах появился, но не собирается как надо (на 1.10.07 г.), поэтому

   cd /usr/ports/www/mod_ntlm2

Необходимо поправить файл  mod_ntlm.c

   make fetch && make extract


diff mod_ntlm2-0.1/mod_ntlm.c mod_ntlm2-0.1-fixed/mod_ntlm.c
590c590,596
<     apr_pool_sub_make(&sp,p,NULL);
---
>     /*

>      * apr_pool_sub_make(&sp,p,NULL);
>      *
>      * This function call is not longer available with apache 2.2
>      * Try replacing it with apr_pool_create_ex()
>      */
>     apr_pool_create_ex(&sp,p,NULL,NULL);

Теперь собираем и устанавливаем

   make install


Пример настройки /usr/local/etc/apache22/Includes/nagios.conf

...
  ScriptAlias /nagios/cgi-bin/ /usr/local/www/nagios/cgi-bin/
  Alias /nagios/  /usr/local/www/nagios/
  Alias /nagios  /usr/local/www/nagios/

<Location /nagios/cgi-bin>
    AuthType NTLM
    NTLMAuth on
    NTLMAuthoritative on
    NTLMDomain NAME_DOMAIN # ИМЯ домена
    NTLMServer dc1	# имя PDC
    NTLMBackup dc2	# имя BDC
    Require valid-user
</Location>
...

Если обращаться из IE - все работает, IE отдает данные авторизации любому.
Если обращаться из Mozilla Firefox не будет работать -  FF не отдает 
данные авторизации кому попало, сначала надо определить кому можно 
отдавать. Для этого в FF(about:config) в параметре  network.automatic-
ntlm-auth.trusted-uris установить имя сервера которому можно отдавать 
данные авторизации.
 
Логгирование POST-запросов в apache (1)   Автор: mahoro  [обсудить]
 В некоторые моменты чувствую себя очень неуютно из-за того, что нет возможности посмотреть, что конкретно делают с моим сервером некоторые персоны. Я долго искал возможность логгировать все, в том числе и POST запросы клиентов и нашел способ - через mod_security.

Устанавливается он элементарно apxs -cia mod_security.c (см документацию, правда, для его работы в наиболее удобном, "Concurrent", режиме логгирования, нужен модуль unique_id. После установи модуля следует добавить следующую секцию в httpd.conf:

   <IfModule mod_security.c>
       SecAuditEngine On

   # У mod_security есть два механизма логгирования, Concurrent - более быстрый и продвинутый.
       SecAuditLogType Concurrent

   # Здесь будет храниться индекс - файл, по структуре похожий на    access_log + идентификаторы, 
   # по которым можно найти полную информацию в StorageDir
       SecAuditLog /var/log/www/audit/index

   # Тут хранятся все данные запросов. Каждый запрос в отдельном файле. 
   # Запросы разнесены по каталогам (вместе все запросы одной транзакции, вместе все транзакции одного дня)
       SecAuditLogStorageDir /var/log/www/audit/data/

   # Наиболее полное логгирование (man)
       SecAuditLogParts ABCDEFGHZ

   # Добавить обработку POST данных. 
       SecFilterScanPOST On
       SecFilterEngine On

   # Следующие строки нужны для сохранения загруженных на сервер файлов:
       SecUploadDir /var/log/www/audit/upload
       SecUploadKeepFiles On

   </IfModule>

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

p.s. Работоспособность конфига проверялась в apache 1.3.37, mod_security 1.9.4, но работать должно и в 2.0/2.0

 
Ограничение трафика для виртуального хоста в apache (1)   Автор: [есть мнение]
 Нижеприведенные настройки ограничат скорость для виртуального хоста в 1024kbps, с возможностью обслуживания не больше 10 запросов в секунду и максимумом в 30 открытых коннектов. Каждый посетитель может установить не больше трех одновременных соединений и получить данные на скорости не выше 20kb/s . Кроме того, виртуальный хост может за 4 недели израсходовать не более 100 Мб трафика, если лимит будет превышен скорость будет ограничена в 128kbps.

<VirtualHost 1.2.3.4>
  ServerName www.example.com
  ServerAdmin webmaster@example.com
  DocumentRoot /var/www
  CBandLimit 100M
  CBandExceededSpeed 128 5 15
  CBandSpeed 1024 10 30
  CBandRemoteSpeed 20kb/s 3 3
  CBandScoreboard /var/www/scoreboard
  CBandPeriod 4W
</VirtualHost>

 
Как совместить использование SuPHP и mod_php в одном apache (1)   Автор: pookey.co.uk  [обсудить]
 
По умолчанию будет использоваться SuPHP.
В httpd.conf:
   LoadModule suphp_module        modules/mod_suphp.so
   LoadModule php4_module         modules/libphp4.so
   AddType application/x-httpd-php .php
   AddType application/x-httpd-php-source .phps
   AddHandler x-httpd-php .php
   suPHP_Engine on
   php_admin_flag engine off


Для избранных хостов активируем mod_php:

   <VirtualHost ..>
     suPHP_Engine off
     RemoveHandler .php
     php_admin_flag engine on
     ...
  </VirtualHost>
 
Авторизация в Apache2 из стандартной группы LDAP   Автор: Андрей  [обсудить]
 
Авторизация в Apache2 из стандартной группы Ldap (objectClass=posixGroup)

В .htaccess прописать параметры модуля mod_auth_ldap
   AuthType Basic
   AuthName "For Administrators only!"
   AuthLDAPURL ldap://ldap.local/dc=local
   AuthLDAPRemoteUserIsDN off
   AuthLDAPGroupAttribute memberUid
   AuthLDAPGroupAttributeIsDN off
   require group cn=admins_group,ou=group,dc=local

Для поддержки протокола ldaps:// необходимо в файле
/etc/httpd/conf.d/ldap.conf определить параметры:
   LDAPTrustedCA /etc/pki/tls/certs/ca.cert
   LDAPTrustedCAType  BASE64_FILE


ca.cert это публичный сертификат которым подписан сертификат сервиса ldaps.
 
Как ограничить в Apache объем данных передаваемых в POST запросе. (1)   Автор: [обсудить]
 
В .htaccess или в файле конфигурации:
  LimitRequestBody 50000
 
Как изменить строку идентифицирующую версию Apache и некоторые модули.   Автор: [обсудить]
 
Директива ServerTokens устанавливает формат вывода информации в поле Server:
ServerTokens Minimal
#    Server: Apache/1.3.0
ServerTokens ProductOnly
#    Server: Apache
ServerTokens OS
#    Server: Apache/1.3.0 (Unix)
ServerTokens Full
#    Server: Apache/1.3.0 (Unix) PHP/3.0
 
Как ограничить число соединений от одного IP в Apache   Автор: [обсудить]
 
Устанавливаем модуль mod_limitipconn и изменяем httpd.conf:
ExtendedStatus On
<Directory />
...
    MaxConnPerIP 10
</Directory>
 
Как максимально ограничить пользовательские PHP скрипты.   Автор: [обсудить]
 
В httpd.conf в блок конфигурации каждого виртуального хоста добавляем:
  php_admin_flag engine on
  php_admin_flag expose_php off
  php_admin_flag safe_mode on
  php_admin_flag track_vars on
  php_admin_flag allow_url_fopen  off
  php_admin_flag magic_quotes_runtime on
  php_admin_value doc_root /home/user/htdocs
  php_admin_value open_basedir /home/user/htdocs
  php_admin_value safe_mode_exec_dir /home/user/bin
  php_admin_value safe_mode_protected_env_vars  LD_LIBRARY_PATH
  php_admin_value safe_mode_allowed_env_vars PHP_
  php_admin_value upload_tmp_dir /home/user/htdocs/tmp
  php_admin_value upload_max_filesize 1024000
  php_admin_value max_execution_time 10
  php_admin_value post_max_size  1M
  php_admin_value memory_limit 8M
  php_admin_flag mysql.allow_persistent  off
  php_admin_value mysql.max_links  5
  php_admin_flag pgsql.allow_persistent  off
  php_admin_value pgsql.max_links  5
  # в php.ini disable_functions = 
 
Как ограничить размер памяти и CPU для CGI в Apache   Автор: [обсудить]
 
Ограничим память в 32 Мб, процессорное время 30 сек., одновременно может быть запущено не более 60 пользовательских CGI скриптов.
В <VirtualHost ...>:
RLimitMEM   32000000 32000000
RLimitCPU   10       30
RLimitNPROC 60       60
 
Как преодолеть барьер в 256 одновременных соединений в Apache   Автор: [обсудить]
 
Пересоберите apache изменив в httpd.h константу HARD_SERVER_LIMIT с 256
на большее число.
 
Как ограничить доступ к определенному файлу.   Автор: [обсудить]
 
Запретим доступ к .txt файлам:
<Files ~ "\.txt">
    Order allow,deny
    Deny from all
</Files>

Доступа к .cgi и только с IP 1.2.3.4 через пароль, остальным нет доступа.
<Files ~ "\.cgi">
    Order allow,deny
    Allow from 123.123.123.123
    AuthType Basic
    AuthName "ENTER PASSWORD"
    AuthUserFile /home/user/.htpasswd
    <Limit GET POST PUT>
        require valid-user
    </Limit>
    Deny from all
</Files>
 
Как ограничить доступ к директории только для определенных IP   Автор: [обсудить]
 
В .htaccess:
order allow,deny
allow from 10.0.0.0/24 176.1.2.3 194.67.48.0/24 
 
Как организовать парольный доступ к директории   Автор: [есть мнение]
 
в .htaccess:
        AuthType Basic
        AuthName "Private block"
        AuthUserFile путь к файлу с паролями
        require valid-user

или require user user1 user2...
Создать файл паролей: htpasswd -c .passwd user
добавить нового пользователя: htpasswd .passwd user
 

   Оптимизация и тюнинг Apache

Отдача статического web-контента через khttpd в Linux ядре (1)   Автор: David A. Bandel  [есть мнение]
 
Apache, который будет обрабатывать динамический контент, 
должен принимать соединения на 127.0.0.1:8080.

Скрипт для запуска khttpd:

   #!/bin/sh
   modprobe khttpd
   echo 8080 > /proc/sys/net/khttpd/clientport
   echo /home/httpd/html > /proc/sys/net/khttpd/documentroot
   echo phtml > /proc/sys/net/khttpd/dynamic
   echo inc > /proc/sys/net/khttpd/dynamic
   echo shtml > /proc/sys/net/khttpd/dynamic
   echo php3 > /proc/sys/net/khttpd/dynamic
   echo phps > /proc/sys/net/khttpd/dynamic
   echo php > /proc/sys/net/khttpd/dynamic
   echo cgi > /proc/sys/net/khttpd/dynamic
   echo pl > /proc/sys/net/khttpd/dynamic
   echo 1 > /proc/sys/net/khttpd/logging
   echo 1 > /proc/sys/net/khttpd/threads
   echo 80 > /proc/sys/net/khttpd/serverport
   echo 1 > /proc/sys/net/khttpd/start

 
Как уменьшить число apache httpd процессов и снизить затраты памяти. (1)   Автор: [есть мнение]
 
- В FreeBSD использование "accept filter" (нет реакции от accept() пока не поступят первые данные запроса):
      - ядро собираем с "options ACCEPT_FILTER_HTTP" или "options ACCEPT_FILTER_DATA" 
        или kldload accf_http/accf_data 
        или accf_data_load="YES" / accf_http_load="YES в /boot/loader.conf
      - в конфигурацию Apache добавляем "AcceptFilter on"

- Значительное уменьшение величины keepalive, или вообще его запрещение (KeepAlive Off);

- Использовать mod_accell или squid в режиме акселератора для кэширования.
 
Как заставить Apache закачать наиболее часто используемые файлы в память и отдавать клиентам из памяти, а не с диска ? (1)   Автор: [обсудить]
 
Используйте для статических файлов mod_mmap_static:
  MMapFile файл1 файл2 ....
 
Каким web-сервером лучше раздавать большие объемы статического контента.   Автор: [есть мнение]
 
thttpd  - нет keep-alive, при нагрузке достаточно большие задержки между запросом и отдачей.
mathoptd - отличная производительность, небольшие запросы к ОЗУ, загрузка CPU примерно на 30%
 выше чем при аналогичной нагрузке на сервер при использовании thttpd.
TUX и khttpd - эксперементальный код, замечательная производительность за счет выноса в linux ядро процедур отдачи статики.
 
Web сервер перегружен, денег на апгрейд нет, как увеличить производительность с наименьшими потерями ? (1)   Автор: [обсудить]
 
Если тяжелый апач и много соединений, контент долго генерируется, но может кэшироваться, или наличие большого 
процента "медленных клиентов" - то значительного прироста производительности можно достигнуть используя mod_accel. 
Если в CGI скриптах используются SQL запросы: оптимизация базы, оптимизация запросов (EXPLAIN для pgsql), 
использование индексов, частые vacuum для pgsql и прежде всего кэширование типовых запросов.
Если просто запускается много мелких скриптов: mod_perl или fast_cgi.
Плюс, вынесение из apache лишних модулей, отдельный web-сервер для раздачи статики и картинок.
 

   Редирект, mod_rewrite

Пример привязки к географическому положению посетителя в nginx (1)   Автор: alexkbs  [есть мнение]
 
Для начала, следует прочитать о директивах модуля ngx_http_geo_module:

http://sysoev.ru/nginx/docs/http/ngx_http_geo_module.html

Во вторую очередь нам нужно получить список сетей в нужном формате.
Так как мне нужно отделить только российские IP, у меня делается так:

   curl -f -o - http://noc.masterhost.ru/allrunet/runet \
   http://noc.zenon.net/nets/current | grep -v "0.0.0.0/0" | \
   grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\/[0-9]\+" | \
   sort | uniq | sed 's/$/ ru;/' > /etc/nginx/rugeo.conf; 

   /etc/init.d/nginx reload



Одно из условий - пользователи из любых стран с установленной cookie ALLOWIMAGES 
не должны подвергаться дискриминации по географическому признаку. 

Соответственно составляем файл конфигурации nginx.

Определяем страну (в контексте http):

   geo  $country  {
	default          en;
	include          /etc/nginx/rugeo.conf;
   }


В блоке конфигурации интересующего нас server пишем:

   location = /spacer.gif {
        empty_gif;
   }

   location ~* \.(jpg|jpeg|gif|png)$ {
	set  $allow_images  1;

	if ($country = 'en') {
		set  $allow_images  0;
	}


	if ($http_cookie ~* ALLOWIMAGES) {
		set  $allow_images  1;
	}

	if ($allow_images != 1) {
		rewrite  ^/images/.*$ /spacer.gif break;
	}
	
        expires         7d;
        root /home/www/htdocs;
        if (!-f $request_filename) {
                proxy_pass        http://backend;
        }
   }


Таким образом всем посторонним иностранцам вместо фотографий будет видна пустота, 
а всем своим фотографии будут видны откуда бы они не заходили.



Для ситуаций, когда блокировка обусловлена экономией трафика, http://sergeyx.livejournal.com/ в комментарии 
советует использовать бесплатную сеть доставки контента CoralCDN (http://www.coralcdn.org):

Руководство по настройке: http://wiki.coralcdn.org/wiki.php?n=Main.Servers

Например, запросив http://www.test.ru.nyud.net:8080/img/test.gif сеть CoralCDN выступит 
в роли кэшируюшего прокси для доставки нужного файла.

Пример для организации отдачи трафика через CoralCDN для посетителей с некорректным referer:

   location /i/ {
      ...
      # Избегаем зацикливания для запросов от CoralCDN
      if ($http_user_agent ~ CoralWebPrx) {
         break;
      }
      if ($query_string ~ coral-no-serve) {
         break;
      }
      # Перенаправляем запросы только на существующие файлы
      if (!-f $request_filename) {
         break;
      }
      # Для посетителей с некорректным referer делаем редирект в CoralCDN
      # корректность определяем через встроенную переменную nginx $invalid_referer
      # вместо SITE нужно подставить имя хоста.
      if ($invalid_referer) {
         rewrite ^(.+)$ http://SITE.nyud.net$1;
      }
      ...
   }


Пример для Apache с mod_rewrite:

   RewriteEngine on
   RewriteCond %{HTTP_USER_AGENT} !^CoralWebPrx
   RewriteCond %{QUERY_STRING} !(^|&)coral-no-serve$
   RewriteRule ^/images/foo(.*)$  http://foo.bar.nyud.net:8080/images/foo$1 [R,L]

или можно сразу подставить HTTP_HOST
   RewriteRule ^/images/foo(.*)$ http://%{HTTP_HOST}.nyud.net:8080/images/foo$1 [R,L]
 
Замена содержимого отдаваемых Apache2 документов, по заданной маске (1)   Автор: [есть мнение]
 
Для автоматической замены, при отдаче html страниц, одного блока на другой
можно использовать mod_substitute (http://httpd.apache.org/docs/2.2/mod/mod_substitute.html).
Маска замены задается в виде регулярного выражения.  

Примеры:

   <Location /private>
       AddOutputFilterByType SUBSTITUTE text/html
       Substitute s/SECRET/XXXXX/ni
   </Location>


   <Location />
       AddOutputFilterByType SUBSTITUTE text/html
       Substitute s/foo/bar/ni
   </Location>

   <Location />
       AddOutputFilterByType SUBSTITUTE text/html
       Substitute "s|<BR */?>|<br />|i"
   </Location>


Опции:
  i - совпадение без учета регистра;
  n - строчное совпадение, без использования регулярных выражений;
  f - позволяет результаты текущей замены использовать в других заменах,
      заданных в других mod_substitute правилах.
 
Блокирование автоматических качалок через mod_rewrite (1)   Автор: [есть мнение]
 
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [OR]
RewriteCond %{HTTP_USER_AGENT} ^Bot\ mailto:craftbot@yahoo.com [OR]
RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [OR]
RewriteCond %{HTTP_USER_AGENT} ^Custo [OR]
RewriteCond %{HTTP_USER_AGENT} ^DISCo [OR]
RewriteCond %{HTTP_USER_AGENT} ^Download\ Demon [OR]
RewriteCond %{HTTP_USER_AGENT} ^eCatch [OR]
RewriteCond %{HTTP_USER_AGENT} ^EirGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [OR]
RewriteCond %{HTTP_USER_AGENT} ^Express\ WebPictures [OR]
RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [OR]
RewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [OR]
RewriteCond %{HTTP_USER_AGENT} ^FlashGet [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetRight [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [OR]
RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [OR]
RewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [OR]
RewriteCond %{HTTP_USER_AGENT} ^GrabNet [OR]
RewriteCond %{HTTP_USER_AGENT} ^Grafula [OR]
RewriteCond %{HTTP_USER_AGENT} ^HMView [OR]
RewriteCond %{HTTP_USER_AGENT} HTTrack [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Stripper [OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} Indy\ Library [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^InterGET [OR]
RewriteCond %{HTTP_USER_AGENT} ^Internet\ Ninja [OR]
RewriteCond %{HTTP_USER_AGENT} ^JetCar [OR]
RewriteCond %{HTTP_USER_AGENT} ^JOC\ Web\ Spider [OR]
RewriteCond %{HTTP_USER_AGENT} ^larbin [OR]
RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mass\ Downloader [OR]
RewriteCond %{HTTP_USER_AGENT} ^MIDown\ tool [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mister\ PiX [OR]
RewriteCond %{HTTP_USER_AGENT} ^Navroad [OR]
RewriteCond %{HTTP_USER_AGENT} ^NearSite [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetAnts [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Octopus [OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Explorer [OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Navigator [OR]
RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ^Papa\ Foto [OR]
RewriteCond %{HTTP_USER_AGENT} ^pavuk [OR]
RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [OR]
RewriteCond %{HTTP_USER_AGENT} ^RealDownload [OR]
RewriteCond %{HTTP_USER_AGENT} ^ReGet [OR]
RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [OR]
RewriteCond %{HTTP_USER_AGENT} ^SmartDownload [OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperBot [OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Surfbot [OR]
RewriteCond %{HTTP_USER_AGENT} ^tAkeOut [OR]
RewriteCond %{HTTP_USER_AGENT} ^Teleport\ Pro [OR]
RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Image\ Collector [OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebAuto [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebCopier [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebFetch [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebGo\ IS [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebReaper [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebSauger [OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ eXtractor [OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ Quester [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebStripper [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Wget [OR]
RewriteCond %{HTTP_USER_AGENT} ^Widow [OR]
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule ^.* - [F,L]

Дополнительный список:

RewriteCond %{HTTP_USER_AGENT} Accelerator [OR]
RewriteCond %{HTTP_USER_AGENT} Ants [OR]
RewriteCond %{HTTP_USER_AGENT} attach [OR]
RewriteCond %{HTTP_USER_AGENT} BackWeb [OR]
RewriteCond %{HTTP_USER_AGENT} Teleport.*Pro [OR]
RewriteCond %{HTTP_USER_AGENT} Bandit [OR]
RewriteCond %{HTTP_USER_AGENT} Buddy [OR]
RewriteCond %{HTTP_USER_AGENT} Collector [OR]
RewriteCond %{HTTP_USER_AGENT} Copier [OR]
RewriteCond %{HTTP_USER_AGENT} Downloader [OR]
RewriteCond %{HTTP_USER_AGENT} Drip [OR]
RewriteCond %{HTTP_USER_AGENT} eCatch [OR]
RewriteCond %{HTTP_USER_AGENT} EirGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ExtractorPro [OR]
RewriteCond %{HTTP_USER_AGENT} EyeNetIE [OR]
RewriteCond %{HTTP_USER_AGENT} FileHound [OR]
RewriteCond %{HTTP_USER_AGENT} FlashGet [OR]
RewriteCond %{HTTP_USER_AGENT} GetRight [OR]
RewriteCond %{HTTP_USER_AGENT} Gets [OR]
RewriteCond %{HTTP_USER_AGENT} Go-Ahead-Got-It [OR]
RewriteCond %{HTTP_USER_AGENT} gotit [OR]
RewriteCond %{HTTP_USER_AGENT} Go!Zilla [OR]
RewriteCond %{HTTP_USER_AGENT} GoZilla [OR]
RewriteCond %{HTTP_USER_AGENT} Grabber [OR]
RewriteCond %{HTTP_USER_AGENT} GrabNet [OR]
RewriteCond %{HTTP_USER_AGENT} Grab.*Site [OR]
RewriteCond %{HTTP_USER_AGENT} Grafula [OR]
RewriteCond %{HTTP_USER_AGENT} Gulliver [OR]
RewriteCond %{HTTP_USER_AGENT} HMView [OR]
RewriteCond %{HTTP_USER_AGENT} HTTrack [OR]
RewriteCond %{HTTP_USER_AGENT} IBrowse [OR]
RewriteCond %{HTTP_USER_AGENT} InterGET [OR]
RewriteCond %{HTTP_USER_AGENT} Internet.*Ninja [OR]
RewriteCond %{HTTP_USER_AGENT} Iria [OR]
RewriteCond %{HTTP_USER_AGENT} jetcar [NC,OR]
RewriteCond %{HTTP_USER_AGENT} JOC [OR]
RewriteCond %{HTTP_USER_AGENT} JustView [OR]
RewriteCond %{HTTP_USER_AGENT} leach [OR]
RewriteCond %{HTTP_USER_AGENT} leech [OR]
RewriteCond %{HTTP_USER_AGENT} lftp [OR]
RewriteCond %{HTTP_USER_AGENT} likse [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Magnet [OR]
RewriteCond %{HTTP_USER_AGENT} Mag-Net [OR]
RewriteCond %{HTTP_USER_AGENT} Memo [OR]
RewriteCond %{HTTP_USER_AGENT} MIDown.*tool [OR]
RewriteCond %{HTTP_USER_AGENT} Mirror [OR]
RewriteCond %{HTTP_USER_AGENT} Mister.*PiX [OR]
RewriteCond %{HTTP_USER_AGENT} Navroad [OR]
RewriteCond %{HTTP_USER_AGENT} NearSite [OR]
RewriteCond %{HTTP_USER_AGENT} Net.*Reaper [OR]
RewriteCond %{HTTP_USER_AGENT} NetSpider [OR]
RewriteCond %{HTTP_USER_AGENT} Net.*Vampire [OR]
RewriteCond %{HTTP_USER_AGENT} NetZip [OR]
RewriteCond %{HTTP_USER_AGENT} Ninja [OR]
RewriteCond %{HTTP_USER_AGENT} Octopus [OR]
RewriteCond %{HTTP_USER_AGENT} Offline.*Explorer [OR]
RewriteCond %{HTTP_USER_AGENT} Offline [OR]
RewriteCond %{HTTP_USER_AGENT} PageGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} Page.*Saver [OR]
RewriteCond %{HTTP_USER_AGENT} Papa.*Foto [OR]
RewriteCond %{HTTP_USER_AGENT} pcBrowser [OR]
RewriteCond %{HTTP_USER_AGENT} Pita [OR]
RewriteCond %{HTTP_USER_AGENT} Pockey [OR]
RewriteCond %{HTTP_USER_AGENT} Pump [OR]
RewriteCond %{HTTP_USER_AGENT} Reaper [OR]
RewriteCond %{HTTP_USER_AGENT} Recorder [OR]
RewriteCond %{HTTP_USER_AGENT} ReGet [OR]
RewriteCond %{HTTP_USER_AGENT} Siphon [OR]
RewriteCond %{HTTP_USER_AGENT} SmartDownload [OR]
RewriteCond %{HTTP_USER_AGENT} Snagger [OR]
RewriteCond %{HTTP_USER_AGENT} Snake [OR]
RewriteCond %{HTTP_USER_AGENT} Stripper [OR]
RewriteCond %{HTTP_USER_AGENT} Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} SuperBot [OR]
RewriteCond %{HTTP_USER_AGENT} SuperHTTP [OR]
RewriteCond %{HTTP_USER_AGENT} Surfbot [OR]
RewriteCond %{HTTP_USER_AGENT} tAkeOut [OR]
RewriteCond %{HTTP_USER_AGENT} Triton [OR]
RewriteCond %{HTTP_USER_AGENT} Vacuum [OR]
RewriteCond %{HTTP_USER_AGENT} Weazel [OR]
RewriteCond %{HTTP_USER_AGENT} WebAuto [OR]
RewriteCond %{HTTP_USER_AGENT} WebCapture [OR]
RewriteCond %{HTTP_USER_AGENT} WebCopier [OR]
RewriteCond %{HTTP_USER_AGENT} WebFetch [OR]
RewriteCond %{HTTP_USER_AGENT} Web.*Image.*Collector [OR]
RewriteCond %{HTTP_USER_AGENT} WebMirror [OR]
RewriteCond %{HTTP_USER_AGENT} WebReaper [OR]
RewriteCond %{HTTP_USER_AGENT} WebRecorder [OR]
RewriteCond %{HTTP_USER_AGENT} WebSauger [OR]
RewriteCond %{HTTP_USER_AGENT} WebSite.*Extractor [OR]
RewriteCond %{HTTP_USER_AGENT} Website.*Quester [OR]
RewriteCond %{HTTP_USER_AGENT} Web.*Spy [OR]
RewriteCond %{HTTP_USER_AGENT} WebSpy [OR]
RewriteCond %{HTTP_USER_AGENT} Webster [OR]
RewriteCond %{HTTP_USER_AGENT} WebStripper [OR]
RewriteCond %{HTTP_USER_AGENT} Web.*Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} WebWhacker [OR]
RewriteCond %{HTTP_USER_AGENT} WebZIP [OR]
RewriteCond %{HTTP_USER_AGENT} Whacker [OR]
RewriteCond %{HTTP_USER_AGENT} Widow [OR]
RewriteCond %{HTTP_USER_AGENT} SpaceBison [OR]
RewriteCond %{HTTP_USER_AGENT} www\.asona\.org
RewriteRule .* - [F,L]
 
Как в Apache использовать скрипт для обработки части пути (1)   Автор: Rodriges  [обсудить]
 
Есть скрипт http://domain.ru/art, для того чтобы запрос http://domain.ru/art/something 
не вызывал ошибки и приводил к запуску этого скрипта в настройках Apache 2 нужно прописать:
  <FilesMatch "^art">

     AcceptPathInfo On
  </Files> 

Для Apache 1.3, можно воспользоваться 
   ErrorDocument 404 /cgi-bin/art.cgi

Или
   <Location /art>
     SetHandler cgi-script
   </Location>


Или
   RewriteEngine on
   RewriteRule ^/art/(.*)$ /home/user/cgi-bin/art.cgi?$1 [T=application/x-httpd-cgi,L]
 
Как более эффективно блокировать несколько IP в apache (1)   Автор: [есть мнение]
 
При наличии IP в blacklist.txt, посетителю показывается sorry.html:

   RewriteEngine on
   Rewritemap ipmap txt:/path/to/blacklist.txt 

   RewriteCond ${ipmap:%{REMOTE_ADDR}} =b
   RewriteCond %{request_uri} !=/sorry.html
   RewriteCond %{request_uri} !=/stylesheet.css
   RewriteRule .* /sorry.html                        [R,L]


/path/to/blacklist.txt
   11.22.33.44  b
   22.33.44.55  b
   33.44.55.66  b

 
Пример mod_rewrite редиректа при условии наличия файла   Автор: [обсудить]
 
Существует множество файлов вида http://www.host.ru/test/dirN/M.html и http://www.host.ru/test/dirN/new/M.html (N=1,2..., M=1,2..)
Необходимо, если установлена cookie shownew=on и присутствует файл /test/dirN/new/M.html прозрачно отображать 
его содержимое,  а не файла /test/dirN/M.html, который показываем если /test/dirN/new/M.html отсутствует.


   RewriteEngine on
   RewriteCond %{HTTP_COOKIE} ^.*shownew=on.*$
   RewriteCond %{REQUEST_URI} ^/test/([a-z]+[0-9]+)/([0-9]+\.html)$
   RewriteCond /home/host/htdocs/test/%1/new/%2 -f
   RewriteRule ^/test/([a-z]+[0-9]+)/([0-9]+\.html)$ /home/host/htdocs/test/$1/new/$2 [L]
 
Как в mod_rewrite организовать прозрачный переброс на CGI скрипт   Автор: [обсудить]
 
Вместо test.shtml?parm=N выдаем результат работы /cgi-bin/test.cgi?param=1

    RewriteCond %{REQUEST_URI} /test.shtml
    RewriteCond %{QUERY_STRING} param=[0-9]+
    RewriteRule ^(.+) $1/%{QUERY_STRING}  [C]
    RewriteRule ^/test.shtml/param=([0-9]+) /home/user/cgi-bin/test.cgi?param=$1 [T=application/x-httpd-cgi,L]
 
Можно ли произвести редирект на другую страницу без использования mod_rewrite   Автор: [есть мнение]
 
Можно воспользоваться директивой Redirect из mod_alias:
   Redirect /dir1 http://test.ru/dir2
   Redirect permanent /dir1/ http://test.ru/dir2
   RedirectMatch  ^/$ http://test.ru/new.html
   RedirectMatch  .* http://test.ru/new.html

   RedirectMatch (.*)\.gif$ http://test.ru$1.jpg
  AliasMatch ^/img/(.*) /home/user1/img/$1
 
Как разрешить скачивать картинки с текущего сайта и запретить выкачивание через чужие линки.   Автор: uldus  [есть мнение]
 
RewriteEngine On
RewriteCond %{REQUEST_URI} /img/ 
RewriteCond %{HTTP_REFERER} !^.*somedom\.ru.* [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .* /empty.gif [L]
 
Выдача страницы в Apache в зависимости от языка   Автор: Belousov Oleg  [есть мнение]
 
есть диры:
sub_host1/ru
sub_host1/en
sub_host2/ru
sub_host2/en
при обращении к www.somehost.ru/sub_host1 (и 2) должнен быть переход в дир со своим языком.
-- cgi-bin/redir.pl --
#!/usr/bin/perl
use CGI qw/:standard/;
($lang) = $ENV{HTTP_ACCEPT_LANGUAGE} =~ /(.?.?)/;
($redirurl) = param('redirurl');
$lang='en' if !( -d $ENV{DOCUMENT_ROOT}.$redirurl.$lang);
print redirect(-url=>$redirurl.$lang.'/');
-- httpd.conf --
RewriteEngine On
RewriteRule ^(/sub_host1/)$  /cgi-bin/redir.pl?redirurl=$1 [R,NE]
RewriteRule ^(/sub_host2/)$  /cgi-bin/redir.pl?redirurl=$1 [R,NE]
</VirtualHost>
 
Как организовать прозрачный редирект на другую страницу   Автор: [есть мнение]
 
redirect  /catalog   http://new_host/new_catalog
или с mod_rewrite:
RewriteCond %{HTTP_HOST}  ^www.host1.ru$ [NC]
RewriteRule (.*) http://www.host2.ru:8200$1 [R=permanent,L]

 

   Прокси сервер Squid

Как узнать логин в домене Windows имея ip и NTLM авторизацию в Squid?   Автор: Забудкин Лев Мирославович  [есть мнение]
 
Если у Вас есть SQUID и Вы используете NTLM авторизацию и хотите знать какой сейчас 
(по крайней мере в последний раз авторизовался) у клиента IP адрес или какому клиенту он присвоен, 
то воспользуйтесь следующей командой:

awk '{user[tolower($8)]=$3} END {for(i in user) {print user[i] " " i}}' access.log | sort

Будет выведено примерно следующее:
  192.168.132.200 e_scher
  192.168.132.202 v_lit
  192.168.132.203 a_volob
  192.168.132.204 a_kuch
  192.168.132.210 e_utsum
  192.168.132.211 v_nik
  192.168.132.212 s_maz

Как видите, это удобно использовать в случае squid и NAT.
 
Помещение данных о входящем трафике из ipcad в лог squid (1)   Автор: Забудкин Лев Мирославович  [есть мнение]
 
Чтобы анализаторы логов прокси сервера squid отображали данные о пересылках в обход прокси, 
например данные по почтовому или ssh трафику, можно сохранить данные о таких пересылках в логе squid.

Настройки ipcad:

    capture-ports enable;
    interface ppp* filter "ip and not dst net 192.168.0.0/16";
    aggregate 0.0.0.0/0 strip 32; /* Считаем все адреса */
    /* Теперь укажем какие порты как отображать */
    aggregate 1-19 into 65535;
    aggregate 20-21 into 21;
    aggregate 22-23 into 22;
    aggregate 25 into 25;
    aggregate 24 into 65535;
    aggregate 26-79 into 65535;
    aggregate 80-81 into 0;
    aggregate 82-109 into 65535;
    aggregate 110 into 110;
    aggregate 111-442 into 65535;
    aggregate 443 into 443;
    aggregate 444-3127 into 65535;
    aggregate 3128 into 0;
    aggregate 3129-65535 into 65535;

Сам файл обработки ipcad и записи в сквидовский лог:

    #!/bin/sh
    net="192.168"
    ttime=`/usr/bin/rsh localhost sh ip acco|/bin/grep 'Accounting data saved'| /bin/awk '{print ($4)}'`
    /usr/bin/rsh localhost clear ip accounting
    /usr/bin/rsh localhost show ip accounting checkpoint|/bin/grep $net|/bin/awk -v vtime=$ttime '{print (vtime".000",1,$1,"TCP_MISS/200",$4,"CONNECT",$2":"$6,"-","DIRECT/"$2,"-")}' >>/var/log/squid/access.log


Вместо 192.168 Вы можете указать свою сеть, которую брать с ipcad'а и заносить в лог прокси сервера Squid.

Таким образом весь трафик, указанный в настройках ipcad'а будет отображен в access.log сквида, 
который в данном примере находится в папке /var/log/squid.
 
Прозрачное проксирование FreeBSD + IPFW + Squid.   Автор: Астафьев Григорий  [есть мнение]
 
Все тестировалось на FreeBSD 6.2.

Вначале добавляем необходимые опции в ядро:

   IPFIREWALL
   IPFIREWALL_FORWARD

Далее добавляем правила на разворот трафика на Squid:

   ipfw add 49 fwd 127.0.0.1,3128 tcp from any to any 80

Затем правка собственно squid.conf :

   http_port 3128

   httpd_accel_host virtual
   httpd_accel_port 80
   httpd_accel_with_proxy on
   httpd_accel_uses_host_header on
 
Как вытащить все MP3 файлы из кеша Squid   Автор: Michael Rulov  [есть мнение]
 
   purge -n -a -s -c /etc/squid/squid.conf -C /tmp/MP3s/ -e '\.mp3|\.wav'


Утилиту purge скачать можно здесь: http://www.wa.apana.org.au/~dean/sources/
 
WCCP + Linux + Squid   Автор: Mike Zagrayevsky  [есть мнение]
 
Чтобы заставить эту связку работать необходимо в конфиге squid'a поставить "wccp_version 4",
а на cisco - "ip wccp version 1" иначе не работает.
Ядро 2.4.x собирается с включенным GRE, потом собирается и подгружается модуль ip_wccp.o
Никаких iptunnel руками делать не надо. Все работает и без них.
 
Аутентификация пользователей в squid через учетные записи samba (1)   Автор: freeman  [обсудить]
 
1. собрать сквид (2.5s1 или s2) с поддержкой аутентификации 
     --enable-auth=basic,ntlm --enable-auth-modules=SMB --enable-basic-helpers=SMB --enable-ntlm-modules=SMB
2. поставить ntlm_auth из /helpers/ntlm_auth/smb/
3. поставить smb_auth (для клиентов не поддерживающих ntlm аутентификацию) из /helpers/basic_auth/smb/
4. в сквиде аутентификацию делать через ACL proxu_auth.

basic аутентификацию через smb_auth (см. сайт разработчиков), для ntlm_auth встроенный хелп.
Для самбы стандартные настройки для контроллера домена. 
 
Принудительное проксирование в FreeBSD (1)   Автор: Дмитрий Новиков  [есть мнение]
 
Для принудительного проксирования, на прокси-сервере следует ввести
 правила Firewall:
01000 fwd 127.0.0.1,3128 tcp from 10.128.0.0/16 to any 80,8080,8101                                                                   
В squid.conf нужно добавить:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
На маршрутизаторе "развернуть" Веб-трафик на ПРОКСИ-сервер:                                                          
ipfw add 10 fwd ip_прокси tcp from 10.128.0.0/16 to any 80,8080 out
xmit lnc1
 
Как пробросить туннель через http-прокси (например squid) (1)   Автор: [есть мнение]
 
Сервер:
  stunnel -p /usr/local/etc/stunnel.pem -r 127.0.0.1:80 -d 443
Клиент:
  stunnel -c -d 2.2.2.2:2323 -r proxy.host.ru:3128 -Z 3.3.3.3:443
Организуется туннель: user -> 2.2.2.2:2323 -> proxy.host.ru:3128 -> 3.3.3.3:443 -> 127.0.0.1:80
127.0.0.1:80 - ip и порт на удаленной машине, куда пробрасывается туннель.
2.2.2.2:2323 - ip и порт локальной машины, "вход в туннель"
proxy.host.ru:3128 - proxy сервер с поддержкой CONNECT
3.3.3.3:443 - удаленная машина, ожидающая сторона туннеля.
 
Как запустить squid без кэширования страниц и балансировкой трафика. (1)   Автор: [есть мнение]
 
# Запрещаем кэширование
   acl all src 0/0
   no_cache deny all
# Пересобираем с поддержкой null хранилища.
  ./configure --enable-storeio=ufs,null
# Включаем поддержку null кэша.
   cache_dir null /tmp
# Балансировка трафика между тремя каналами:
   acl satalite_link src 192.168.1.0/255.255.255.0
   tcp_outgoing_address 192.168.1.1 satalite_link
   tcp_outgoing_address 192.168.1.2
 
Как принудительно завернуть весь http трафик через Squid на FreeBSD   Автор: [есть мнение]
 
В /etc/ipnat.rules заносим:
      rdr rl0 0/0 port 80 -> 127.0.0.1 port 3128 tcp

В squid.conf:
      httpd_accel_host virtual
      httpd_accel_port 80
      httpd_accel_with_proxy  on
      httpd_accel_uses_host_header on
 
Все работает отлично, за исключением того, что Squid не работает с некоторыми единичными хостами. (1)   Автор: [обсудить]
 
echo 0 > /proc/sys/net/ipv4/tcp_ecn
 
Как увеличить производительность squid proxy ? (1) (2)   Автор: [есть мнение]
 
Используйте метод доступа к хранилищу DISKD.
Параметры сборки: ./configure --enable-storeio=diskd,ufs
(также можно указать --enable-async-io --enable-poll)
В файле конфигурации:
cache_dir diskd /cache1 1024 16 256 Q1=72 Q2=64
 

   ACL, ограничения трафика и пользователей

Squid + LightSquid + Perl = ограничение по трафику   Автор: Mosson  [есть мнение]
 
Очередное решение на наболевшую тему.

Задача: имея squid с настроенной авторизацией пользователей и сбором статистики 
сделать ограничение на используемый трафик (квоты).

Лично мне от sams пришлось отказаться т.к. он прикручивается к авторизации пользователей, 
а для меня это неприемлемо.

Решение подойдет для тех, кому не сильно критично точное лимитирование. 
Я сильно не хотел менять устоявшуюся систему авторизации пользователей.

итак.

1. настраиваем сквид (статей много, описывать не буду)
В squid.conf , желательно перед остальными ACL, надо будет добавить следующее


 # блокировка пользователей которые превысили лимит (файл user-deny),
 # и разрешение этим пользователям только тех IP и сайтов, которые перечислины в файле host.acl

 acl no_quota url_regex -i "/etc/squid/no_quota_url.txt"
 acl banusers proxy_auth_regex -i "/etc/squid/user_deny.txt"
 http_access allow no_quota banusers allowedhost
 deny_info ERR_QUOTA all
 http_access deny banusers allowedhost all

по порядку что к чему с файлами:

no_quota_url.txt - ведется руками.
текст:

 # файд содержит сайты, который открываются, даже если превышена квота и пользователь попал в users_deny.txt
 test.ru
 icq.com
 205.188.


user_deny.txt - в дальнейшем создастся сам, но без него перечитать настройки squid не получиться

 # файл содержит пользователей превысивших квоту.
 # автоматически переписывается скриптом traf_limit.pl
 dolzhen_bit_odin_user
 user1
 user2

ERR_QUOTA создадим по образу и подобию всех остальных страниц с ошибками. 
Я поставил что-бы получать другой текст. вот так получилось:

 <HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=koi8-r">
 <TITLE>Превышен лимит</TITLE>
 </HEAD><BODY>

 <H1><font color="FF0000">ПРЕВЫШЕН ЛИМИТ</font></H1>
 <H2>
 </H2>
 <HR>
 <P>Заблокированный URL:
 <A HREF="%U">%U</A>

 <P>
 <UL>
 <LI>
 <STRONG> Вы превысили месячный лимит на интеренет. 
 <br> Если Вы считаете это неправильным, свяжитесь с отделом АСУ по телефонам 
 1013 или 1066 
 <br>

 <br>Если этот сайт необходим для работы, то он может быть открыт по  служебной записке.
 </STRONG>
 <P>
 </UL>
 <P>С Уважением отдел АСУ.
 </BODY></HTML>


allowedhost - мое правило проверки пользователей.


2. LightSquid абсолютно штатный. вот официальный сайт http://lightsquid.sourceforge.net/

Ставится и настраивается минут 5-10. Собственно вся настройка у меня заключалась в том, 
что-бы рассортировать пользователей по группам. Для тех у кого еще есть http сервер 
дополнительно будет красивая статистика. ;)

3. в /etc/squid создадим папку traf_limit

4. в /etc/squid/traf_limit создаем два файла

traf_limit.pl

 #!/usr/bin/perl
 #
 # Довесок на LightSquid Project (c) 2004-2005 Sergey Erokhin aka ESL
 #
 # Скрипт создает файлик user_deny для ограничения инета по трафику

 # Автор: Иван Лонин loninia@apksouz.ru  2008 год.


 use File::Basename;

 # коряво конечно напрямую писать путь к конфигу, но лениво было sh файлик для крона делать :)
 require "/etc/squid/traf_limit/config";


 #($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
 @dat=localtime(time);
 $year =1900+$dat[5];
 $month=1 + $dat[4];
 $filter="$year$month";

 #print "$log_path/$filter*\n";
 @daylist=glob("$log_path/$filter*");

 foreach $daypath (sort @daylist) {
   open FF,"<$daypath/.total";

   $totaluser=<FF>;chomp $totaluser;$totaluser=~s/^user: //;
   $totalsize=<FF>;chomp $totalsize;$totalsize=~s/^size: //;


   while (<FF>) {

     ($user,$size,$hit)=split;
     $h{$user}{size}+=$size;
     $h{$user}{hit}+=$hit;
   }
   close FF;
 }
 #
 $cummulative=0;
 open RES,">$res_file";
 print RES "# файл содержит юзеров превысивших квоту.\n
 # автоматически переписывается скриптом traf_limit.pl\ndolzhen_bit_odin_user\n";
 foreach $user (sort {$h{$b}{size}<=>$h{$a}{size}} keys  %h) {

     $all4user=$h{$user}{size}/1024/1024;
     if ($vip_user{$user}{size} > 0) {
         $limit=$vip_user{$user}{size};
     }else{
         $limit=$all_limit;
     }


     if ($all4user >= $limit) {
         print RES "$user\n";
 #        print "$h{$user}{size}\n";
     };

 }
 __END__


и файлик config


 #!/usr/bin/perl
 # конфигурационный файл для скрипта traf_limit.pl
 #
 # путь к логам lightsquid
 $log_path="/www/lightsquid/report";

 # файл в который пушутся пользователи превысившие лимит
 $res_file="/etc/squid/user_deny.txt";

 # лимит инета в мегабайтах
 $all_limit=150;


 # привелигированные пользователи с повышенным или пониженным лимитом
 # для каждого пользователя строка формата:
 #$vip_user={<имя_юзера}{size}=<лимит_в_мегабайтах>;
 $vip_user{user1}{size}=5;
 $vip_user{qwe}{size}=50;


назначим файликам нужного владельца и права на запуск

5. осталось в только в cron добавить запуск. Я сделал раз в сутки в 5-00. 
делать вечером в 20 с чем нибудь категорически не рекомендую т.к. скрипт работает 
на текущую дату (первого числа будут использоваться прошломесячные данные)

делаем 

 crontab -e 

и добавляем для скрипта строчку вида

 45 04 * * * /etc/squid/traf_limit/traf_limit.pl

и для сквида


 0 05 * * * /etc/init.d/squid reload

собственно все :). естественно, что правильно оно начнет работать только с 1 числа следующего за установкой месяца. 

Удачи.

Если есть вопросы пишите на loninia@apksouz.ru
 
Авторизация пользователей по доменным группам AD в squid (1)   Автор: Nichls  [есть мнение]
 
В squid.conf

#Здесь описываем внешие ACL
external_acl_type InetGroup-proxy-08-20ww %LOGIN /usr/local/squid/libexec/wbinfo_group.pl
# accesse in internet in work week from 08-00 to 20-00
external_acl_type InetGroup-proxy-08-20aw %LOGIN /usr/local/squid/libexec/wbinfo_group.pl
# accesse in internet in all week from 08-00 to 20-00
external_acl_type InetGroup-proxy-00-24all %LOGIN /usr/local/squid/libexec/wbinfo_group.pl
# accesse in internet in all week from 00-00 to 24-00

# Проверь свои пути
auth_param ntlm children 20
auth_param ntlm program /usr/local/samba/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm max_challenge_reuses 0
auth_param ntlm max_challenge_lifetime 2 minutes

auth_param basic children 20
auth_param basic program /usr/local/samba/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

# Говорим, что нужна авторизация
acl you_domain proxy_auth REQUIRED

# Разграничиваем доступ по времени
acl work-week time MTWHF 08:00-20:00 #  Доступ с 08-00 до 20-00 с понедельника по пятницу
acl all-week time SMTWHFA 08:00-20:00 # Доступ с 08-00 до 20-00 всю неделю
acl all-time time SMTWHFA 00:00-24:00 # Доступ круглосуточно всю неделю

# Осуществляем проверку на принадлежность к нужно группе
acl InetAccess-proxy-08-20ww external InetGroup-proxy-08-20ww proxy-08-20ww
acl InetAccess-proxy-08-20aw external InetGroup-proxy-08-20aw proxy-08-20aw
acl InetAccess-proxy-00-24all external InetGroup-proxy-00-24all proxy-00-24all

# Собираем все в кучу и проверяем на предмет получения дуступа к ИНТЕРНЕТ
http_access allow you_domain work-week InetAccess-proxy-08-20ww
http_access allow you_domain all-week InetAccess-proxy-08-20aw
http_access allow you_domain all-time InetAccess-proxy-00-24all

----------------------

proxy-08-20ww, proxy-08-20aw, proxy-00-24all - Группы в домене. В них заносишь тех юзеров, которым разрешен доступ.

wbinfo_group.pl - Используй именно этот скрипт. В том, что идет в комплекте со squid имеется ошибка.
Здесь она исправлена.

#!/usr/bin/perl -w
#
# external_acl helper to Squid to verify NT Domain group
# membership using /usr/local/samba/bin/wbinfo
#
# This program is put in the public domain by Jerry Murdock
# <jmurdock@itraktech.com>. It is distributed in the hope that it will
# be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Author:
#   Jerry Murdock <jmurdock@itraktech.com>
#
# Version history:
#   2002-07-05 Jerry Murdock <jmurdock@itraktech.com>
#               Initial release
#

# external_acl uses shell style lines in it's protocol
require 'shellwords.pl';

# Disable output buffering
$|=1;

sub debug {

        # Uncomment this to enable debugging
        print STDERR "@_\n";
}

#
# Check if a user belongs to a group
#
sub check {
        local($user, $group) = @_;
        $groupSID = `/usr/local/samba/bin/wbinfo -n "$group"`;
#        chop  $groupSID;
        # because wbinfo -n also returns the group number
        $groupSID = substr($groupSID,0,index($groupSID," ",0));
        $groupGID = `/usr/local/samba/bin/wbinfo -Y "$groupSID"`;
        chop $groupGID;
#       &debug( "User:  -$user-\nGroup: -$group-\nSID:   -$groupSID-\nGID:   -$groupGID-");
        return 'OK' if(`/usr/local/samba/bin/wbinfo -r \Q$user\E` =~ /^$groupGID$/m);
        return 'ERR';
}
#
# Main loop
#
while (<STDIN>) {
        chop;
        &debug ("Got $_ from squid");
        ($user, $group) = &shellwords;

        $ans = &check($user, $group);
        &debug ("Sending $ans to squid");
        print "$ans\n";
}

----------------------------------------------------------------------------------------------------------
smb.conf

[global]
        workgroup = YOU-DOMAIN
        realm = YOU-DOMAIN.RU
        netbios name = demon
        server string =  Proxy Server
        hosts allow = 10. 127.
        winbind separator = \\ # Обрати на это внимание
        winbind use default domain = yes
        winbind uid = 10000-20000
        winbind gid = 10000-20000
        winbind enum users = yes
        winbind enum groups = yes
        template homedir = /home/winnt/%D/%U
        template shell = /usr/local/bin/bash
        max log size = 50
        security = domain
        password server = srv1 srv3
        encrypt passwords = yes

srv1 и srv3 - PRIMARY and BACKUP контроллеры домена

----------------------------------------------------------------------------------------------------------
root@demon#tail -f /usr/local/squid/var/logs/cache.log
Got YOU-DOMAIN\\user1 proxy-08-20ww from squid
Sending ERR to squid
Got YOU-DOMAIN\\user1 proxy-08-20aw from squid
Sending ERR to squid
Got YOU-DOMAIN\\user1 proxy-00-24all from squid
Sending OK to squid
# Тут явно видно, что пользователя user1 нашли в группе proxy-00-24all и squid'у передано OK
Got YOU-DOMAIN\\user2 proxy-08-20ww from squid
Sending OK to squid
Got YOU-DOMAIN\\user3 proxy-08-20ww from squid
Sending OK to squid

root@demon#tail -f /usr/local/squid/var/logs/access.log
1147851551.270     20 10.66.107.56 TCP_IMS_HIT/304 251 GET http://img.mail.ru/mail/ru/css/mail-main1.css YOU-DOMAIN\user1 NONE/- text/css


Небольшое дополнение:

Информация о членстве в группе хранится в кеше squida (по умолчанию) 1 час, а в кеше Winbinda - 300 сек.
 Чтобы не ждать столько времени при перемещении пользователя из одной группы в другую 
советую добавить в squid.conf при описании внешиx ACL опцию ttl,примерно так:

external_acl_type InetGroup-proxy-08-20ww ttl=0 %LOGIN /usr/local/squid/libexec/wbinfo_group.pl

а в smb.conf:

[global]
         winbind cache time = 0
 
Авторизация в squid по группам AD   Автор: boombax  [есть мнение]
 
Возникла необходимость разделять доступ пользователей сквид по группам AD. 
Утилита wbinfo_group.pl, идущая со сквидом при большом числе запросов валила сквид 
и были проблемы с кешированием данных. Возникла идея написать скрипт, 
который через rpc запрос забирал членов необходимых доменных групп и скидывал их в текстовые файлы 
на сервере, одновременно определяя изменения в них и при необходимости перегружая squid.

#!/usr/bin/perl -w

use Text::Diff;

$login="testlogin";
$password="secret_password";
$domain="MYDOMAIN";
$dc="dc.domain.ru";
$path="/usr/local/etc/squid/acl";
$reload_squid_cmd="/usr/local/sbin/squid -k reconfigure";
@ADgroups = ("inet_users","inet_vip","inet_sluz","inet_block");

foreach $group (@ADgroups)

    {
    @group_check= sort `/usr/local/bin/net rpc group MEMBERS $group -U $login%$password -S $dc`;
    @group_check = grep {/^$domain\\/} @group_check;
    $col=@group_check;   
    my $diff = diff \@group_check,  "$path/$group.acl";
        if ($diff and $col) {
            open (GROUPFILE, ">$path/$group.acl") or die "Can't create $group.acl: $!";
            print GROUPFILE @group_check;
            $reconfigure++;
        }
    close GROUPFILE;
}
system("$reload_squid_cmd") if ($reconfigure);


Данный скрипт вешается в cron и запускается раз в 5 минут


Доработанная версия, изменения:

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

#!/usr/bin/perl -w

use Text::Diff;

$login="mylogin";
$password="cool_password";
$samba_prefix="/usr/local";
$winbind_separator="\\";
@group_domain = ("DOMAIN1\\inet_users","DOMAIN1\\inet_vip","DOMAIN2\\inet_sluz");
%domain_dc = (
            'DOMAIN1' => [ 'dc.domain1.ru','bdc.domain1.ru' ],
            'DOMAIN2'  => [ 'ad1.domain2.ru','ad2.domain2.ru' ]
             );
$acl_path="/usr/local/etc/squid/acl";
$reload_squid_cmd="/usr/local/sbin/squid -k reconfigure";

sub IsGroup
{
    my $item = shift;
    foreach $dc_group (@dc_groups) {
        return 1 if ($item =~ /^\Q$dc_group\E$/i);
    }
#    print "$item\n";
    return 0;
}

sub extractusers
{

    my $group = shift;
    my @group_sostav;
    (my $domain, $group) = split(/\Q$winbind_separator\E/, uc($group), 2);
#    print "$domain $group\n";
    foreach $dc (@{ $domain_dc{$domain} }) {
#       print "$dc\n";
        @group_sostav = `$samba_prefix/bin/net rpc group MEMBERS "$group" -U $login%$password -S $dc`;
        chomp(@group_sostav);
        @group_sostav = grep { /^\w+\\.+/i } @group_sostav;
        @group_sostav = grep { !/.+\$$/i } @group_sostav;
#       print "@group_sostav\n";
        last if @group_sostav;
    }
    foreach my $login (@group_sostav)   {
        $login =~ s/(\w+)\\(.+)/\L$1$winbind_separator$2\E/o;
        my $isgroup = IsGroup($login);
        extractusers($login) if $isgroup;
        push (@users,"$login\n") if !$isgroup;
    }
}

@dc_groups = `$samba_prefix/bin/wbinfo -g`;
chomp(@dc_groups);

foreach $group (@group_domain)
{
    local @users;
    extractusers($group);
    my %Users = ();
    my @unique = sort {uc($a) cmp uc($b)} grep{!$Users{$_}++}@users;
    my $count = @unique;
    my $diff = diff "$acl_path/$group.acl", \@unique;
    if ($diff and $count) {
        print "Internet acl group <$group> change:\n";
        print "$diff\n" if $diff;;
        open (GROUPFILE, ">$acl_path/$group.acl") or die "Can't create $group.acl: $!";
        print GROUPFILE @unique;
        close GROUPFILE;
        $reconfigure++;
    }

}

system("$reload_squid_cmd") if ($reconfigure);
 
Авторизация в squid через базу данных FireBird   Автор: Constantine A.Yarovoy  [обсудить]
 
в squid.conf добавляем:
   auth_param basic program /usr/sbin/firebird_auth
   auth_param basic children 5
   auth_param basic realm Proxy
   auth_param basic credentialsttl 2 hours

   acl your_net src 10.1.0.0/24
   acl passwd proxy_auth REQUIRED
   http_access allow your_net passwd
   http_access deny all

/usr/sbin/firebird_auth - наш скрипт для проверки
   #!/usr/local/bin/php
   <?

        while(1) {

            $buf = fgets(STDIN);
            $buf = substr($buf,0,-1);
            $account_data = explode(" ",$buf);
            $link = ibase_connect("10.1.0.200:/var/db/firebird/storage/squid.fdb","SYSDBA","<your_pass>");


            $res = ibase_query("SELECT * FROM users WHERE LOGIN = '".
               $account_data[0]."' AND PASSWD = '".$account_data[1]."'")

            $row = ibase_fetch_object($res);

            if(isset($row->LOGIN)) { echo "OK\n"; } else { echo "ERR\n"; }

            ibase_free_result($res);

            ibase_close($link);


        }
   ?>

ну и не забудьте сделать табличку users в вашей базе в firebird такого содержания:

   ID,LOGIN,PASSWD,FIO..
 
Ограничение доступа по ip назначения в Squid   Автор: Skif (Чижиков Владимир)  [есть мнение]
 
Типичная задача: Разрешить доступ пользователю к списку сетей (например UA-IX)
и запретить мир, и наоборот, запретить доступ пользователя к списку сетей и разрешить все остальное

   acl UAIXLIST            dst "/usr/local/etc/squid/access_list/ua-ix.cfg" #Список сетей

   acl host_alfa           src 10.0.38.1 # первый хост
   acl host_luna          src 10.0.38.2 # второй хост


   http_access allow host_alfa UAIXLIST # Разрешаем доступ к UAIXLIST


   http_access deny host_alfa all # Запрещаем ко всему остальному
   http_access deny host_luna UAIXLIST # Запрещаем доступ к UAIXLIST
   http_access allow host_luna all # разрешаем ко всему остальному

В последних двух правилах возможна альтернатива:
   http_access allow host_luna !UAIXLIST

содержимое /usr/local/etc/squid/access_list/ua-ix.cfg
   62.16.0.0/19
   62.64.64.0/18
   62.80.160.0/19
   62.149.0.0/19
   62.221.32.0/24
   62.221.33.0/24
   62.221.34.0/24
   62.221.37.0/24
   ......

Знаки комментариев # нежелательны, возможны ошибки(по крайней мере в squid-2.5.x). Повторы сетей из разряда 
  62.64.64.0/18 
  62.64.64.0/24 
вызовут предупреждения о дублировании адресов сетей
 
Фильтрация mime_type на Squid'e   Автор: Дмитрий Загацкий  [обсудить]
 
Использовался сервер FreeBSD 4.11-p13
squid/2.5.STABLE9 также тестировалось на squid/2.5.STABLE12 

   acl stream rep_mime_type -i ^application/x-mms-framed$
   http_reply_access deny stream
   http_reply_access allow all
 
SQUID в сети SAMBA + LDAP, использование групповых ACL   Автор: Афлетдинов Андрей  [есть мнение]
 
Имеем:
   1. Учетные записи пользователей и групп в LDAP
   2. Поднят домен на SAMBA-3.

На стороне сервера SQUID конфигурируем:
   1. /etc/ldap.conf и /etc/nsswith.conf в результате getent passwd и getent group выдает список пользователей и групп

   2. минимальный /etc/smb.conf:
   
      [global]
          workgroup = domain
          netbios name = squid
          load printers = no
          printcap name = /dev/null
          security = domain
          password server = sambaserver
          local master = no
          os level = 33
          domain master = no
          preferred master = no
          wins support = no
          winbind use default domain = yes
          winbind cache time = 1200

   3. Заводим в домен net -Uadministrator join


   4. Запускаем winbind, но при этом в /etc/nsswith.conf его _не_прописываем_

   5. разрешаем чтение pipe winbindd процессу squid любым доступным способом, 
       например: setfacl -g:squid:rx /var/lib/samba/winbindd_privileged

   6. samba в дальнейшем не нужна

   7. далее в squid.conf:

      # стандартные опции авторизации
      auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
      auth_param ntlm children 5
      auth_param ntlm max_challenge_reuses 0
      auth_param ntlm max_challenge_lifetime 2 minutes
      auth_param ntlm use_ntlm_negotiate off
      auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
      auth_param basic children 5
      auth_param basic realm Squid proxy-caching web server
      auth_param basic credentialsttl 2 hours
      auth_param basic casesensitive off

      # авторизация обязательна
      acl NTLMauth proxy_auth REQUIRED


      # определяем типы ACL
      external_acl_type type_ldap_group1 ttl=60 children=1 %LOGIN 
           /usr/lib/squid/   squid_ldap_group.pl -b "cn=group1,ou=group,dc=ldap,dc=local" -H ldaps://ldap.local
      external_acl_type type_ldap_group2 ttl=60 children=1 %LOGIN 
          /usr/lib/squid/squid_ldap_group.pl -b "cn=group2,ou=group,dc=ldap,dc=local" -H ldaps://ldap.local
      external_acl_type type_ldap_group3 ttl=60 children=1 %LOGIN 
          /usr/lib/squid/squid_ldap_group.pl -b "cn=group3,ou=group,dc=ldap,dc=local" -H ldaps://ldap.local

      # и сами ACL
      acl acl_group1 external type_ldap_group1
      acl acl_group2 external type_ldap_group2
      acl acl_group3 external type_ldap_group3

ВСЕ. Дальше с ними можно работать как с обычными ACL, начиная от простого
     http_access allow acl_group1
и заканчивая в вариантах пула и по времени.

При изменении информации в группе LDAP, squid примет изменения только через
время определенное в ttl, таким образом перезапускать его как -kreconfigure нет необходимости, что уже плюс!

Да вот еще, сам скрипт /usr/lib/squid/squid_ldap_group.pl очень прост:

#!/usr/bin/perl
#
# squid ldap group
# mailto:afletdinov\@dc.baikal.ru
#

use Getopt::Long qw(:config no_ignore_case);
use Net::LDAP;
use strict;

# const
my $VERSION = '20051122';

# variables
my $ldap;
my $user;
my $result;
#my $pass;

my $opt_groupdn = '';
my $opt_binddn = '';
my $opt_bindpasswd = '';
my $opt_secretfile = '';
my $opt_uri = '';

GetOptions(
            'b=s' => \$opt_groupdn,
            'D=s' => \$opt_binddn,
            'w=s' => \$opt_bindpasswd,
            'W=s' => \$opt_secretfile,
            'H=s' => \$opt_uri );


# check: requires param
&usage unless($opt_groupdn and $opt_uri);

#connect
$ldap = Net::LDAP->new($opt_uri) or die("connect $opt_uri failed!");

# bind
if($opt_binddn){

    # check: secretfile
    if($opt_secretfile){
        open(FILE, "<$opt_secretfile") or die("error read $opt_secretfile");
        $opt_bindpasswd = <FILE>;
        close(FILE); }

    $result = $ldap->bind($opt_binddn, password=>$opt_bindpasswd);

# anonymous bind
}else{ $result = $ldap->bind(); }

$result->code and die($result->error);

# use buffers off
$| = 1;

# BASIC

    while(<STDIN>){
        chomp;

        # format: user password
        unless(/^(\S+)\s*(\S*)$/){ print "ERR\n"; next; }

        $user = $1;
        #$pass = $2;

        # check: valid group
        $result = $ldap->search(base=>$opt_groupdn, , filter=>"(memberUid=$user)");


        # not found
        unless($result->count){ print "ERR\n"; next; }

        # auth: OK group: OK
        print "OK\n";
    }

exit;

sub usage(){
    print <<EOF;
squid_ldap_group.pl version $VERSION

Usage: squid_ldap_group.pl -b "cn=www-access,ou=group,dc=ldap,dc=local" -H ldaps://ldap.local

        -b GroupBaseDN    (REQUIRED)
        -H LdapURI        (REQUIRED)
        -D BindDN     
        -w BindPasswd
        -W SecretFile

EOF
    exit;

}
 
Как запретить выкачивание .mp3 файлов через прокси-сервер Squid.   Автор: [есть мнение]
 
acl stop_files url_regex -i ftp \.exe \.mp3 \.vqf \.tar\.gz \.gz \.rpm \.zip
                           \.rar \.avi \.mpeg \.mpe \.mpg \.qt \.ram \.rm \.iso \.raw \.wav \.mov
acl stop_files rep_mime_type application audio video
http_access deny stop_files
 
Как запретить работу через Squid пользователей с определенных MAC адресов.   Автор: [есть мнение]
 
Squid должен быть собран с ./configure --enable-arp-acl 
Далее в файле прописываем ACL'и формата:
     acl aclname arp mac_address
Например:
   acl test1 arp 11:43:67:F5:65:23
   http_access allow test1
   http_access deny all
 
Как ограничить пропускную способность 128 Kbps на каждый IP ?   Автор: [есть мнение]
 
 acl only128kusers src 192.168.1.0/255.255.192.0
        acl all src 0.0.0.0/0.0.0.0
        delay_pools 1
        delay_class 1 3
        delay_access 1 allow only128kusers
        delay_access 1 deny all
        delay_parameters 1 64000/64000 -1/-1 16000/64000
 
Как органичить общую пропускную способность Squid в 512 Kbps ?   Автор: [обсудить]
 
При сборке не забыть configure --enable-delay-pools
В файле конфигурации:
acl all src 0.0.0.0/0.0.0.0         
        delay_pools 1
        delay_class 1 1
        delay_access 1 allow all
        delay_parameters 1 64000/64000          # 512 kbits == 64 kbytes per second
 
Как ограничить число соединений от одного пользователя в Squid и Oops   Автор: [есть мнение]
 
Для Squid прописать ACL вида:
	acl имя_acl'я maxconn ограничения_в_N_соединений
Для Oops:
	per_ip_conn   число_соединений;
 

   Система

Удаление zombie процессов в Solaris (1)   Автор: [есть мнение]
 
Нередко из-за отсутствия обработчика сигнала SIGCHLD в родительском процессе, 
после завершения дочерней программы, остаются "<defunct>" или zombie процессы. 
Zombie процессы не занимают системные ресурсы, кроме записи в таблице процессов, 
что может вызвать ее переполнение и как следствие блокировку запуска новых процессов, 
при большой интенсивности появления zombie. Zombie исчезают после завершения работы 
родительского процесса, но записи в таблице также можно очистить принудительным путем.

Получаем список zombie процессов:


    ps -ecl |grep "Z"
    F S  UID  PID  PPID  CLS PRI  ADDR  SZ  WCHAN TTY  TIME CMD
    0 Z  100 27841 27840   -   0     -   0  -     ?    0:00 <defunct>

"kill" и "kill -9" в случае zombie использовать бесполезно. В Solaris для эмуляции вызова wait() 
для чтения кода возврата из таблицы процессов существует утилита preap:

    preap 27841
    27841: exited with status 0
 
Установка летнего (декретного) времени для оборудования Linksys (1)   Автор: Romik  [есть мнение]
 
Daylight Saving Time Rule на закладке Regional у SPA9хх, PAP2 и пр. в России устанавливается в 

   start=3/-1/5/02:0:0;end=10/-1/4/02:0:0;save=1

Time Zone GMT +03:00 (в Москве), и указываются работающие NTP сервера.
Вышеприведенная строка прибавляет 1 час к времени с 02:00 последнего воскресенья марта, 
и перестает его добавлять в 02:00 в последнее воскресенье октября.
 
Восстановление потерянных из-за сбоя в браузере данных (1)   Автор: sysadmin.online  [есть мнение]
 
Если набитые данные в форме случайно необратимо потеряны, например, в opera ошибочный клик 
может привести с загрузке нового URL в текущем окне с невозможностью возврата к предыдущему, 
можно попытаться их восстановить следующим образом.

Находим PID процесса:

   ps aux | grep firefox-bin
   ps aux | grep opera

Делаем дамп:

  gdb -p 2408
  (gdb) gcore

Ищем текст:

   strings core.* | less

Если браузер рухнул, то данные можно попробовать найти в /dev/mem, например:

   dd if=/dev/mem of=./mem.dump
   strings ./mem.dump > mem.txt
   
   

 
Скрипт автозагрузки программы с помощью screen (FreeBSD) (1)   Автор: denz  [есть мнение]
 
Скрипт запуска и остановки игрового сервера Call of Duty: United Offence 1.51

#!/bin/sh
# Zapusk Call of Duty (Game server)
GAMESDIR=/home/games/coduo
export GAMESDIR
cd $GAMESDIR
case "$1" in
    start)
        /usr/local/bin/screen -dm ./coduo_lnxded +set fs_homepath $GAMESDIR \
          +set scr_motd +exec coduo.cfg +exec awe.cfg
        echo "Starting Call of Duty:United Offence 1.51 Server"
;;
    stop)
        pid=$(ps -ax|grep coduo_lnxded|grep -v grep | awk '{print $1}')
        kill ${pid} > /dev/null 2>&1
;;
    *)
        echo "Используй: `basename $0` { start | stop }"
        exit 64
;;
esac


Запускается так: ./etotscript.sh start
останавливается: ./etotscript.sh stop

 
mgetty и подвисание после прозвона голосом   Автор: Vladimir V. Kamarzin  [есть мнение]
 
В очень многих howto по настройки dial-in рекомендуют 
в /etc/mgetty+sendfax/login.config прописывать строки

   /AutoPPP/ - a_ppp /usr/sbin/pppd auth -chap +pap login 
   * - - /bin/login @

что есть не совсем правильно, если требуется только ppp (или emsi и т.д.), ибо
при такой конфигурации любой дозвонившийся голосом может завесить
dial-in. Если не класть трубку 
хотя бы минуту, то на той стороне mgetty успевает запустить /bin/login, и, естественно, 
на последующие звонки модем не отвечает.

Не прописывать строчку строчку 
   * - - /bin/login @
не является выходом - mgetty всё равно запускает /bin/login если не удалось
распознать ppp. Проблему можно решить, заменив в конфиге /bin/login на
/sbin/nologin:

   * - - /sbin/nologin @
 
Как сохранять все core файлы только в определенной директории   Автор: [обсудить]
 
FreeBSD (%U.%N.%P=user.имя_процесса.pid, подробнее - man core):
   sysctl -w kern.corefile=/tmp/%U.%N.%P.core
   
Linux (последние ядра):
   sysctl -w kernel.core_pattern=/tmp/%e.%p.core (строка не больше 64 байт)
   или через /proc/sys/kernel/core_pattern


Максимальный размер core файла задается через:
   ulimit -c 100
 
Как завести нового пользователя в FreeBSD в автономном режиме ? (1)   Автор: [обсудить]
 
Нужно использовать не команду adduser, а команду pw (man pw, pw useradd help). Например: 
  pw useradd -n логин -c 'комментарий, фио' -d /home/логин -m -s /bin/true
 
Какие программы в FreeBSD занимаются переиндексацией системных баз   Автор: [есть мнение]
 
/bin/sh MAKEDEV all  (dev_mkdb)
/usr/bin/newaliases
/usr/bin/cap_mkdb /etc/login.conf
/usr/sbin/pwd_mkdb -p /etc/master.passwd
 
Как создать рабочий дубликат Linux или FreeBSD системы.   Автор: [обсудить]
 
1. Монтируем новый жесткий диск.

2. Создаем разделы на новом диске с помощью fdisk (для freebsd /stand/sysintall или /usr/sbin/sysinstall). Создаем файловую систему.

3. Копируем файлы на новый диск (кроме каталога /mnt, не допускаем рекурсии !!!)
   find / -xdev | cpio -pdumv /mnt/new    - на каждый раздел.
   или tar cf - /bin /usr /etc д.р.| tar xf - -C /mnt/new
   или cd /mnt/new; dump -0u -f - /директории| restore -r -f -
   или cp -Raxv / /mnt/new  - на каждый раздел.
   или pax -r -w -p e / /mnt  (говорят копирует гораздо быстрее чем dump/restore)
   или просто копируем в Midnight Commander'е (не рекомендуется).

   Лучший способ - dump/restore или rsync, иначе можно потерять расширенные атрибуты и ACL.

4. Редактируем /mnt/new/etc/fstab

5. Создаем с помощью /dev/MAKEDEV недостающие устройства (для нового типа диска).

6. mkdir /mnt/new/proc /mnt/new/mnt

7a. Только для Linux: правка /etc/lilo.conf и запуск lilo -r /mnt/new -b /dev/hdb
   При возникновении ошибки при загрузке:
   Было:
   boot=/dev/sda
   default=linux-up
   image=/boot/vmlinuz-up
        label=linux-up
        root=/dev/sda2
        initrd=/boot/initrd-up.img
   
   Предположим, что дубликат размещен на /dev/sdb, тогда меняем boot=/dev/sda на boot=/dev/sdb
   и добавляем:
   disk=/dev/sdb
      bios=0x80
   
  Выполняем lilo -r /mnt/new и не забываем убирать исправления из lilo.conf.


7b. Для freebsd загрузчик устанавливается после разбиения диска на разделы через sysintall.
PS. Если диски одинаковые можно использовать dd if=/dev/hda of=/dev/hdb,
   если разделы одинаковые: dd if=/dev/hda1 of=/dev/hdb1
 

   FreeBSD специфика

Подключение FreeBSD к IPv6 - поднимаем туннель через IPv4-сети провайдера (1)   Автор: Litos  [есть мнение]
 
Итак, пришло время поднять IPv4-IPv6 gateway, чтобы ходить в мир "другого интернета", коим он скоро будет.

Самым простым способом получить IPv6 адрес оказалось получить подключение от http://go6.net

Идем на этот сайт и регистрируемся http://go6.net/4105/register.asp


Тут же они предлагают скачать софт и поставить, например для Windows вида "скачай и запусти"
http://go6.net/4105/download.asp

Но это не совсем наш метод, мы будем подключать сервер на FreeBSD 7.0 к этой сети.

Ядро у нас собрано с поддержкой IPV6, т.е. с options INET6 (ядро GENERIC уже 
поддерживает этот протокол и если вы его не отключали, значит, он у вас есть)

Итак, ставим клиента, то, что они предлагают скачивать - есть в портах

   Port:   gateway6-5.0_2
   Path:   /usr/ports/net/gateway6
   Info:   Gateway6 Tunnel Setup Protocol Client - Free IPv6 tunnel
   B-deps:
   R-deps:
   WWW:    http://www.go6.net/


Приступаем к установке:

   cd /usr/ports/net/gateway6
   make install clean

Буквально через несколько минут клиент будет установлен

Отредактируйте его конфигурационный файл /usr/local/etc/gw6c.conf

   userid=
   passwd=

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

На этом начальная настройка закончена, для дальнейшей настройки читайте документацию.

Как я понял, выдается целая сеть и для авторизованных пользователей http://go6.net/4105/freenet.asp, 
тем самым можно все компьютеры дома подключить на реальные статические IPv6 адреса.


   server=broker.freenet6.net

broker.freenet6.net - это имя сервера для подключения (написано в письме при регистрации)

   # Включить использование авторизации
   auth_method=any

   # Писать логи в syslogd
   log_syslog=3

Теперь осталось запустить его

   echo 'gateway6_enable="YES"' >> /etc/rc.conf
   /usr/local/etc/rc.d/gateway6 start

И смотрим


   # tail -f /var/log/messages
   Oct 17 18:39:38 lola gw6c: Gateway6 Client v5.0-RELEASE build Oct 17 2008-14:56:32
   Oct 17 18:39:38 lola gw6c: Establishing connection to tunnel broker broker.freenet6.net using reliable UDP.
   Oct 17 18:39:42 lola gw6c: Connection to broker.freenet6.net established.
   Oct 17 18:39:45 lola gw6c: Authentication success.
   Oct 17 18:39:45 lola gw6c: Got tunnel parameters from server. Setting up local tunnel.
   Oct 17 18:39:45 lola gw6c: Executing configuration script: /bin/sh "/usr/local/share/gateway6/freebsd.sh".
   Oct 17 18:39:46 lola gw6c: Script completed successfully.
   Oct 17 18:39:46 lola gw6c: Your IPv6 address is 2001:05c0:8fff:fffe:0000:0000:0000:c243.
   Oct 17 18:39:46 lola gw6c: The tunnel type is v6udpv4.


   # ifconfig

   tun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1280
        inet6 2001:5c0:8fff:fffe::c243 --> 2001:5c0:8fff:fffe::c242 prefixlen 128
        Opened by PID 873

   # traceroute6 www.jp.freebsd.org
   ...
   # ping6 www.jp.freebsd.org
   ...


Все прекрасно работает не смотря на то, что выход осуществляется в мир через  
NAT на модеме.

Итак, осталось только понять, "зачем это надо", но ясно одно - за этим будущее. 
А еще можно посмотреть на танцующую черепаху на http://www.kame.net/ :-)

Также рекомендую прочитать документацию (главу в 
HandBook http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/network-ipv6.html) 
по поддержке протокола IPv6 в системе FreeBSD.
 
Клонирование дисков во FreeBSD, используя снапшоты ФС   Автор: [есть мнение]
 
Создаем снапшот test1 раздела /home

   mount -v -u -o snapshot /home/snapshot/test1 /home

или другой метод:

   mksnap_ffs /home /home/snapshot/test1

Привязываем снапшот к устройству /dev/md1:

   mdconfig -a -t vnode -f /home/snapshot/test1 -u 1


При необходимости снапшот можно смонтировать и посмотреть его содержимое:

   mount -o ro /dev/md1 /mnt
   ....
   umount /mnt

Копируем содержимое раздела на второй диск:

   dd if=/dev/md1 of=/dev/ad4s1f bs=16k

Отключаем снапшот

   mdconfig -d -u 1

Выполняем fsck на новом разделе:

   fsck -f /dev/ad4s1f
 
ntpd на FreeBSD с подключением через PPP   Автор: Furcube  [есть мнение]
 
Есть компьютер с FreeBSD 7.0 (но должно работать и для остальных версий)
Подключение к интернету производится через pppoe. Провайдер раз в сутки обрывает подключение, 
соответственно при смене ip (он динамический) ntpd клинит - по команде ntpq -c pe 
в колонке refid для всех серверов будет .INIT.

Когда искал решение, наткнулся на следующий скрипт (немного модифицировал для FreeBSD):

#!/bin/sh
#
# reconfigNtpd, written by Jan Ceuleers, March 2003, revised October 2003
#
# Purpose: ntpd running on a machine that has intermittent connectivity to
#          the Internet, and that does not have a static public IP address,
#          loses its associations with public NTP servers, even after the
#          connection to the Internet has been restored.
#          Restarting the ntpd daemon is a possibility, but the downside
#          is that this causes time not to be served to local clients until
#          ntpd has regained synchronisation.
#          A better way is to configure at least one local clock (the local
#          clock 127.127.1.0 at high stratum and/or a refclock), to cover
#          for the periods when there is no Internet connectivity, and to
#          use this script to unconfig/add{server,peer} all public time
#          servers at runtime (i.e. without restarting the daemon)
#
# Usage: reconfigNtpd | ntpdc
#
# Bugs: * This script only generates unconfig/addpeer and unconfig/addserver
#         pairs. Any relevant fudge statements or iburst options etc. are
#         ignored.
#
#       * Location of keys file is hard-coded rather than being derived from
#         ntp.conf
#

###
#
# Get keyid and password from /etc/ntp/keys
#
###
set -- $(grep "^15" < /etc/ntp.keys)
echo keyid $1
echo passwd $3

###
#
# Derive unconfig commands from ntpdc output
#
###
ntpdc -n -p | awk '!/==/ && !/^ / { if (substr($1,2) !~ /^127.127./)
print "unconfig " substr($1,2) }'

###
#
# Derive addserver commands from /etc/ntp.conf
#
###
awk '/^server[[:blank:]]/ { if ($2 !~ /^127.127./) print "addserver " $2
}' /etc/ntp.conf

###
#
# Derive addpeer commands from /etc/ntp.conf
#
###
awk '/^peer[[:blank:]]/ { print "addpeer " $2 }' /etc/ntp.conf

echo quit

(источник - http://www.arda.homeunix.net/ntpsetup.html)

Записываем куда-нибудь, где не потеряется.

Конфиг ntpd следующего вида:
/etc/ntp.conf

server  <сервер>
server  <сервер>

logfile /var/log/ntp.log
driftfile /var/db/ntp.drift
statsdir /var/db/ntpstats/
keys /etc/ntp.keys
trustedkey 1 2 15
controlkey 15        # ntpq
requestkey 15        # ntpdc

Теперь надо сгенерить ключи для управления.
env RANDFILE=/dev/random ntp-keygen
В директории, где запускали ntp-keygen будет файл
 с ключами и симлинк ntpkey_MD5key_<название хоста>
В нём будут записаны 16 ключей надо взять содержимое этого файла и запихнуть его в /etc/ntp.keys

теперь (пере)запускаем ntpd
Для проверки делаем ./reconfigNtpd | ntpdc
Если про ошибки ничего не будет написано, значит всё хорошо.

Теперь цепляем это на ppp
Для этого пишем в файл /etc/ppp/ppp.linkup такое:


<название подключения>:
  !bg sh -c "sleep 5; <путь>/reconfigNtpd | ntpdc"

Задержку в 5 секунд сделал для того, чтобы ntpdc запустился после прописывания маршрута.
 
Настройка службы iSCSI на сервере FreeBSD (1)   Автор: Сгибнев Михаил  [есть мнение]
 
Q. Как я могу установить и настроить службу iSCSI на сервере FreeBSD ?

A. FreeBSD 7.x полностью поддерживает iSCSI. Старые версии, такие как  FreeBSD 6.3 требуют обратного 
портирования для поддержки iSCSI. Следущие инструкции приведены для настройки iSCSI только под FreeBSD 7.0.

FreeBSD iscsi_initiator driver

iscsi_initiator в ядре FreeBSD реализует страндарт сетевого протокола Internet SCSI (iSCSI), 
взаимодействует с пользовательским окружением iscontrol и обеспечивает доступ к удаленным виртуальным SCSI устройствам.

Компилирование драйвера

обратите внимание на то, что FreeBSD 7.x поставляется с уже скомпилированным драйвером. 
Вы можете пропустить этот шаг, если драйвер /boot/kernel/iscsi_initiator.ko 
уже присутствует в вашей системе.

Для компиляции ядра с драйвером, выполните следущее:

   # cd /usr/src/sys/i386/conf
   # cp GENERIC ISCSIKERNEL
   # vi ISCSIKERNEL

Вставьте строку:

   device iscsi_initiator


Сохраните и закройте файл конфигурации. Соберите ядро:

   # cd /usr/src
   # make buildkernel KERNCONF=ISCSIKERNEL

Установите ядро:

   # make installkernel KERNCONF=ISCSIKERNEL

Перезагрузите систему:

   # reboot

Установка драйвера iSCSI в FreeBSD

Нам необходим драйвер ядра FreeBSD для протокола iSCSI, который называется /boot/kernel/iscsi_initiator.ko.
Загрузите его можно с правами пользователя root следующей командой: 

   # kldload -v iscsi_initiator.ko

Вывод:


   Loaded iscsi_initiator.ko, id=6

Для загрузки драйвера во время начальной загрузки, поместите слудующую строку в /boot/loader.conf:

   # vi /boot/loader.conf

   # Beginning of the iSCSI block added by Vivek
   iscsi_initiator_load="YES"
   # End of the block added by Vivek

Сохраните и закройте файл.

Команда iscontrol для подключения, предоставления и контроля сессии iSCSI initiator.

Теперь нам необходимо использовать команду iscontrol. Сперва просмотрим сессии:

   # iscontrol -d targetaddress=iSCSI-SERVER-IP-ADDRESS initiatorname=nxl
   # iscontrol -v -d targetaddress=192.168.1.100 initiatorname=nxl

Пожалуйста,  запишите список доступных targetnames/targetadresses. Как только будет известно targetname,  
отредактируйте файл /etc/iscsi.conf:

  # vi /etc/iscsi.conf


Укажите директивы подобным образом:

   officeiscsi {
        authmethod      = CHAP
        chapIName       = YOUR-ISCSI-USERNAME
        chapSecret      = YOUR-ISCSI-PASSWORD
        initiatorname   = nxl
        TargetName      = iqn.XYZZZZZZZZZZZZZ #  whatever "iscontrol -v -d " gives you
        TargetAddress   = 192.168.1.100:3260,1 # your iscsi server IP
   }

Сохраните и закройте файл.

Где:

 officeiscsi { : Начало конфигурации iSCSI.
    authmethod : Установить в качестве метода аутентификации chap
    chapIName  : Имя 
    chapSecret : Пароль 
    initiatorname : Если не указано другое, то iqn.2005-01.il.ac.huji.cs:<hostname>
    TargetName : Имя, под которым будет изветен target. Не путайте его с target address, 
                  который назначается администратором или через поиск устройств. 
    TargetAddress : Имеет вид domainname[:port][,portal-group-tag] согласно RFC: 
                  domainname может быть определен как имя DNS, адрес IPv4 в десятичном представлении  
                  или IPv6 адрес, как указано в [RFC2732]. 
 } : Конец конфигурации


Старт сессии iSCSI

Следущие команды читают опции из /etc/iscsi.conf, используя targetaddress в блоке, 
называемом officeiscsi, и запускают сессию iscsi.

   # iscontrol -c /etc/iscsi.conf -n officeiscsi



Как только вы выполните команду iscontrol, должно создаться новое устройство в каталоге /dev. 
Для проверки выполним команду dmesg:

   # dmesg 

Форматируем диск iSCSI

Запустим sysinstall для форматирования обнаруженного устройства iSCSI:

   # sysinstall 

Выбираем Custom > 3 Partition > Выбираем устройство iSCSI по имени da1. После форматирования вводим:

   # mkdir /iscsi
   # mount /dev/da1s1 /iscsi 


Возможно вам понадобится обновить файл /etc/fstab:

   /dev/ad1s1 /iscsi ufs rw 3 3
 
Как избавиться от нечитаемых секторов на диске   Автор: [есть мнение]
 
В логе smartd появились подобные свидетельства наличия нечитаемых секторов на диске:

   smartd[798]: Device: /dev/ad5, 15 Currently unreadable (pending) sectors
   smartd[798]: Device: /dev/ad5, 15 Offline uncorrectable sectors

SMART тестирование подтвердило подозрения:

   Запускаем фоновый тест диска, не мешающий основной работе:
      smartctl -t long /dev/ad5
   Ждем завершения периодически просматривая статус:
      smartctl -l selftest /dev/ad5
   В итоге смотрим содержимое лога, в самом конце вывода:
      smartctl -a /dev/ad5
   Имеем:
   # 1  Extended offline  Completed: read failure  90% 2916 10373954

Выявляем полный список сбойных секторов, путем чтения всех данных с диска:

   dd if=/dev/ad5 of=/dev/null bs=512 conv=noerror,sync

В один прекрасный момент появятся надписи вида:

   dd: /dev/ad5: Input/output error
   10373954+0 records in
   10373954+0 records out
   5311464448 bytes transferred in 2427.397393 secs (2188131 bytes/sec)


В системном логе увидим:

   kernel: ad5: TIMEOUT - READ_DMA retrying (1 retry left)  LBA=10373954
   kernel: ad5: TIMEOUT - READ_DMA retrying (0 retries left) LBA=10373954
   ....
   kernel: ad5: FAILURE - READ_DMA timed out LBA=10374109
   kernel: ad5: TIMEOUT - READ_DMA retrying (1 retry left) LBA=10374113

Проверяем, каждый участок еще раз:

   dd if=/dev/ad5 of=/dev/null bs=512 count=1 skip=10373954 conv=noerror,sync

Смотрим какой файл в ФС подпадает под этот блок.

Смотрим и примерно вычисляем номер раздела на который приходится сбойный сектор (LBA 10373954):

   fdisk -s /dev/ad5

   /dev/ad5: 775221 cyl 16 hd 63 sec
   Part        Start        Size Type Flags
   1:          63   398444067 0xa5 0x80
   2:   398444130   382973535 0xa5 0x80

10373954 - 63 = 10373891

   disklabel /dev/ad5s1


   # /dev/ad5s1:
   8 partitions:
   #        size   offset    fstype   [fsize bsize bps/cpg]
     a:  2097152        0    4.2BSD     2048 16384 28552 
     b:  4194304  2097152      swap                    
     c: 398444067        0    unused    0  0 # "raw" part
     d:  2097152  6291456    4.2BSD     2048 16384 28552 
     e: 10485760  8388608    4.2BSD     2048 16384 28552 
     f: 104857600 18874368    4.2BSD     2048 16384 28552 
     g: 104857600 123731968    4.2BSD     2048 16384 28552 
     h: 162127234 228589568    4.2BSD     2048 16384 28552 

Видим, что 10373891 приходится на раздел /dev/ad5s1e
Расчитываем смещение относительно начала раздела:
10373891 - 8388608 = 1985283

Находим иноду, которой принадлежит заданный блок:
   fsdb -r /dev/ad5s1e
   findblk 1985283

повторяем для каждого сбойного сектора 
(для Linux нужно использовать debugfs - http://smartmontools.sourceforge.net/BadBlockHowTo.txt)

Пытаемся записать данные в сбойный сектор, чтобы инициировать процесс
ремапинга на диске.

    sysctl kern.geom.debugflags=16 # иначе будет dd: /dev/ad5: Operation not permitted)
    dd if=/dev/zero of=/dev/ad5 bs=512 count=1 skip=10373954 conv=noerror,sync
    sysctl kern.geom.debugflags=0

Если после записи сектор начал читаться - все ok, 

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

   man badsect


  /dev/ad5s1e примонтирован как /usr, создаем директорию /usr/BAD и выполняем
  badsect /usr/BAD 1985283
  fsck -y /dev/ad5s1e

Полезные порты:
   /usr/ports/sysutils/recoverdm 
   /usr/ports/sysutils/diskcheckd
 
Настройка работы Dell Wireless 1390 WLAN Mini-PCI Card во FreeBSD (1) (2)   Автор: Sokolov Alexey  [есть мнение]
 
Драйвера для данного беспроводного адаптера в ядре FreeBSD на данный (март 2008) не существует,
но я расскажу как сконвертировать windows-драйвера в ko-модуль.

1. качаем официальный драйвер: 

http://www.x-drivers.ru/component/option,com_remository/itemid,36/func,fileinfo/id,28277/

2. конвертируем его:

   %ndisgen bcmwl5.inf bcmwl5.sys

3. подгружаем полученный модуль:

   %kldload bcmwl5_sys.ko


Пожалуйста:

   % ifconfig -l
   em0 lo0 ndis0

   ndis0 - появившийся wifi-интерфейс.
 
Как восстановить работу после ошибки с ldconfig во FreeBSD (1)   Автор: Mamoru  [есть мнение]
 
Пытаясь добавить библиотеку libnsl запустил следующее:
   ldconfig -m /usr/compat/linux/lib/
теперь на любой ввод машина выдаёт:
   /libexec/ld-elf.so.1: Undefined symbol "__stdinp" referenced from COPY relocation in

Для того чтобы вернуться к нормальной работе:
1. грузимся в однопользовательский режим
2. монтируем Var #>mount -rw /var
3. правим хинты #>ldconfig /lib
4. монтируем Usr #>mount -rw /usr
5. добавляем для начального комплекта #>ldconfig -m /usr/lib и дальше по списку
/var/run/ld-elf.so.hints:

        search directories: /lib:/usr/lib:/usr/lib/compat:/usr/X11R6/lib:/usr/local/lib:/usr/local/lib/compat:\
   /usr/local/lib/compat/pkg:/usr/local/lib/mysql:/usr/local/lib/apache2
6. перегружаемся

Если необходимо загрузить библиотеки имеющие права записи для 
группы или с владельцом отличным от root, установите в YES для 
отключения проверок безопасности ldconfig (опция -i).
       ldconfig_insecure="NO"

Пути, по которым ищутся разделяемые библиотеки
    ldconfig_paths="/usr/lib/compat /usr/X11R6/lib /usr/local/lib \
    /usr/local/lib/compat/pkg /usr/compat/linux/lib"

Пути, по которым ищутся разделяемые библиотеки a.out
    ldconfig_paths_aout="/usr/lib/compat/aout /usr/X11R6/lib/aout /usr/local/lib/aout"
 
Сброс буфера системных сообщений FreeBSD (1)   Автор: mr-tacitus  [обсудить]
 
Сбросить буфер системных сообщений (вывод команды dmesg) можно с помощью sysctl:

   sysctl kern.msgbuf_clear=0
 
Ограничение скорости на интерфейсе средствами netgraph во FreeBSD (1)   Автор: Anton Yuzhaninov  [есть мнение]
 
Пример того как можно ограничить скорость на интерфейсе:

#!/bin/sh

kldload ng_ether
kldload ng_car

ngctl -f- <<-EOF
mkpeer re0: car lower lower
name re0:lower re0_car
connect re0: re0_car: upper upper
msg re0_car: setconf { upstream={ cbs=8192 ebs=65535 cir=100000 greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=8192 ebs=65535 cir=1000000 greenAction=1 yellowAction=1 redAction=2 mode=2 } }
EOF


Если считать что к re0 у нас подключен клиент, то upstream это трафик от клиента в инет,
downstream - трафик из инета к клиенту.

cir - скорость в битах в секунду (в мане опечатка)

mode=2 - это RED

цифры для cbs/ebs взяты с потолка. Рекомендации по поводу этих 
параметров можно поискать в инете по ключевым словам random early detection
можно тут посмотреть например
http://www.icir.org/floyd/REDparameters.txt
 
Остановка netgraph нод после mpd (1)   Автор: Roman Y. Bogdanov  [есть мнение]
 
С помощью этого маленького скрипта, можно выполнить освобождение netgraph нод, 
которые оставляет за собой упавший в "корку" MPD3.

#!/bin/sh

for j in "" 1 2 3 4 5 6 7 8 9 10 11 12; do
  for i in 0 1 2 3 4 5 6 7 8 9; do
    echo $j$i
    ngctl shutdown ng$j$i:
    ngctl shutdown mpd$1-pptp$j$i:
  done

done
 
Объединение сетевых интерфейсов при помощи протокола LACP во FreeBSD 7 (1)   Автор: s@sh@  [есть мнение]
 
Собираем ядро с поддержкой LACP (Link aggregation control protocol):
   device lagg

Объединяем интерфейсы em0 и em1:
   ifconfig em0 up
   ifconfig em1 up
   ifconfig lagg0 create
   ifconfig lagg0 up laggproto lacp laggport em0 laggport em1
   ifconfig lagg0 10.10.10.18 netmask 255.255.255.0
   route add -net 0.0.0.0 10.10.10.1 0.0.0.0

На Cisco и к каждому нужному интерфейсу прописываем:
   interface GigabitEthernet2/2
      .... 
      channel-protocol lacp
      channel-group 23 mode active
   
   interface GigabitEthernet2/16
      ....
      channel-protocol lacp
      channel-group 23 mode active
 
Установка неподдерживаемой сетевой карты ASUS NX1001 во FreeBSD 6.2   Автор: fenixfenix  [есть мнение]
 
При установке сетевой карточки Asus NX1001, я не смог обнаружить её при наборе
команды ifconfig. А также в sysinstall->Configure->Networking.
Первое, что мне пришло в голову конфликт с ACPI, после отключения в БИОСе ACPI -
результатов никаких не дало. Поэтому пришлось заняться поисками решения
этой проблемы копаясь в интернете, особо на сайте freebsd.org. Найдя похожую
проблему работы с сетевой картой Asus NX1001 в FreeBSD 6.2, вот что в итоге 
необходимо было сделать.

Набрав команду pciconf -lv и найдя среди результатов вывода 

"Sundance ST201 10/100BaseTX". 

Мне пришлось дописать в файлах:
/usr/src/sys/pci/if_ste.c
/usr/src/sys/pci/if_stereg.h
нижеследующее (строка AS_VENDORID...), в файле if_ste.c:


   static struct ste_type ste_devs[]={
      {ST_VENDORID, ST_DEVICEID_ST201,"Sundance ST201 10/100BaseTX"},

      {AS_VENDORID, AS_DEVICEID_NX1001,"ASUS NX1001 10/100BaseTX"},

     {DL_VENDORID, DL_DEVICEID_DL100050,"D-Link DL10050 10/100BaseTX"},
     {0,0,NULL}
   };


в файле if_stereg.h:

   #define AS_VENDORID 0x13F0
   #define AS_DEVICEID_NX1001 0x0200

После этого мы обязаны пересобрать наше старое ядро:

   cd /usr/src/sys/i386/conf/
   cp GENERIC GATEWAY
   ee GATEWAY
   config GATEWAY
   cd ../compile/GATEWAY
   make depend
   make
   make install
   shutdown -r now


В итоге в нашем случае появляется сетевая карточка в устройствах как sto0.
 
Импорт паролей и пользователей из Linux в FreeBSD   Автор: bytestore  [есть мнение]
 
Копируем в текущую директорию passwd и shadow файлы из Linux. Запускаем:
    ./mkpasswd.pl > new.master.passwd

Открываем файл new.master.passwd в текстовом редакторе и заменяем строки с описанием системных аккаунтов из /etc/master.passwd

Копируем new.master.passwd в /etc. Делаем бэкап /etc/master.passwd.
Перестраиваем хэши через запуск команды

   pwd_mkdb -p /etc/new.master.passwd

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



Скрипт mkpasswd.pl

#!/usr/local/bin/perl

# Listing 21.1. Sample Perl Script to Convert 
# a Linux User Database for Use in FreeBSD
# Set the following to the location of bash on your FreeBSD 
#machine (if installed),
# or to /bin/csh to switch /bin/bash users to csh

$newshell = "/bin/sh";

open ( PASS, '< ./passwd' );
@passwd = <PASS>;                  # Read in the passwd file
close PASS;
open ( SHAD, '< ./shadow' );
@shadow = <SHAD>;                  # Read in the shadow file
close SHAD;

foreach $user (@shadow) {

    @sdata = split(/:/,$user);
    $passhash{$sdata[0]} = $sdata[1];  # Make a lookup table based on usernames
}

foreach $user (@passwd) {
    @pdata = split(/:/,$user);
    $pdata[6] = $newshell."n" if ($pdata[6] eq "/bin/bashn");
    $pdata[1] = $passhash{$pdata[0]};  # Replace the "x" with the password hash
    splice (@pdata,4,0,undef,"0","0"); # Splice in extra blank fields

    foreach (@pdata) {                 # Print the combined output line
	    print "$_";
	    print ":" unless ($_ =~ /n/);
    }
}

откуда взял скрипт непомню :(
 
3 шага для перехода на UTF-8 во FreeBSD (1)   Автор: Sokolov Alexey  [есть мнение]
 
1. в ~/.xinitrc пишем (именно сюда а не в /etc/profiles потому как
системная консоль FreeBSD не поддерживает юникод, посему локаль сия
будет использоваться только в иксах):

  export LANG='ru_RU.UTF-8'
  export LC_ALL='ru_RU.UTF-8'

2. выполняем конвертацию содержимого файловой системы из koi8-r в
UTF-8 (необходим порт converters/convmv):

   %convmv -f koi8-r -t UTF-8 путь_к_разделу/* --notest -r


3. далее все зависит от терминала, если у вас что-то вроде
gnome-terminal, то достаточно будет сменить кодировку в опциях на
UTF-8, если же у вас что-то вроде xterm'а, тогда в ~/.Xresources
необходимо будет поменять шрифт, например так (для этого шрифта
необходим пакет x11-fonts/terminus-font):

   XTerm*font: -*-terminus-medium-*-*-*-*-*-*-*-*-iso10646-1

для syscons(4) на i386:

1. ставим sysutils/jfbterm и textproc/uim-m17nlib
2. меняем стандартную переключалку языка с Shift+Space на Ctrl+\
   добавлением в ~/.uim

	(define-key generic-on-key? "<Control>\\")
	(define-key generic-off-key? "<Control>\\")

3. ставим локаль и добавляем запуск uim-fep и jfbterm в ~/.profile
	export LANG=ru_RU.UTF-8
	exec jfbterm -e uim-fep
   или в ~/.login (для tcsh)
	setenv LANG ru_RU.UTF-8
	exec jfbterm -e uim-fep

 
Настройка управления FreeBSD сервера через COM порт (1)   Автор: LM  [есть мнение]
 
Что надо сделать на FreeBSD сервере:

1. Подключаем COM1 кабель

2. Заходим под root и пишем:
   echo "-Dh" > /boot.config

3. В файле /etc/ttys заменяем строчку
   ttyd0 "/usr/libexec/getty std.9600" dialup off secure
на
   ttyd0 "/usr/libexec/getty std.9600" vt100 on secure


4. Перезагружаем FreeBSD.

Что надо сделать на Windows XP машине (клиент):

1. Start -> All Programs -> Accessories -> Communications -> HyperTerminal

2. В открывшемся окне New Connections в поле Name пишем что нить типа freebsd-serial

3. В окне Connect To выбираем номер ком-порта (к примеру COM1)

4. В окне COMx Properties на вкладке Port Settings надо выставить следующие значения:
   Bits per second: 9600
   Data bits: 8
   Parity: None
   Stop bits: 1
   Flow control: Xon / Xoff
и на жать на кнопку ОК

5. Соединение установиться. Далее можно сохранить File -> Save.

6. Можно работать.

Что нужно сделать если в место Windows XP для управления используется соседняя FreeBSD машина:

в зависимости от версии FreeBSD:
   cu -s 9600 -l /dev/cuad0
   cu -s 9600 -l /dev/cuaa0


где cuaaX/cuaaX устройства ком порта
 
Обзор небольших полезных утилит под FreeBSD (1)   Автор: Денис Юсупов  [есть мнение]
 Пришла мысль упорядочить немного список утилиток из портов, которые облегчают жизнь админа FreeBSD.
  • arpwatch - для мониторинга изменений mac/ip-адресов;
  • port-maintenance-tools - набор утилит для работы с портами (portupgrade, portinstall и др.);
  • portaudit - позволяет автоматически проверить перед установкой какого-либо порта, не числится ли он в базе уязвимостей.
  • screen - для работы с виртуальными консолями
  • mbmon, healthd для мониторинга температуры, вольтажа и оборотов
  • arping- "пингует" компьютеры arp-запросами, позволяя определить, находится ли комп в локальной сети даже если у последнего установлен файервол.
  • fastest_cvsup - нахождение самого быстрого cvsup сервера для обновления портов и/или сырцов системы.
  • cvsup-without-gui - собственно, сам клиент для обновления.
  • nmap - сетевой сканер портов.
  • sudo - для настройки рутовых привилегий, выдаваемых другим пользователям без необходимости сообщать рутовый пароль.
  • vim (vim-lite) - редактор. Совмещает удобства vi и привычки с "обычных" редакторов
  • yawho - показывает, кто сидит, откуда и что запущено и т.п. Напоминает "w", но поудобнее.
  • whowatch - очень удобная утилитка для просмотра в реальном времени процессов других залогиненных пользователей и элементарных операций (посылка сигналов kill, разлогинивание и т.д.)
  • mtr - утилита, обьединяющая наподобии виндового "pathping" команды traceroute и ping. Весьма удобна для проверки сети.
  • lynx-ssl - браузер с поддержкой ssl, работающий в текстовом режиме. Удобен. Полезен при проверке корректности html кода.
  • elinks - продвинутая версия lynx. Встроенный менеджер закачек, готовность к работе на русском языке без дополнительных телодвижений
  • ipcalc - Сетевой калькулятор. Противопоказан людям, готовящимся к сдачи CCNA и рассчитывающим все сети вручную ;-)
  • apg - Удобный генератор случайных паролей.
  • pwgen2 - Ещё один удобный генератор.
 
Почему некоторые rcNG-скрипты не останавливают процесс   Автор: minotaur  [есть мнение]
 
В ОС FreeBSD иногда появляется проблема, когда rcNG-скрипт запускает процесс 
(процесс запускается нормально, pid-файл создается, с правами все в порядке),
 но не хочет его останавливать. Например, SpamAssassin:

  # /usr/local/etc/rc.d/sa-spamd start
  Starting spamd.
  # ls -l /var/run/spamd/spamd.pid
  -rw-r--r--  1 root  spamd  6  1 авг 08:37 spamd.pid
  # /usr/local/etc/rc.d/sa-spamd stop
  spamd not running? (check /var/run/spamd/spamd.pid)


Причина проблемы не очевидна, решение находится из man ps: 
если длина аргументов больше значения переменной ядра kern.
ps_arg_cache_limit, то ps показывает не полную строку запуска процесса, 
а лишь само имя процесса в квадратных скобках. И бывают случаи (как в SpamAssassin), 
когда имя процесса не совпадает с именем в rcNG-скрипте (переменная name). 
Поэтому rcNG-скрипт не обнаруживает запущенного ним процесса в выводе ps.

Решение - увеличить значение переменной ядра kern.ps_arg_cache_limit в sysctl.conf.

Замечание:

Если в rc.conf в spamd_flags присутствует --debug, то rcNG-скрипт работать не будет, 
потому что в этом случае вывод ps axww меняется. 
Например вместо:

68514  ??  Ss     0:11,27 /usr/local/bin/spamd --siteconfigpath=/usr/local/etc/mail/spamassassin 
   -x -d -l --max-conn-per-child=128 --timeout-tcp=10 --timeout-child=300 
   --pidfile=/var/run/spamd/spamd.pid --syslog=local0 --username=spamd --groupname=spamd
   --allowed-ips=127.0.0.0/8 --listen-ip=127.0.0.1 -d -r /var/run/spamd/spamd.pid (perl5.8.8)

получаем

68514  ??  Ss     0:11,27 /usr/local/bin/perl -T -w /usr/local/bin/spamd 
   --siteconfigpath=/usr/local/etc/mail/spamassassin -x -d -l --max-conn-per-child=128 
   --timeout-tcp=10 --timeout-child=300 --pidfile=/var/run/spamd/spamd.pid --syslog=local0 
   --username=spamd --groupname=spamd --allowed-ips=127.0.0.0/8 --listen-ip=127.0.0.1 --debug 
   received-header -d -r /var/run/spamd/spamd.pid 

Решение этой проблемы - правка rc.subr, что есть дело нелегкое. И проще помнить про этот нюанс.
 
Инструкция по включению журналирования в UFS2. (1)   Автор: Sokolov Alexey  [есть мнение]
 
Требуется создать журналируемую файловую систему UFS2 объемом более 1 Гб на FreeBSD 6.1-STABLE.

Для начала необходимо обновить дерево исходных текстов (/usr/src) до стабильной версии.
После чего переходим в каталог /usr/src и создаем там необходимые директории:

   # cd /usr/src
   # mkdir {sbin/geom/class/journal,sys/geom/journal,sys/modules/geom/geom_journal}

Теперь качаем сам патч:

   # fetch http://people.freebsd.org/%7Epjd/patches/gjournal6.patch


Накладываем его на исходные тексты:

   # patch < gjournal6.patch

Компилируем и ставим geom_journal (возможно имеет смысл пересобрать весь мир):

Далее есть два пути - пересобрать весь "мир" (см. файл /usr/src/UPDATING), либо пересобрать только то, что было модифицировано. 
Предпочтительней первый путь, однако можно обойтись и без него. Для этого пересоберите следующие утилиты 
(зайдя в нижеперечисленные каталоги и выполнив в каждом из них 'make; make install; make clean'):

   /usr/src/include/
   /usr/src/sbin/geom/class/
   /usr/src/sbin/mount/

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

   options UFS_GJOURNAL

Компилируем ядро, ставим, перезагружаемся...

После перезагрузки подгружаем необходимый модуль командой


   # gjournal load

либо:

   # kldload geom_journal.ko

(команды эквивалентны)

Далее нам необходимо размонтировать раздел, на который мы собираемся поставить журнал. 
Пусть это будет '/dev/ad0s3d' и точка монтирования '/mnt/work':

   # umount -f /mnt/work

Теперь собстенно "прикручиваем" журнал:

   # gjournal label /dev/ad0s3d

Монтируем командой:

   # mount -o async,gjournal /dev/ad0s3d.journal /mnt/work


NB! префикс '.journal' появляется при наличии в памяти модуля geom_journal.ko. 
Поэтому, если вы захотите чтобы система автоматически монтировала раздел с поддержкой журнала: 
пропишите в файл /boot/loader.conf строчку:

   geom_journal_load="YES"

и соответствующую запись в fstab. Для данного примера она будет выглядеть так:

   /dev/ad0s3d.journal   /mnt/work   ufs   rw,async,journal   2   2

Все, готово!

(C) 2006 Sokolov Alexey <nullbsd at gmail.com>
 
Новый способ использования NDIS во FreeBSD 5.x и 6.x  (1)   Автор: Kond  [есть мнение]
 
Все статьи на opennet описывают создание модуля NDIS для FreeBSD старым методом:

   ndiscvt -i *.inf -s *.sys -o ndis_driver_data.h

Данный способ уже давно устарел и теперь нужно использовать программу ndisgen.

Например. Имеем файлы из комплекта Windows драйверов:
   Fw1130.bin -  Network interface firmware.
   FwRad16.bin -  Radio firmware.
   TNET1130.INF -  Driver information file.
   tnet1130.sys - Driver binary. 

Старый способ:

   cd /sys/modules/ndis
   make depend
   make
   make install
   cd ../if_ndis
   ndiscvt -i TNET1130.INF -s tnet1130.sys  -f Fw1130.bin -o ndis_driver_data.h
   make depend
   make
   make install
   ndiscvt -f FwRad16.bin
   cp FwRad16.bin.ko /boot/kernel
   kldload FwRad16.bin
   kldload if_ndis

Для автоматизации загрузки помещаем в /boot/loader.conf
   FwRad16.bin_load="YES"
   if_ndis_load="YES"

Новый способ (не требует установки исходных текстов ядра):
   ndisgen
   ... отвечаем на интерактивные вопросы, на выходе получаем tnet1130_sys.ko
   cp tnet1130_sys.ko /boot/kernel/
   kldload ndis
   kldload if_ndis
   kldload tnet1130_sys


Для автоматизации загрузки помещаем в /boot/loader.conf
   ndis_load="YES"
   if_ndis_load="YES"
   tnet1130_sys_load="YES"
 
Пример настройки ng_neflow для нескольких интерфейсов.   Автор: stalex  [есть мнение]
 
#cat ng5_netflow.sh

   #!/bin/sh

   kldload ng_netflow
   kldload ng_ether
   kldload ng_tee
   kldload ng_one2many

   /usr/sbin/ngctl -f- <<-SEQ
     mkpeer em2: tee lower right
     connect em2: em2:lower upper left
     name em2:lower em2_tee
     mkpeer  em2:lower netflow  right2left iface0
     name em2:lower.right2left netflow
     msg netflow: setifindex { iface=0 index=1 }
     connect em2:lower netflow: left2right iface1
     msg netflow: setifindex { iface=1 index=1 }

     mkpeer vlan254: tee lower right
     connect vlan254: vlan254:lower upper left
     name vlan254:lower vlan254_tee
     connect vlan254:lower netflow:  right2left iface3
     msg netflow: setifindex { iface=3 index=1 }
     connect vlan254:lower netflow: left2right iface4
     msg netflow: setifindex { iface=4 index=1 }


     mkpeer vlan22: tee lower right
     connect vlan22: vlan22:lower upper left
     name vlan22:lower vlan22_tee
     connect vlan22:lower netflow:  right2left iface5
     msg netflow: setifindex { iface=5 index=1 }
     connect vlan22:lower netflow: left2right iface6
     msg netflow: setifindex { iface=6 index=1 }

     mkpeer vlan21: tee lower right
     connect vlan21: vlan21:lower upper left
     name vlan21:lower vlan21_tee
     connect vlan21:lower netflow:  right2left iface7
     msg netflow: setifindex { iface=7 index=1 }
     connect vlan21:lower netflow: left2right iface8
     msg netflow: setifindex { iface=8 index=1 }

     mkpeer netflow: ksocket export inet/dgram/udp
     msg netflow:export connect inet/127.0.0.1:20001
   SEQ
 
В двух словах про включение NAT и Firewall в ОС FreeBSD (1)   Автор: hub.ru  [есть мнение]
 
Что бы поднять NAT и Firewall на FreeBSD надо:

Скомпилировать ядро:
Следующие строки нужно включить в /usr/src/sys/i386/conf/GENERIC файл конфигурации:

   options IPFIREWALL
   options IPDIVERT
   options IPFIREWALL_VERBOSE
   options IPFIREWALL_VERBOSE_LIMIT=10
   options DUMMYNET
   options TCP_DROP_SYNFIN

Переходим в директорию /usr/src/
   make buildkernel KERNCONF=GENERIC
   make installkernel KERNCONF=GENERIC


Следующие строки можно к примеру включить в rc.conf файл конфигурации:

   hostname="free"
   ifconfig_rl0="10.0.0.1"
   gateway_enable="YES"
   firewall_enable="YES"
   firewall_type="open"
   natd_enable="YES"
   natd_interface="rl0"
   natd_flags="-redirect_port tcp 10.0.0.10:80 80"
   tcp_extensions="NO"
   tcp_drop_synfin="YES"
   icmp_drop_redirect="YES"
   sendmail_enable="NONE"

Для удаленного управления нужно добавить следующую строку:
   sshd_enable="YES"
(возможно понадобится скопировать /etc/ssh/ssh_host_dsa_key.pub в /root/.ssh/authorized_keys

Следующие строки можно включить в rc.firewall файл конфигурации (секция "open"):

   [Oo][Pp][Ee][Nn])
   oif="rl0"
   iif="tx0"
   oip="132.5.7.172"
   iip="10.0.0.1"
   lan="10.0.0.0/24"
   setup_loopback
   # allow all for LAN
   ${fwcmd} add 500 pass all from ${lan} to ${iip} via ${iif}
   ${fwcmd} add 550 pass all from ${iip} to ${lan} via ${iif}
   # download - 60K upload - 6K for all lan ip's
   ${fwcmd} add 600 pipe 1 ip from any to any in via ${oif}
   ${fwcmd} add 650 pipe 2 ip from any to any out via ${oif}
   # for selected ip's only
   # ${fwcmd} add 601 pipe 1 all from any to 10.0.0.10
   # ${fwcmd} add 651 pipe 2 all from 10.0.0.10 to any
   ${fwcmd} pipe 1 config bw 512Kbit/s
   ${fwcmd} pipe 2 config bw 48Kbit/s
   # dns setup
   ${fwcmd} add 770 pass tcp from any to ${oip} 53 setup
   ${fwcmd} add 780 pass udp from any domain to any
   ${fwcmd} add 790 pass udp from any to any domain
   # main setup
   ${fwcmd} add 800 pass tcp from any http,https,20-21,989-990 to any
   ${fwcmd} add 810 pass tcp from any to any http,https,20-21,989-990
   ${fwcmd} add 830 pass tcp from any pop3,pop3s,smtp,imap,imaps,aol to any
   ${fwcmd} add 840 pass tcp from any to any pop3,pop3s,smtp,imap,imaps,aol
   ${fwcmd} add 65000 deny ip from any to any
   ;;
 
Где oip, oif - внешний интерфейс; iip, iif - внутренний; lan - внутренняя сеть.

Такая конфигурация ipfw весьма параноидальна, и здесь приведена только в качестве примера. 
На практике обычно нужен более открытый фаервол. 
 
Работа с DVD-RAM во FreeBSD как с жестким диском (1)   Автор: proff  [есть мнение]
 
Решение такое:

1. сборка и инсталляция ядра с устройствами:

   device scbus
   device atapicam
   device cd
   device pass

2. создание файлов устройств cd0, cd1 с помощью /dev/MAKEDEV

3. disklabel -rw cd1c auto

4. newfs cd1c
4.1. Можно включить softupdates: tunefs -n enable cd1 

5. mount /dev/cd1c /mnt/dvdram

Все. Скорость записи ~ 1.2 Mb/s. 
 
Решение проблем подергиванием звука в FreeBSD   Автор: Roman Y. Bogdanov  [есть мнение]
 
Решение проблем с "лаганием", "залипанием", "подергиванием" звука для FreeBSD 5.x при сильных нагрузках на ata систему:

в /boot/loader.conf добавить строку 

   hint.pcm.0.buffersize="16384".

Работает не со всеми звуковыми картами. Карточка с MediaForte чипом стала играть звук в 4 раза быстрее, 
на SoundBlaster 5.1 live все играет замечательно.
 
Создание снапшота UFS2 в FreeBSD 5 (1)   Автор: [есть мнение]
 
   mount -u -o snapshot ./snapshot_image /var
   mdconfig -a -t vnode -f ./snapshot_image -u 1
   mount -o ro /dev/md1 /mnt/snap
   ...
   umount /mnt/snap
   mdconfig -d -u 1

Также можно использовать специализированную утилиту snapshot,
 представляющую собой фронтенд к mount и mdconfig.
 
Настройка эмуляции Linux во FreeBSD (1)   Автор: sTALker150379  [обсудить]
 
Добавляем в /boot/loader.conf:
    linux_load="YES"
    linprocfs_load="YES"


В /etc/fstab:
    linprocfs /compat/linux/proc linprocfs rw 0 0

/etc/rc.conf
    linux_enable="YES"

/etc/sysctl.conf
    kern.fallback_elf_brand=3
 
Создание пользователя для отключения компьютера в FreeBSD.   Автор: Stas_Dragon  [есть мнение]
 
Создание специальной учетной записи пользователя для отключения компьютера.

Задача:

Создать учетную запись пользователя, которому разрешено только отключать компьютер. ОС FreeBSD 5.2
создать в папке /bin скрипт poweroff-shell со следующим содержанием:

   #!/bin/sh
   shutdown -p +2 Turn off by user $LOGNAME
   logger Turn off by user $LOGNAME
   exit 0 


установить разрешения:
   chmod 750 /bin/poweroff-shell

сменить группу и владельца:
   chown root /bin/poweroff-shell
   chgrp operator /bin/poweroff-shell

добавить в файл /etc/shells строчку:
   /bin/poweroff-shell

создать пользователя poweroff:
c шелом /bin/poweroff-shell, домашней директорией /nonexistent, 
сделать пользователя poweroff членом группы operator, с паролем по вкусу.
 
Использование нескольких источников звука в FreeBSD (1)   Автор: lavr  [есть мнение]
 
Для одновременного воспроизведения звука от разных приложений 
нужно создать несколько виртуальных звуковых каналов:

   sysctl hw.snd.pcm0.vchans=4
   sysctl hw.snd.maxautovchans=4

Если devfs не используется, в приложении нужно обращаться к устройствам /dev/dsp0.N
, где N -  номер свободного канала.

Для установки громкости звука по умолчанию в FreeBSD 5.3 в /boot/device.hints добавляем:
   hint.pcm.0.vol="100"
 
Объединение сетевых интерфейсов под FreeBSD 5.x (1)   Автор: Мишка  [есть мнение]
 
Превращение двух 100 мбит/c сетевых карт в одну виртуальную, с пропускной способностью 200 мбит/c .

  kldload /boot/kernel/ng_ether.ko
  kldload /boot/kernel/ng_one2many.ko
  ifconfig rl0 up
  ifconfig rl1 up
  ngctl mkpeer rl0: one2many upper one
  ngctl connect rl0: rl0:upper lower many0
  ngctl connect rl1: rl0:upper lower many1
  ngctl msg rl1: setpromisc 1
  ngctl msg rl1: setautosrc 0
  ngctl msg rl0:upper \
        setconfig "{ xmitAlg=1 failAlg=1 enabledLinks=[ 1 1 ] }"
  ifconfig rl0 inet 192.168.0.78 
 
Создание файла подкачки (swapfile) в FreeBSD (1)   Автор: [есть мнение]
 
Для FreeBSD 4.x
   В /boot/loader.conf добавляем vn_load="YES" 
   cd /dev; sh MAKEDEV vn0
   dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
   chmod 0600 /usr/swap0
   В /etc/rc.conf добавляем swapfile="/usr/swap0" 
   Для активации без перезагрузки: 
       vnconfig -e /dev/vn0b /usr/swap0 swap


Для FreeBSD 5.x
   dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
   chmod 0600 /usr/swap0
В /etc/rc.conf добавляем swapfile="/usr/swap0"
   Для активации без перезагрузки:  
       mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0
 
Включение поддержки IPv6 в FreeBSD (1)   Автор: [обсудить]
 
Ядро:
  options         INET6           # IPv6 communications protocols
  pseudo-device   gif             # IPv6 and IPv4 tunneling
  pseudo-device   faith   1       # IPv6-to-IPv4 relaying (translation)

Регистрация и получение IP (http://www.freenet6.net или http://www.tunnelbroker.net)

  cd /usr/ports/net/freenet6/
  # make install clean
  # /usr/local/etc/rc.d/freenet6.sh start

Подъем IPv6 вручную
  ifconfig gif0 create 
  ifconfig gif0 tunnel your-local-ipv4  remote-ipv4-of-your-broker
  ifconfig gif0 inet6  ipv6-given-by-the-broker ipv6-of-your-broker   prefixlen 128
  route -n add -inet6 default ipv6-of-your-broker

/etc/rc.conf:
  ipv6_enable="YES"
  ipv6_defaultrouter="brokeripv6"
  ipv6_gateway_enable="YES"
  ipv6_network_interfaces="de0 gif0"
  ipv6_ifconfig_gif0="brokeripv6 prefixlen 128"
  ipv6_ifconfig_de0="youripv6::1 prefixlen 64"
  ipv6_static_routes="global"
  ipv6_route_global="2000:: -prefixlen 3 youripv6"
  gif_interfaces="gif0"
  gifconfig_gif0="youripv4 brokeripv4"

Фаервол (Ipfilter):
  /etc/ipf6.rules
     pass in all
     pass out all
  ipf -6 -f /etc/ipf6.rules
 
Звук в FreeBSD 4.9 на nForce2 Ultra 400   Автор: axbat  [есть мнение]
 
Для работы со встроенным кодеком не надо загружать драйверов с сайта Avance Logic, достаточно:
- в boot/loader.conf в разделе Sound modules включить загрузку 
    snd_ich_load="YES"		# Intel ICH 

после этого убедиться, что все определилось: 
    dmesg | grep pcm0
 
Как включить поддержку ACL в UFS2 FreeBSD 5 (1)   Автор: [есть мнение]
 
В single mode: "/sbin/tunefs -a enable /fs"
Пересобираем ядро с "options UFS_ACL"
  getfacl - просмотр ACL
  setfacl - установка ACL
Например: setfacl -m user:nobody:rw-,group:wheel:rw- acl-test
 
Как в FreeBSD добавить/убрать алиас для сетевого интерфейса   Автор: [есть мнение]
 
Добавить: ifconfig fxp0 inet 192.168.1.1 netmask 255.255.255.255 alias
Убрать: ifconfig fxp0 inet 192.168.1.1 netmask 255.255.255.255 -alias
 
Как подключить USB Flash накопитель в FreeBSD (1)   Автор: [есть мнение]
 
man umass
Конфигурация ядра (FreeBSD 4.8 можно не пересобирать):
  device usb
  device ohci (OR device uhci)
  device umass
  device scbus
  device da
  device pass
В логе смотрим подобное сообщение "da0 at umass-sim0 bus 0 target 0 lun 0"
Монтируем:
  mount -t msdos /dev/da0s1 /mnt
 
Установка дисковых квот в FreeBSD (1)   Автор: Igor  [обсудить]
 
- в конфигурации ядра включаем "options QUOTA" и пересобираем ядро.
- в /etc/rc.conf прописываем enable_quotas="YES" и check_quotas="YES"
- указываем в fstab файловые системы, для которых будет включаться
поддержка квот, например:
          /dev/da0s1e /home ufs rw,userquota  2  2
          /dev/ad0s1h  /new_home ufs  rw,groupquota 2 2
- устанавливаем квоты для пользователей при помощи edquota, напр. "edquota user1"
- если нужно установить одинаковые квоты для нескольких пользователей как у user1:
      edquota -p user1 user2 user3 user4 user5
 
Использование в FreeBSD IEEE 802.1Q VLAN'ов совместно с Cisco Catalyst Switch   Автор: [есть мнение]
 
В конфигурации FreeBSD ядра:
    pseudo-device vlan 20 # VLAN support (для динамической генерации в новых версиях - 20 можно не писать)
Поднимаем VLAN вручную (где 28 - vlan id на свиче, fxp0 - интерфейс воткнутый в свитч):
    ifconfig vlan0 inet 192.168.1.3 netmask 255.255.255.0 vlan 28 vlandev fxp0
Прописываем в /etc/rc.conf:
  cloned_interfaces="vlan0"
  ifconfig_vlan0="inet 192.168.1.3 netmask 255.255.255.0 vlan 28 vlandev fxp0"
На коммутаторе Cisco Catalyst:
    interface FastEthernet0/1  # линк к FreeBSD
        switchport mode trunk
    interface FastEthernet0/2
        switchport access vlan 28
 
Как примонтировать iso-образ CD диска в FreeBSD   Автор: [есть мнение]
 
В /boot/loader.conf добавляем vn_load="YES" или подгружаем руками kldload vn.ko
Монтируем:
    vnconfig /dev/vn0c /home/user/cdrom.iso
    mount -t cd9660 /dev/vn0c /mnt

Размонтируем:
    umount /mnt
    vnconfig -u /dev/vn0c
 
Как разрешить в FreeBSD монтировать CD-ROM обычным пользователям (1)   Автор: [есть мнение]
 
/etc/sysctl.conf:
   vfs.usermount=1
   vfs.generic.usermount=1
mount -t cd9660  /dev/acd0c /home/user/cdrom
chmod 644 /dev/acd0c
 
Как примонтировать в FreeBSD CD-ROM с русифицированной FS, чтобы русские буквы не выглядели как вопросительные знаки.   Автор: lavr  [есть мнение]
 
cd /usr/ports/sysutils/cd9660_unicode
make && make install
грузить модуль через
   kldload /lib/cd9660_unicode/cd9660_[unicode|koi8-r|iso-8859-5|cp866].ko
 
Как включить поддержку SMBFS в FreeBSD и примонтировать удаленный windows ресурс.   Автор: [есть мнение]
 
пересобираем ядро:
  options NETSMB	      #SMB/CIFS requester
  options NETSMBCRYPTO  #encrypted password support for SMB
  options LIBMCHAIN     #mbuf management library
  options LIBICONV
  options SMBFS
Коннектимся к удаленному SMB серверу:

   smbutil login //jwarner@smbserver1
Монтируем русурс:
   mount_smbfs -N //jwarner@smbserver1/sharename /backup
Отсоединяемся от SMB сервера:
   smbutil logout //jwarner@smbserver1
 
Как завести нового пользователя в FreeBSD в автономном режиме ? (1)   Автор: [обсудить]
 
Нужно использовать не команду adduser, а команду pw (man pw, pw useradd help). Например: 
  pw useradd -n логин -c 'комментарий, фио' -d /home/логин -m -s /bin/true
 
Что иногда следует избыточно создать в '/dev' для FreeBSD (1)   Автор: lavr  [обсудить]
 
MAKEDEV - ad0 ad1 ad2 ad3 ... - default=0,...,3 остальное+slices руками
MAKEDEV ptyN - псевдо-терминалы, default==32
MAKEDEV vtyN - виртуальные терминалы через syscons, defaul==12
MAKEDEV iic  - создание устройств для I2C 
MAKEDEV smb  - создание устройств для SMBus шины
MAKEDEV snd  - создание устройств для SoundBlaster
 
Как в FreeBSD при загрузке в single read-olny переключится в RW режим.   Автор: [обсудить]
 
mount -u -w /
 
Какие программы в FreeBSD занимаются переиндексацией системных баз   Автор: [есть мнение]
 
/bin/sh MAKEDEV all  (dev_mkdb)
/usr/bin/newaliases
/usr/bin/cap_mkdb /etc/login.conf
/usr/sbin/pwd_mkdb -p /etc/master.passwd
 
Как на сервере обеспечить подключение PS/2 клавиатуры, без перезагрузки   Автор: [есть мнение]
 
Для того чтобы на загруженный без PS/2 клавиатуры сервер, можно было в любой момент подключить клавиатуру 
без перезагрузки, нужно в конфигурации ядра заменить строку:
   device          atkbd0  at atkbdc? irq 1 flags 0x1

на
   device          atkbd0  at atkbdc? irq 1
Т.е. убрать 'flags 0x1' и тем самым разрешить загружать драйвер клавиатуры
 при отключенной в момент загрузки клавиатуре.
 
Как в FreeBSD более подробно ознакомится с поддержкой аппаратного устройства   Автор: [обсудить]
 
man 4 имя_устройства.
примеры: man 4 fxp; man 4 rl; man 4 ed; man 4 amr; man 4 pcm; man 4 cd; man 4 tty; man 4 sio;
 
Как переключить сетевую карту в FreeBSD из full-duplex в half-duplex   Автор: [есть мнение]
 
Текущий режим работы сетевой карты можно посмотреть выполнив:
# ifconfig fxp0 
Перевести сетевую карту в режим работы 10baseT/UTP half-duplex:
# ifconfig fxp0 media 10baseT/UTP mediaopt half-duplex
Автоматически выбрать режим:
# ifconfig fxp0 media autoselect
Подробнее: man 4 ed, man 4 rl, man 4 fxp
 
Как правильно прописать сменные накопители в /etc/fstab для FreeBSD.   Автор: Insane  [есть мнение]
 
/dev/acd0c /mnt/cdrom cd9660 ro,noauto,-W=koi2dos,
-L=ru_RU.KOI8-R 0 0
/dev/fd0 /mnt/flop msdos rw,noauto,-W=koi2dos,
-L=ru_RU.KOI8-R 0 0
/dev/ad0s2 /mnt/store msdos rw,-W=koi2dos,
-L=ru_RU.KOI8-R,noexec,nosuid,nosymfollow,
-u0,-g0,-m 660  0 0
Еще для удобства можно создать симлинки типа:
ln -sf /dev/acd0c /dev/cdrom
ln -sf /dev/acd1c /dev/cdrom1 (если есть второй cdrom)
ln -sf /dev/fd0 /dev/flop
прописать изменения в fstab,
и монтировать диски командой mount /dev/cdrom а не
mount /dev/acd0c =).
 

   Сис. информация, оптимизация и тюнинг FreeBSD

Параметры распределение памяти для ядра FreeBSD (1)   Автор: Yar Tikhiy  [обсудить]
 
Такой вопрос обычно возникает вслед за желанием оптимизировать распределение памяти в ядре.

Для начала стоит понять, как в общем выглядит виртуальное адресное пространство FreeBSD. В его нижней части расположен текущий процесс,
а верхнюю всегда занимает ядро. Отрезок виртуального адресного
пространства, занятый ядром, -- kernel virtual memory (KVM) он же kernel
virtual address space (KVA) -- ограничен адресами KERNBASE снизу и 
VM_MAX_KERNEL_ADDRESS сверху. Эти величины меняются только от
платформы к платформе, а vm.kvm_size возвращает их разность:

   vm.kvm_size = VM_MAX_KERNEL_ADDRESS - KERNBASE

На живой машине ядро фиксирует конец используемой части KVM в
переменной ядра kernel_vm_end. Отрезок от kernel_vm_end до
VM_MAX_KERNEL_ADDRESS и есть свободная часть KVM:

   vm.kvm_free = VM_MAX_KERNEL_ADDRESS - kernel_vm_end

Очевидно, что переменные vm.kvm_size и vm.kvm_free чисто
информационные, настраивать их нельзя.

В KVM есть участок, который ядро использует для динамического
распределения памяти посредством malloc(9) и zone(9). Длина этого
участка вычисляется при загрузке системы по формуле:

   vm.kmem_size = min(max(max(VM_KMEM_SIZE, Physical_memory / 
       VM_KMEM_SIZE_SCALE), VM_KMEM_SIZE_MIN), VM_KMEM_SIZE_MAX)

Выглядит жутковато, но суть простая: vm.kmem_size_{min,max} задает
диапазон для автонастройки, которая сводится к выбору большего из
VM_KMEM_SIZE (это #define) и ОЗУ / vm.kmem_size_scale.

Также можно жестко указать vm.kmem_size из loader.conf. Наконец, при
любых настройках kmem_size не может быть более двух размеров ОЗУ.

Обратите внимание, что kmem -- это участок виртуального адресного
пространства, а не физической памяти. Именно поэтому ядро может
упасть в панику "kmem_map too small", хотя ОЗУ еще в избытке, если
какая-то из подсистем ядра пытается выделить слишком много памяти
для своих нужд. Типичный пример этого -- виртуальный диск, созданный с
помощью "mdmfs -M". 

 
Кэш TCP запросов во FreeBSD (1)   Автор: Антон Южанинов  [есть мнение]
 
Во FreeBSD 5 был добавлен TCP Hostcache - кэш, в котором сохраняются характеристики удаленных хостов 
от предыдущих соединений, для предварительной настройки новых подключений к этому же хосту. 
Это позволяет увеличить скорость работы HTTP (и других протоколов с большим числом 
котороткоживущих TCP соединений). 

Иногда бывает полезно посмотреть его содержимое. 
Увидеть его можно через sysctl net.inet.tcp.hostcache.list Просмотр информации по заданному хосту: 

   sysctl net.inet.tcp.hostcache.list | egrep '(IP|192.168.1.70)'

Например если MTU в кеше не равно нулю, то с помощью Path MTU
 Discovery для данного хоста было определено MTU меньшее чем у данного хоста. 

Просмотр состояние и параметров hostcache: 

   sysctl net.inet.tcp.hostcache

При тестировании производительности бывает нужно очищать этот кэш, между различными итерациями теста, 
чтоб он не искажал результаты. Сделать это можно так: 


   sysctl net.inet.tcp.hostcache.purge=1

Потом подождать до тех пор, пока net.inet.tcp.hostcache.purge снова не будет показывать ноль.
 
Работа процессов размером более 512Мб во FreeBSD   Автор: MicRO  [есть мнение]
 
Во FreeBSD 6.2 с 4Гб ОЗУ, процесс python'a виснет когда занимает более 512Мб.

Решение:
В /boot/loader.conf добавляем
   kern.maxdsiz="2610612736"
   kern.dfldsiz="2610612736"
   kern.maxssiz="2610612736"

После чего процесс начинает работать в штатном режиме.
 
Как избавится от роста висящих FIN_WAIT_2 соединений под FreeBSD   Автор: [есть мнение]
 
Если используется ipfw2 и keep-state правила, то от непрерывного роста 
соединений со статусом FIN_WAIT_2 помогает:
   sysctl -w net.inet.ip.fw.dyn_keepalive=0
 
Как увеличить производительность memcached под FreeBSD (1)   Автор: fak3r  [есть мнение]
 
Под FreeBSD наблюдаются проблемы производительности при работе
memcached с объектами размером больше чем несколько килобайт.

Переходим в порт memcached
   cd /usr/ports/databases/memcached/ 
   make configure


Редактируем файл memcached.c
   vi work/memcached-1.1.12/memcached.c

Находим строку #include "memcached.h" и после нее прописываем TCPNOPUSH 
(заставляет использовать TCPNODELAY):
   #undef TCP_NOPUSH

Устанавливаем и запускаем:
   make install
   echo "memcached_enable=\"YES\"" >> /etc/rc.conf
   /usr/local/etc/rc.d/memcached.sh start
 
Некоторые полезные sysctl переменные для FreeBSD (1)   Автор: [обсудить]
 
  • security.bsd.* - управление моделью безопасности
    • security.bsd.see_other_uids, security.bsd.see_other_gids - если 1, то пользователи (группы) могут видеть чужие процессы, сокеты и т.д. через ps, netstat, procfs;
    • security.bsd.conservative_signals - если 1, то некоторые сигналы запрещается посылать setuid/setgid процессам;
    • security.bsd.unprivileged_proc_debug - если 1, то пользовательский процесс можно отлаживать через ptrace, procfs, ktrace и т.д..
    • security.bsd.unprivileged_read_msgbuf - если 1, то пользовательский процесс может читать из системного консольного буфера сообщений;
    • security.bsd.hardlink_check_uid, security.bsd.hardlink_check_gid - если 1, то пользователи могут делать hardlink только на собственные файлы;
    • security.bsd.unprivileged_get_quota - если 1, пользователи могут просматривать информацию по установленным для них квотам.
    • vfs.usermount - если 1, то непривилегированный пользователь может монтировать и размонтировать FS, если для устройства выставлены "rw" права и пользователь является владельцем точки монтирования;
  • security.jail.* - ограничения для jail
    • security.jail.set_hostname_allowed - если 1, то внутри jail можно поменять имя хоста;
    • security.jail.socket_unixiproute_only - если 1 , то сокет в jail можно создать только для доменов PF_LOCAL, PF_INET или PF_ROUTE, иначе, возвращается ошибка;
    • security.jail.sysvipc_allowed - если 1, то то в jail можно получить доступ к глобальному System V IPC;
    • security.jail.getfsstatroot_only - если 1, то в jail можно получить информацию (df)только о той файловой системе на которой создан jail;
    • security.jail.allow_raw_sockets - если 1, то в jail можно создавать raw sockets;
    • security.jail.chflags_allow - если 1, то процессы в jail могут модифицировать флаги ФС.
  • IPFW
    • net.link.ether.bridge_ipfw - если 1 и ядро собрано с опциями IPFIREWALL и BRIDGE, то позволяет использовать ipfw для трафика внутри бриджа;
    • net.link.ether.ipfw - если 1, то ipfw2 позволяет фильтровать по MAC адресам;
    • net.inet.ip.fw.autoinc_step - задается число на которое увеличивается счетчик при добавления нового ipfw правила, когда явно не указан его номер;
    • net.inet.ip.fw.debug - если 1, то в логи помещается дополнительная отладочная информация по работе ipfw;
    • net.inet.ip.fw.verbose - если 0, то не отображать работу "log" правил в syslog;
    • net.inet.ip.fw.one_pass - если 1, то просмотр правил ipfw прекращается сразу после подпадание под queue или pipe правило. Если 0, то продолжается обработка далее идущих правил;
  • ICMP, соединение.
    • net.inet.icmp.icmplim - задается максимальное число ICMP "Unreachable" и TCP RST пакетов, которое может быть отправлено в секунду, net.inet.icmp.icmplim_output=0 позволяет не отражать в логах факты превышения лимита;
    • net.inet.tcp.icmp_may_rst, если 1, то TCP соединения со статусом SYN_SENT, могут быть оборваны посредством сообщения "ICMP unreachable";
    • net.inet.ip.redirect - если 0, то нет реакции на ICMP REDIRECT пакеты;
    • net.inet.icmp.log_redirect - если 1, то все ICMP REDIRECT пакеты отражаются в логе;
    • net.inet.icmp.drop_redirect - если 1, то ICMP REDIRECT пакеты игнорируются;
    • net.inet.tcp.icmp_may_rst - если 1, то игнорируются ICMP сообщения от блокировки пакета по пути;
    • net.inet.icmp.bmcastecho - для защиты от SMURF атак (ICMP echo request на broadcast адрес) нудно поставить 0;
  • Тюнинг сетевой подсистемы, борьба с DoS атаками
    • net.inet.tcp.log_in_vain, net.inet.udp.log_in_vain - если 1, отражаем в логе попытки соединения к портам, для которых нет активных сервисов;
    • net.inet.tcp.blackhole - если 1, то SYN пакеты пришедшие на порты для которых нет активных сервисов, остаются без RST ответа, если 2, то на любые пакеты нет ответа (затрудняет сканирования портов);
    • kern.ipc.nmbclusters - если по "netstat -m" mbufs в "peak" приближается к "max", то число сетевых буферов нужно увеличить (kern.ipc.nmbclusters=N в /boot/locader.conf);
    • net.inet.ip.forwarding - если 1, то машина может форвадить пакеты между интерфейсами;
    • net.inet.tcp.sack.enable - если 1, то включен TCP Selective Acknowledgements (SACK, RFC 2018) позволяющий увеличить производительность системы в ситуации большой потери пакетов;
    • net.link.ether.inet.max_age - время жизни записи в IP route кэше, рекомендуется уменьшить для ослабления эффекта от DoS атак через ARP флуд;
  • Оборудование и системная информация
    • dev.cpu.0.freq_levels - выдает список поддерживаемых частот, на которые можно переключить CPU, путем указание нужной частоты через dev.cpu.0.freq;
    • hw.snd.maxautovchans, hw.snd.pcm0.vchans - задается число виртуальных звуковых каналов, для каждого из которых может быть отдельный источник звука (на выходе они будут смикшированы);
    • kern.boottime - время последней загрузки системы;
    • kern.disks - список дисков в системе;
    • kern.geom.debugflags, для работы boot0cfg и подобных утилит нужно установить в 16;
  • Изменение и тюнинг системных ограничений
    • kern.coredump - если 0, то при крахе приложения не будут создаваться core файлы, формат имени и путь для которых задается через kern.corefile (например: /tmp/%U.%N.core). kern.sugid_coredump=0 позволяет запретить генерацию core suid/sgid процессами;
    • kern.maxfiles - максимально допустимое число открытых файлов (файловых дескрипторов), текущее число открытых файлов можно посмотреть через kern.openfiles;
    • kern.maxprocperuid - максимально допустимое число процессов, которое может быть запущено из-под одного пользователя;
    • kern.maxvnodes - максимальное число vnode для кеширования дисковых операций, текущее значение можно посмотреть через vfs.numvnodes или debug.numvnodes/debug.freevnodes;
  • SMP (FreeBSD 5)
    • kern.smp.maxcpus (machdep.smp_cpus) - максимальное число процессоров, поддерживаемое текущей сборкой ядра;
    • kern.smp.active, kern.smp.disabled - число активных и выключенных CPU;
    • kern.smp.cpus (machdep.smp_active) - сколько CPU в online;
    • kern.smp.forward_signal_enabled - включить возможность мгновенной пересылки сигнала для процессов выполняемых в данный момент времени на разных CPU;
    • kern.smp.forward_roundrobin_enabled;
  • ARP
    • net.link.ether.inet.log_arp_movements - отражать в логе все широковещательные ARP пакеты с хостов MAC адрес которых отсутствует в локальном ARP кэше;
    • net.link.ether.inet.log_arp_wrong_iface - отражать в логе все ARP пакеты пришедшие с неправильного интерфейса;
  •  
    Включение Device Polling в FreeBSD (1)   Автор: [есть мнение]
     
    man polling - периодических опрос состояния ядром, вместо генерации прерываний 
    (полезно при очень большом числе пакетов проходящих через сетевую карту), 
    возможен комбинированный вариант, когда polling включается при преодалении определенного порога нагрузки).
    В конфигурации ядра
       options DEVICE_POLLING
       options HZ=1000
    Далее:
       sysctl kern.polling.enable=1
       sysctl kern.polling.user_frac=50
    
     
    Как оценить величину трафика и состояние системы в динамике для FreeBSD   Автор: [есть мнение]
     
    Динамика изменения параметров:
    
       netstat -w 1
       iostat -w 1
       vmstat -w 1
       gstat
    
    Состояние буферов:
    
       vmstat -z
       netstat -m
       netstat -Lan
       netstat -s -p tcp
    
    
     
    Как под FreeBSD создать файловую систему в памяти (ramdisk)   Автор: [обсудить]
     
    man mount_mfs
    
       mount_mfs -s 614400 /dev/amrd0s1b /usr/obj
    где /dev/amrd0s1b - swap раздел, 614400 - размер MFS диска N*1024*2 (614400 == 300mb).
    
     
    Что изменить в настройках конфигурации ядра FreeBSD для нагруженного сервера.   Автор: [есть мнение]
     
      maxusers 512
      options  NMBCLUSTERS=16786
      options  NBUF=2048
      options  CHILD_MAX=512
      options  OPEN_MAX=512
      options  "MAXDSIZ=(512*1024*1024)"
      options  "DFLDSIZ=(128*1024*1024)"
      options  IPFIREWALL
      options  IPFIREWALL_FORWARD
      options  IPFIREWALL_DEFAULT_TO_ACCEPT
      options  SOFTUPDATES
    
     
    Как в FreeBSD посмотреть состояние системных буферов   Автор: [обсудить]
     
    sysctl vm.zone
    
     
    Как включить Soft-updates в FreeBSD для увеличения производительности   Автор: [обсудить]
     
    1. Перейти в single режим
    2. Убедится, что раздел диска размонтирован.
    3. tunefs -n enable раздел (например, tunefs -n enable /usr )
    
     
    Как в FreeBSD узнать значения LoadAverage, объем свободного ОЗУ и т.д.   Автор: [есть мнение]
     
    sysctl vm.stats.vm.v_active_count
    sysctl vm.stats.vm.v_inactive_count
    sysctl vm.stats.vm.v_wire_count
    sysctl vm.stats.vm.v_cache_count
    sysctl vm.stats.vm.v_free_count
    sysctl vm.stats.vm.v_page_count
    более подробно: 
    	sysctl -a|grep vm
    	sysctl| less
    
     
    Как узнать аппаратную конфигурацию (ОЗУ, CPU и т.д.) машины под FreeBSD   Автор: [есть мнение]
     
    sysctl -a | grep hw
    
     
    Как увеличить производительность дисковой подсистемы FreeBSD.   Автор: [есть мнение]
     
    По умолчанию запись на диски в FreeBSD производится в синхронном режиме, значительно увеличить скорость записи
     можно активировав асинхронный режим: В /etc/fstab в поле Options добавить async (например rw,async).
    Или для примонтированного раздела: mount -u -o async /home
    Для увеличения производительности IDE дисков, в файле конфигурации ядра можно указать для wdc устройств 
    flags 0xa0ffa0ff или 0x80ff80ff (подробнее man wd, man ad).
    Для ad: sysctl hw.atamodes; sysctl hw.ata
    Например: sysctl hw.atamodes=pio,pio,---,dma,pio,---,dma,---,
    См. также man atacontrol 
    Третий вариант - активировать в настройках ядра SOFTUPDATES и запустить 
    tunefs -n enable /usr в single-user на размонтированном разделе.
    
     
    Как увеличить количество shared memory для работы высоконагруженного PostgreSQL   Автор: [есть мнение]
     
    В linux:
    echo 134217728 >/proc/sys/kernel/shmall
    echo 134217728 >/proc/sys/kernel/shmmax
    В конфиге ядра FreeBSD:
    options         SYSVSHM
    options         SHMMAXPGS=4096
    options         SHMMAX="(SHMMAXPGS*PAGE_SIZE+1)"
    options         SHMMIN=2    
    options         SHMMNI=256
    options         SHMSEG=256  
    options         SYSVSEM     
    options         SEMMAP=512  
    options         SEMMNI=512  
    options         SEMMNS=1024 
    options         SEMMNU=512  
    options         SEMMSL=256  
    options         SEMOPM=256  
    options         SEMUME=64   
    options         SYSVMSG     
    options         MSGMNB=8192 
    options         MSGMNI=256  
    options         MSGSEG=8192 
    options         MSGSSZ=16   
    options         MSGTQL=128  
    options         NMBCLUSTERS=16786
    options         NBUF=2048
    maxusers        512
    
     
    Что имеет смысл поменять через sysctl в FreeBSD   Автор: [есть мнение]
     
    /sbin/sysctl -w net.inet.ip.forwarding=0
    /sbin/sysctl -w net.inet.tcp.always_keepalive=1
    /sbin/sysctl -w kern.ipc.somaxconn=1024
    /sbin/sysctl -w net.inet.tcp.delayed_ack=0
    /sbin/sysctl -w net.inet.ip.portrange.last=30000
    /sbin/sysctl -w net.inet.tcp.sendspace=131072 # подогнать размер под средний объем блока передаваемых данных. 131072 - для отдачи больших файлов.
    /sbin/sysctl -w net.inet.tcp.recvspace=131072 # подогнать размер под средний объем блока принимаемых данных. 131072 - для приема больших файлов.
    #/sbin/sysctl -w net.inet.tcp.rfc1644=1
    #/sbin/sysctl -w net.inet.tcp.rfc1323=0
    #/sbin/sysctl -w net.inet.icmp.drop_redirect=1
    #/sbin/sysctl -w net.inet.icmp.log_redirect=1
    #/sbin/sysctl -w net.inet.ip.redirect=0
    #/sbin/sysctl -w net.inet6.ip6.redirect=0
    /sbin/sysctl -w net.link.ether.inet.max_age=1200
    /sbin/sysctl -w net.inet.ip.sourceroute=0
    /sbin/sysctl -w net.inet.ip.accept_sourceroute=0
    /sbin/sysctl -w net.inet.icmp.bmcastecho=0
    /sbin/sysctl -w net.inet.icmp.maskrepl=0
    
     

       Увеличение безопасности FreeBSD

    Быстрое создание jail-машины во FreeBSD (1)   Автор: mr-tacitus  [есть мнение]
     
    Нам понадобится первый установочный диск FreeBSD 6.2 и немного свободного времени. 
    Предполагается что наша jail-машина будет размещена в директории /var/jail.
    
    Список действий:
    
    1. Создать директорию /var/jail/machine для jail-машины;
    
    2. Смонтировать установочный диск и распаковать базовые файлы в директорию jail-машины:
    
       # mount /cdrom
    
    для bash:
    
       # DESTDIR=/var/jail/machine /cdrom/6.2-RELEASE/base/install.sh
    
    для csh:
    
       # env DESTDIR=/var/jail/machine /cdrom/6.2-RELEASE/base/install.sh
    
    3. Создать пустой файл /var/jail/machine/etc/fstab:
    
    
       # touch /var/jail/machine/etc/fstab
    
    4. Создать файл /var/jail/machine/etc/rc.conf со следующим содержанием:
    
       # Запускаем sshd
       sshd_enable="YES"
       sendmail_enable="NONE"
       syslogd_flags="-ss"
       rpcbind_enable="NO"
       network_interfaces=""
    
    5. Теперь требуется создать непривилегированного пользователя и    изменить пароль пользователя root.
    Входим в каталог jail-машины
    
       # chroot /var/jail/machine /bin/csh
    
    Создаем пользователя
    
       # adduser
    
    Меняем пароль пользователя root
    
       # passwd
       # exit
    
    
    6. В файл /etc/rc.conf основной системы добавить:
    
       # Разрешаем запуск jail-машин
       jail_enable="YES"
       # Запрещаем им менять свое имя jail_set_hostname_allow="NO"
       # Перечисляем jail-машины в системе.
       jail_list="machine"
    
       # Jail-машина "machine"
       # Корневая директория jail_machine_rootdir="/var/jail/machine"
       # Имя jail_machine_hostname="machine.local"
       # IP-адрес jail_machine_ip="192.168.0.10"
       # На какой сетевой интерфейс будет цепляться jail-машина  
       jail_machine_interface="ed0"
       # монтируем файловую систему devfs внутри jail-машины. 
       jail_machine_devfs_enable="YES"
       # Скрипты запуска и останова 
       jail_machine_exec_start="/bin/sh /etc/rc"
       jail_machine_exec_stop="/bin/sh /etc/rc.shutdown"
    
    7. Кроме того требуется все запускаемые сервисы основной системы привязать к его ip-адресам 
    (не должны слушаться порты на ip-адресах jail-машин).
    Например, в rc.conf:
    
       # Супер-сервер inetd
       inetd_enable="YES"
       # Слушает порт только на 192.168.0.1
       inetd_flags="-wW -a 192.168.0.1"
       # Syslogd
       syslogd_enable="YES"
       # Не слушать порты
       syslogd_flags="-ss"
    
    8. Запускаем созданную jail-машину:
    
       # /etc/rc.d/jail start
    
     
    Использование login.access в FreeBSD 5.x и 6.x   Автор: 135all  [обсудить]
     
    В FreBSD есть прекрасная возможность разрешать логинится конкретным пользователям 
    только с определённых терминалов или адресов. Делается это посредством модуля pam_acct_mgmt. 
    
    Для этого редактируем файл /etc/login.access:
    
    
       -:root:ALL #запрещаем любые логины root
       -:ALL:ttyv0 # первая консоль только для логов
       +:dm:ttyv1 ttyv2 ttyv3 ttyv4 ttyv5 ttyv6 ttyv7 ttyv8 # доступ с консоли
       +:dm:10.1.1.1 192.168.6.100 # доступ по сети(тут указывать либо ip, либо 
            # доменное имя. Для ssh рекомендую UseDNS no в /etc/ssh/sshd_config)
       -:ALL:ALL # всё остальное запрещено
    
    ВАЖНО! начиная с версии 5.2 su стал проверять "target user" по login.access, те при таких настройках 
    можно будет залогинится, но su не будет работать - pam_login_access: 
       pam_sm_acct_mgmt: root is not allowed to log in on /dev/ttyp3 su: Sorry. 
    
    Для исправления надо редактировать /etc/pam.d/su:
    
       account
       #account                include         system #закомментировать
       account         required        pam_unix.so # добавить
    
     
    Шифрованный swap в FreeBSD 6.0   Автор: neozoid  [есть мнение]
     
    Добавить в /boot/loader.conf:
       geom_eli_load="YES"
    
    
    или в конфиг ядра:
       device crypto
       options GEOM_ELI
    
    в fstab к разделу swap к "Device" дописать ".eli" например:
       # Device                Mountpoint      FStype  Options         Dump    Pass#
       #/dev/ad0s3b            none            swap    sw              0       0
       /dev/ad0s3b.eli         none            swap    sw              0       0
    
    при загрузке имеем:
       GEOM_ELI: Device ad0s3b.eli created.
       GEOM_ELI:     Cipher: AES
       GEOM_ELI: Key length: 256
       GEOM_ELI:     Crypto: software
    
    и в моем случае:
       %pstat -s
       Device          1K-blocks     Used    Avail Capacity
       /dev/ad0s3b.eli   1048576        0  1048576     0%
    
     
    Как запретить создание символических линков в /tmp   Автор: [есть мнение]
     
    FreeBSD: В графе "Option" /etc/fstab для раздела /tmp нужно указать:
       rw,noexec,nosuid,nodev,nosymfollow
    
    
    Для Linux: Openwall patch (http://openwall.com/) + CONFIG_SECURE_LINK + chmod +t /tmp
    
     
    Как в FreeBSD включить Blowfish шифрование паролей вместо DES и MD5   Автор: [есть мнение]
     
    В /etc/login.conf:  
    	:passwd_format=blf:\
    cap_mkdb /etc/login.conf
    
     
    Как в FreeBSD запретить свободный вход как root с консоли через boot -s   Автор: [обсудить]
     
    В /etc/ttys поменяйте secure на insecure в строке:
         console none   unknown off secure
    
     
    Предотвращение DoS атак в FreeBSD (1)   Автор: bsdportal.ru  [есть мнение]
     
    * "sysctl -w net.inet.tcp.msl=7500" - время ожидания ACK в ответ на SYN-ACK или FIN-ACK в миллисекундах;
    * "sysctl -w net.inet.tcp.blackhole=2" -  все пакеты на закрытый порт отбрасываются без отсылки RST;
    * "sysctl -w net.inet.udp.blackhole=1" - отбрасывать пакеты для  закрытых портов;
    * "sysctl -w net.inet.icmp.icmplim=50" - защита от генерирование потока ответных пакетов, 
          максимальное количество  ICMP Unreachable и TCP RST пакетов в секунду;
    * "sysctl -w kern.ipc.somaxconn=32768" - увеличение числа одновременно открытых сокетов;
    * Сборка ядра с опцией DEVICE_POLLING (далее: sysctl kern.polling.enable=1; sysctl kern.polling.user_frac=50);
    
     

       Установка и апгрейд FreeBSD и приложений.

    Решение пробелемы при установке FreeBSD на HP (Compaq) ProLiant DL360   Автор: else  [есть мнение]
     
    При установке ОС с диска во время определения дисков появляется ошибка 
    "BTX halted".
    Для ее устранения нужно отключить в BIOS опцию Virtual install disk.
    
     
    Наиболее простой способ обновления FreeBSD до последней версии   Автор: [есть мнение]
     
    Для i386 и amd64 сборок FreeBSD для бинарного обновления можно использовать утилиту freebsd-update.
    
    Обновляем FreeBSD 6.3 до 6.4-RC2
    
    Проверяем файл конфигурации /etc/freebsd-update.conf, можно изменить сервер для загрузки обновлений 
    и обновляемые компоненты, например, исключить src.
    
    Загружаем обновления, которые будут сохранены в /var/db/freebsd-update
    (в /var необходимо наличие как минимум 400Мб свободного места):
    
       freebsd-update upgrade -r 6.4-RC2
    
    
    Устанавливаем обновления, попутно отвечая на вопросы, 
    касающиеся решения конфликтов 
    при обновлении файлов конфигурации:
    
       freebsd-update install
    
    Перезагружаем систему:
    
       shutdown -r now
    
    Деинсталировать установленные обновления можно при помощи команды "rollback".
    
    Утилита freebsd-update входит в состав FreeBSD, начиная с версии 6.2.
    
    
    Инструкция по обновлению FreeBSD 6.x до FreeBSD 7.0
    
    
    Загружаем скрипт обновления, проверяем его целостность и разархивируем:
       fetch http://people.freebsd.org/~cperciva/freebsd-update-upgrade.tgz
       fetch http://people.freebsd.org/~cperciva/freebsd-update-upgrade.tgz.asc
    
       gpg --verify freebsd-update-upgrade.tgz.asc freebsd-update-upgrade.tgz
       tar -xf freebsd-update-upgrade.tgz
    
    Загружаем файлы обновлений и производим первичную подготовку:
       sh freebsd-update.sh -f freebsd-update.conf -r 7.0-RELEASE upgrade
    
    Устанавливаем обновления (устанавливаем новое ядро):
       sh freebsd-update.sh -f freebsd-update.conf install
    
    Перезагружаем систему:
       shutdown -r now
    
    Второй раз запускаем установку обновлений (при первом запуске было обновлено только ядро,
    при повторном запуске выполняется обновление базового окружения):
       sh freebsd-update.sh -f freebsd-update.conf install
    
    
    Пересобираем установленные дополнительные приложения (порты), 
    так как они могут ссылаться на старые библиотеки.
       portupgrade -faP
    
    Третий раз запускаем процесс обновления, теперь для удаления старых библиотек:
    
       sh freebsd-update.sh -f freebsd-update.conf install
    
    Выполняем перезагрузку:
       shutdown -r now
    
     
    Организация установки FreeBSD с USB Flash (1) (2) (3)   Автор: [есть мнение]
     
    Иногда возникает необходимость создать установочный Flash-диск с FreeBSD, 
    но без переформатирования FAT-раздела на Flash, при сохранении размещенных там данных.
    
    Загружаем с ftp.freebsd.org минимальный установочный образ 6.3-RELEASE-i386-bootonly.iso
    ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/6.3/6.3-RELEASE-i386-bootonly.iso
    
    Создаем на его основе ram-диск. Операции выполняются на FreeBSD системе, 
    при необходимости временно FreeBSD можно поставить в KVM, VmWare или VirtualBox.
    
    Создаем образ RAM-диска размером чуть больше bootonly.iso:
    
       dd if=/dev/zero of=boot.img bs=1k count=26000
    
    Подключаем ram-диск:
    
       mdconfig -a -t vnode -f boot.img -u 0
    
    Устанавливаем загрузочный сектор и размечаем по умолчанию:
    
       bsdlabel -w -B md0 auto
    
    
    Создаем файловую систему:
    
       newfs -m 0 md0a
    
    Монтируем созданную ФС ram-диска:
    
       mkdir /mnt/img
       mount /dev/md0a /mnt/img
    
    Монтируем iso-образ и переносим с него данные на ram-диск:
    
       mkdir /mnt/iso
       mdconfig -a -t vnode -f 6.3-RELEASE-i386-bootonly.iso -u 1
       mount_cd9660 /dev/md1 /mnt/iso
       cd /mnt/img/
       cp -r /mnt/iso/* .
    
    Размонтируем:
    
       cd
       umount /mnt/img /mnt/iso
       mdconfig -d -u 0
       mdconfig -d -u 1
    
    Загружаем Linux, можно LiveCD.
    Копируем boot.img на Flash диск.
    Копируем на Flash файл memdisk из комплекта syslinux (http://syslinux.zytor.com).
    Ставим syslinux на Flash (/dev/sdb1):
    
    
       syslinux -s /dev/sdb1
    
    Создаем в корне файл syslinux.cfg:
    
       label freebsd
           kernel /memdisk
           append initrd=/boot.img harddisk
    
    Если не грузится, ругаясь на MBR, заменяем MBR на содержимое файла mbr.bin из комплекта syslinux:
       dd if=/dev/sdb of=mbr_backup.bin bs=1 count=512
       cat mbr.bin > /dev/sdb
    
    Проверить можно через QEMU:
       qemu -hda /dev/sdb1 -std-vga
    
    
    При установке выбираем метод получения установочных файлов по FTP или копируем их на Flash 
    (директорию 6.3-RELEASE из 6.3-RELEASE-i386-disc1.iso).
    
    --------------------
    В случае когда USB Flash не жалко отформатировать, можно можно создать
    загрузочный 
    USB Flash следующим образом:
    
       fdisk -BI /dev/da2
       bsdlabel -w -B /dev/da2s1
       newfs /dev/da2s1a
       mount /dev/da2s1a /mnt
    
    Копируем в /mnt содержимое содержимое 6.3-RELEASE-i386-bootonly.iso
    
    --------------------
    Установка загрузчика FreeBSD на Flash из Linux:
    
    Делаем бэкап текущего MBR USB диска:
      dd if=/dev/sdb of=mbr_sdb.bin bs=1 count=512
    
    Берем boot0 из комплекта FreeBSD и копируем в него данные о таблицах разделов текущего диска:
      dd if=mbr_sdb.bin  of=boot0   bs=1 count=66 skip=446 seek=446
    
    Копируем загрузчик в MBR USB диска:
      dd if=boot0 of=/dev/sdb  bs=1 count=512
    
    
    Инструкцию по созданию установочного образа FreeBSD, загружаемого по сети
    можно найти здесь http://wiki.opennet.ru/NetworkBoot
    
    ---------------------
    Полезный скрипт для преобразования ISO в UFS-образ (http://docs.FreeBSD.org/cgi/mid.cgi?4420AF56.60106)
    
    Запускается ./fbsd-install-iso2img.sh iso-path img-path
    
    
    #!/bin/sh
    
    # You can set some variables here. Edit them to fit your needs.
    
    # Set serial variable to 0 if you don't want serial console at all,
    # 1 if you want comconsole and 2 if you want comconsole and vidconsole
    serial=3D0
    
    set -u
    
    if [ $# -lt 2 ]; then
        echo "Usage: $0 source-iso-path output-img-path"
        exit 1
    fi
    
    isoimage=3D$1; shift
    imgoutfile=3D$1; shift
    
    export tmpdir=3D$(mktemp -d -t fbsdmount)
    # Temp file and directory to be used later
    export tmpfile=3D$(mktemp -t bsdmount)
    
    export isodev=3D$(mdconfig -a -t vnode -f ${isoimage})
    
    echo "#### Building bootable UFS image ####"
    
    ISOSIZE=3D$(du -k ${isoimage} | awk '{print $1}')
    SECTS=3D$((($ISOSIZE + ($ISOSIZE/5))*2))
    
    # Root partition size
    
    echo "Initializing image..."
    dd if=3D/dev/zero of=3D${imgoutfile} count=3D${SECTS}
    ls -l ${imgoutfile}
    export imgdev=3D$(mdconfig -a -t vnode -f ${imgoutfile})
    
    bsdlabel -w -B ${imgdev}
    newfs -O1 /dev/${imgdev}a
    
    mkdir -p ${tmpdir}/iso ${tmpdir}/img
    
    mount -t cd9660 /dev/${isodev} ${tmpdir}/iso
    mount /dev/${imgdev}a ${tmpdir}/img
    
    echo "Copying files to the image..."
    ( cd ${tmpdir}/iso && find . -print -depth | cpio -dump ${tmpdir}/img )
    #bzcat ${tmpdir}/iso/dist/root.dist.bz2 | mtree -PUr -p ${tmpdir}/img 2>&=
    1 > /dev/null
    
    #echo "/dev/ufs/${UFS_LABEL} / ufs ro 1 1" > ${tmpdir}/img/etc/fstab
    
    if [ ${serial} -eq 2 ]; then
    
            echo "-D" > ${tmpdir}/img/boot.config
            echo 'console=3D"comconsole, vidconsole"' >> ${tmpdir}/img/boot/l=
    oader.conf
    elif [ ${serial} -eq 1 ]; then
            echo "-h" > ${tmpdir}/img/boot.config
            echo 'console=3D"comconsole"' >> ${tmpdir}/img/boot/loader.conf
    fi
    
    cleanup() {
        umount ${tmpdir}/iso
        mdconfig -d -u ${isodev}
        umount ${tmpdir}/img
        mdconfig -d -u ${imgdev}
        rm -rf ${tmpdir} ${tmpfile}
    }
    
    cleanup
    
    ls -lh ${imgoutfile}
    
    
     
    Создание установочного DVD из 4 образов CD дисков FreeBSD 7.0 (1)   Автор: [есть мнение]
     
    Имеем загруженные iso образы:
    
       7.0-RELEASE-i386-disc1.iso
       7.0-RELEASE-i386-disc2.iso
       7.0-RELEASE-i386-disc3.iso
       7.0-RELEASE-i386-docs.iso
    
    Создаем в домашнем каталоге директорию dvd-freebsd7 и копируем туда содержимое iso образов.
    
       cd ~
       mkdir dvd-freebsd7
       cd dvd-freebsd7/
    
       mdconfig -a -t vnode -f ../7.0-RELEASE-i386-disc1.iso -u 0
       mount -t cd9660 /dev/md0 /mnt
       tar -C /mnt -cf - . | tar -xf -
       umount /mnt
    
       mdconfig -a -t vnode -f ../7.0-RELEASE-i386-disc2.iso -u 1
       mount -t cd9660 /dev/md1 /mnt
       tar -C /mnt -cf - . | tar -xf -
       umount /mnt
    
       mdconfig -a -t vnode -f ../7.0-RELEASE-i386-disc3.iso -u 2
       mount -t cd9660 /dev/md2 /mnt
       tar -C /mnt -cf - . | tar -xf -
       umount /mnt
    
    
       mdconfig -a -t vnode -f ../7.0-RELEASE-i386-docs.iso -u 3
       mount -t cd9660 /dev/md3 /mnt
       tar -C /mnt -cf - . | tar -xf -
       umount /mnt 
    
    Используя sed или обычный текстовый редактор удаляем упоминание привязки к номеру диска ("||1", "||2" и "||3") в файле packages/INDEX
    
    В файл cdrom.inf добавляем:
    
       CD_VOLUME = 0
       CD_VOLUME = 1
       CD_VOLUME = 2
       CD_VOLUME = 3
    
    Удаляем директорию rr_moved 
    (иначе при создании iso образа в формате Rock Ridge будет выдана ошибка):
    
       rm -Rf rr_moved
    
    Для записи DVD на лету:
    
       growisofs -Z /dev/cd0 -J -R -no-emul-boot -b boot/cdboot -iso-level 3 .
    
    Для создания ISO образа DVD диска:
    
    
       mkisofs -V FreeBSD7 -J -R -b boot/cdboot -no-emul-boot -o freebsd7.iso .
    
    Для записи созданного iso:
    
       growisofs -dvd-compat -Z /dev/cd0=freebsd7.iso
    
     
    Обновление FreeBSD 6.3 до FreeBSD 7.0 из исходных текстов (1)   Автор: [есть мнение]
     
    Устанавливаем комплект файлов для обратной совместимости.
    
    1. Загружаем localedata-5.4.tbz и compat6x-i386-6.x.xxxxxx.yyyymm.tbz 
    с ftp://ftp6.ru.freebsd.org/pub/FreeBSD/ports/i386/packages-7.0-release/All 
    2. Первый файл распаковываем (через pkg_add имя_пакета) 
    в /usr/local/share/compat/, второй в /usr/local/lib/compat/
    
    Устанавливаем комплект для обновления.
    
    Загружаем http://people.freebsd.org/~rse/dist/freebsd-adm-1.2.2.tar.gz 
    
    1. Распаковываем в /usr/adm:
       cd /usr
       fetch http://people.freebsd.org/~rse/dist/freebsd-adm-1.2.2.tar.gz
    
       rm -rf adm; 
       gunzip <freebsd-adm-1.2.2.tar.gz | tar xvf -; 
       rm -f freebsd-adm-1.2.2.tar.gz
    
    2. В файле /usr/adm/cfg/csup.src заменяем RELENG_6 на RELENG_7_0
    
    Обновляем исходные тексты на FreeBSD 7.0:
       cd /usr/src && make cleandir
       cd /usr/adm && make update
    
    Обновляем конфигурацию ядра:
      vi /sys/`uname -m`/conf/`hostname -s | tr 'a-z' 'A-Z'`
    
    1. Добавляем:
    
      options        COMPAT_FREEBSD6
      options        TCP_DROP_SYNFIN
      options        SCTP            # Stream Transmission Control Protocol
      options        UFS_GJOURNAL    # Enable gjournal-based UFS
      options        STOP_NMI        # Stop CPUS using NMI instead of IPI
      options        AUDIT           # Security event auditing
      options        GEOM_LABEL      # Provides labelization
      options        GEOM_PART_GPT   # GUID Partition Tables.
      options        COMPAT_43TTY    # BSD 4.3 TTY compat [KEEP THIS!]
      options KSE
      device         uart            # Generic UART driver
      device         le              # AMD Am7900 LANCE and Am79C9xx PCnet
      device         firmware        # firmware assist module
      device         dcons           # Dumb console driver
      device         dcons_crom      # Configuration ROM for dcons
    
    2. Убираем:
      options        GEOM_GPT        # GUID Partition Tables.
      options        COMPAT_43       # Compatible with BSD 4.3 [KEEP THIS!]
      device         lnc             # NE2100, NE32-VL Lance Ethernet cards
    
    3. Замечание по опциям: 
       IPSEC_ESP меняем на FAST_IPSEC
       вместо PIM используем MROUTING
       вместо SCHED_4BSD можно поставить SCHED_ULE
       в GENERIC ядре теперь по умолчанию включены:
         cpufreq, dumb, uart, fwip (IP over FireWire), wlan_wep, wlan_ccmp и wlan_tkip
    
    Читаем /usr/src/UPDATING
    
    Готовимся к обновлению:
       mergemaster -p
    
    Собираем "мир" и ядро:
       cd /usr/adm && make world-build kernel-build
    
    
    Устанавливаем FreeBSD 7.0
       make kernel-install world-install
    
    Чистим хвосты FreeBSD 6.3:
       rm -f /etc/rc.d/ike /etc/rc.d/pccard /etc/rc.d/pcvt /etc/rc.d/ramdisk
       rm -f /etc/rc.d/ramdisk-own /etc/rc.d/usbd
       make etc
       make clean
    
    Перезагружаем машину
       shutdown -r now
    
    Продолжаем чистку хвостов:
       cd /; exec `/usr/bin/which bash sh | head -1`
       PATH=/bin:/usr/bin:/sbin:/usr/sbin; umask 022; unset TMOUT
    
    
    Ищем что можно удалить:
       ( for dir in /bin /sbin /usr/bin /usr/sbin /usr/libexec /usr/libdata; do \
          find $dir -mtime +2 -type f -xdev -print; \
          find $dir -mtime +2 -type l -xdev -print; \
          done ) >/tmp/remove
      
    Смотрим что будем удалять, внимательно анализируем /tmp/remove
    Удаляем:
       cat /tmp/remove | xargs rm -f
    
    Ищем что нужно переместить:
       ( for dir in /lib /usr/lib; do \
          find $dir -mtime +2 -type f -xdev -print; \
          find $dir -mtime +2 -type l -xdev -print; \
          done ) | grep -v /usr/lib/compat >/tmp/move
    
    Смотрим что будем перемещать, внимательно анализируем /tmp/move
       for x in `cat /tmp/move`; do chflags noschg $x; mv $x /usr/lib/compat/; done
    
    
    Подчищаем системы после сборки:
       cd /usr/src; make BATCH_DELETE_OLD_FILES=YES delete-old delete-old-libs
    
    Окончатально перезагружаемся в FreeBSD 7.0
       shutdown -r now
    
    Пересобираем установленные дополнительные приложения, 
    так как они могут ссылаться на старые библиотеки.
       portupgrade -faP
    
     
    Компилирование модулей ядра FreeBSD (1)   Автор: mr.tacitus  [обсудить]
     
    Практически любой системный администратор, который сталкивался с FreeBSD, 
    компилировал ядро под себя, выбрасывая оттуда лишние "детали" или вставляя недостающие. 
    Между тем выброшенная из ядра "деталька" никуда не девается и при повторной компиляции 
    превращается в модуль (за редким исключением), который всегда можно подгрузить.
    
    Бороться с этим можно с помощью опций в файле make.conf:
    
       # не компилировать все модули
       NO_MODULES="YES"
       # компилировать только указанные модули
       # названия модулей пишутся через пробел
       MODULES_OVERRIDE=acpi ipfw
       # компилировать все модули, за исключением указанных
       WITHOUT_MODULES=pf ntfs_iconv
    
    
     
    Обновление портов во FreeBSD (1)   Автор: Roman Sozinov  [есть мнение]
     
    Прежде чем что-либо делать с портами в FreeBSD их необходимо обновить:
    
       # cat >> /etc/make.conf
       SUP_UPDATE=yes
       SUP=/usr/local/bin/cvsup
       SUPFLAGS=-g -L 2
       SUPHOST=cvsup.uk.FreeBSD.org
       SUPFILE=/usr/share/examples/cvsup/standard-supfile
       PORTSSUPFILE=/usr/share/examples/cvsup/ports-supfile
       DOCSUPFILE=/usr/share/examples/cvsup/doc-supfile
       Ctrl + D
    
       # cd /usr/ports
       # make update
    
    Найти в портах (/usr/ports) порт portupgrade (/usr/ports/ports-mgmt/portupgrade), установить его
    
       cd /usr/ports/ports-mgmt/portupgrade
       make && make install
    
    
    После этого можно с помощью утилиты portupgrade уже возможно обновлять 
    установленные порты (ключ -R говорит о том, что нужно обновить не только порт, но и все его зависимости)
    
       portupgrade -R имя_порта
    
    Чтобы узнать список портов, нуждающихся в обновлении, существует команда
    
       pkg_version -v
    
    Для наведения порядка (удаление неиспользуемых портов, дубликатов версий) 
    в реестре установленных портов (/var/db/pkg) можно воспользоваться командой
    
       pkgdb -F
    
    
    Ссылки:
       1. "Системный администратор" (2007.01)
       2. Очистка портов во FreeBSD 
           http://www.opennet.ru/base/sys/cleaning_up_ports.txt.html
    
       3. portupgrade - `обновлялка` установленных портов 
           http://www.lissyara.su/?id=1153
    
     
    Удаленное бинарное обновление FreeBSD 4.11 до 6.2-RELEASE (1)   Автор: Eugene Grosbein  [есть мнение]
     
    Удаленное бинарное обновление 4.11 до 6.2-RELEASE,
    без доступа с консоли с двумя перезагрузками и
    минимальным downtime, безопасное настолько, насколько
    это возможно при обновлении "по месту".
    
    Требуется доступность первого инсталляционного CD
    из дистрибутива 6.2-RELEASE, либо нужно будет
    скачать с десяток мегабайт из него для пункта 3 ниже.
    
    1. Подготовить новое содержимое для /boot
    
    Скопировать с дистрибутивного CD 6.2-RELEASE
    каталог boot в /boot6, loader.conf оставить старый
    (если дистрибутив машине недоступен, сначала скачать
    /boot с него по сети в каталог /cdrom/boot):
    
    cd /
    CDROM=/cdrom
    cp -r $CDROM/boot boot6
    cd boot6
    mv loader.conf loader.conf6
    cp ../boot/loader.conf . || true
    mv kernel kernel6
    mkdir kernel
    ln ../kernel kernel
    
    2. Меняем местами старый и новый loader:
    
    cd ..
    mv boot boot4
    mv boot6 boot
    
    Теперь у нас новый loader, который грузит старое ядро
    из файла /boot/kernel/kernel (это хардлинк на /kernel),
    и старые модули из /modules. Система пока работает по-старому,
    при перезагрузке ничего не поломается.
    
    3. Подготовка mfsroot.
    
    Если дистрибутива на четверке нет, этот пункт можно полностью
    выполнять на другой машине, и готовый mfsroot.gz (5.5Mb)
    потом скачать в /boot/mfsroot.gz. Если выполняется на свежей
    FreeBSD, заменить vnconfig на mdconfig и disklabel
    на bsdlabel (убрать слово auto):
    
    TMPDIR=/var/tmp # можно и другое место
    cd $TMPDIR
    
    # быстрый и простой способ требует mfsroot на 14Mb
    # создаём файл образа на основе такого же
    # из дистрибутива
    dd if=/dev/zero of=mfsroot bs=1m count=14
    dev=vn0c
    vnconfig -c -s labels $dev mfsroot
    disklabel -w -B -b $CDROM/boot/boot $dev auto
    newfs -m 0 -o space -b 4096 -f 512 $dev
    
    # Монтируем оригинальный и новый mfsroot
    mkdir /mnt/omfs /mnt/mfs
    gzcat $CDROM/boot/mfsroot.gz > mfsroot.orig
    odev=vn1c
    vnconfig -c -s labels $odev mfsroot.orig
    mount -o ro /dev/$odev /mnt/omfs
    mount /dev/$dev /mnt/mfs
    
    # Для начала копируем оригинальный в новый
    cd /mnt/omfs
    tar -cf - * | tar -C /mnt/mfs -xf -
    
    # Оригинальный mfsroot больше не нужен
    cd /mnt/mfs
    umount /mnt/omfs
    vnconfig -d $odev
    rm $TMPDIR/mfsroot.orig
    
    # Затачиваем новый mfsroot под неинтерактивную загрузку
    rm -r etc bin sbin var stand/etc stand/help
    ln -s stand bin
    ln -s stand sbin
    mkdir -p tmp
    
    # В тестовой системе /usr и /var - отдельные от рута fs,
    # при промежуточной загрузке будут смонтированы так:
    # /mnt          - рут
    # /mnt/usr      - /usr
    # /mnt/var      - /var
    # Таким образом, chroot /mnt при желании
    # после загрузки даст нам оригинальный расклад
    # и позволит воспользоваться новым sysinstall-ом
    ln -s mnt/usr usr
    ln -s mnt/var var
    
    # Hовые бинарники используются новым ядром
    # при загрузке с md0
    cd $CDROM
    # игнорировать ошибки касательно "File exists"
    tar cf - bin etc lib libexec sbin | tar -C /mnt/mfs -xkf -
    
    # Минимально необходимый набор файлов со старой системы для успешного
    удаленного
    # входа в систему; nsswitch.conf берем с новой системы
    cd /etc
    cp -rp fstab host.conf rc.conf ssh passwd group master.passwd pwd.db spwd.db
    /mnt/mfs/etc
    cat <<EON > /mnt/mfs/etc/nsswitch.conf 
    group: files
    hosts: files dns
    networks: files
    passwd: files
    shells: files
    EON
    
    Теперь нужно привести /mnt/mfs/etc/fstab к примерно следующему виду:
    # Device                Mountpoint      FStype  Options         Dump    Pass#
    /dev/md0                /               ufs     rw              1       1
    /dev/ad0s1b             none            swap    sw              0       0
    /dev/ad0s1a             /mnt            ufs     rw              2       2
    /dev/ad0s1f             /mnt/usr        ufs     rw              2       2
    /dev/ad0s1e             /mnt/var        ufs     rw              2       2
    
    Первая строка обязательно такая, остальные - из оригинального fstab,
    точку монтирования для рута заменяем на /mnt,
    /usr и /var тоже смещаем внутрь /mnt, остальные файловые системы
    (если есть) намеренно не упоминаем.
    
    В /mnt/mfs/etc/fstab желательно отключить все сервисы, кроме
    sshd и каналообразующих (учитывать, что грузиться будет GENERIC),
    что-то типа этого:
    
    ifconfig_rl0="inet x.x.x.x netmask 255.255.255.0"
    hostname="host.domain.ru"
    sendmail_enable="NONE"
    firewall_enable="NO"
    inetd_enable="NO"
    sshd_enable="YES"
    fsck_y_enable="YES"
    background_fsck="NO"
    # EOF
    
    Закрываем и запаковываем mfsroot:
    
    cd $TMPDIR
    umount /mnt/mfs
    vnconfig -d $dev
    gzip -1 < mfsroot > /boot/mfsroot.gz
    
    4. Подгрузка полученного mfsroot:
    
    cd /boot
    cat loader.conf6 >> loader.conf
    
    Это добавляет в loader.conf следующие команды:
    
    mfsroot_load="YES"                                                            
    
    mfsroot_type="mfs_root"                                                        
    
    mfsroot_name="/boot/mfsroot"
    
    Hа работу четвертой версии не влияет никак, пока по-прежнему
    используется старая корневая файловая система, только увеличивается
    размер оперативной памяти, зарезервированной ядром. Hа машине с 48M памяти
    изменение составило те самые 14M, avail memory вместо 44316K стала 30140K.
    
    5. Решающий момент. Для загрузки нового ядра с новым рутом посредством
    nextboot:
    
    cat <<EOF > nextboot.conf
    nextboot_enable="YES"
    kernel="kernel6"
    vfs.root.mountfrom="ufs:md0"
    EOF
    
    Если новое ядро, скажем, зависнет на этапе определения оборудования
    до перехода в multiuser, достаточно дернуть питание и машина
    загрузит старое ядро и четвертую версию и у вас есть возможность
    спокойно разобраться, система тем временем работает. При следующей
    попытке этот пункт нужно повторить, nextboot.conf будет удалён
    при перезагрузке.
    
    При использовании cut-n-paste команд из этого пункта проверьте,
    что в конце строк nextboot.conf нет лишних пробелов - загрузчик
    этого не любит и может проигнорировать конфигурацию nextboot.
    
    Перезагружаемся!
    
    6. При успешной загрузке запускается старый /usr/sbin/sshd,
    через него заходим в систему. Авторизация через keyboard-interactive
    не срабатывает, зато срабатывает через password, то есть в систему
    пустит после четвертой попытки набора пароля. Эту косметическую
    проблему править не стал, всё равно на это один только раз
    наталкиваемся.
    
    Переименовываем /mnt/stand в /mnt/stand4,
    создаём новый /mnt/stand, копируем /stand/sysinstall в
    /mnt/stand/sysinstall, делаем chroot /mnt.
    
    7. Это - точка, после которой нет возврата, кроме восстановления
    из бекапа с консоли. Сейчас пока можно ещё перегрузиться обратно
    в четверку и работать по-старому. Дальше уже нет.
    
    # если не сделать этой правки loader.conf, система не поднимется
    echo 'kernel="GENERIC"' >> /boot/loader.conf
    /stand/sysinstall
    
    Выбираем Upgrade. Я делал бинарное обновление по FTP,
    из дистрибьюшнов ставил только base и kernels (меню Custom).
    Во время обновления в терминал выдавалось куча мусора от распаковщика,
    но это косметическое неудобство. Апгрейд прошел совершенно
    гладко, система перезагрузилась уже в шестерку с винта
    и доступна (теперь уже через свежий) sshd.
    
    Убираем строки mfsroot_* из /boot/loader.conf
    Hе забываем разгрести /etc/upgrade или сделать
    обновление из исходников, mergemaster позаботится о /etc.
    В любом случае перезагружаемся опять, теперь уже
    это будет не из mfsroot. 
    
    
     
    Скрипт деинсталляции пакетов во FreeBSD вместе с зависимостями.   Автор: Artem A. Kolpakov   [есть мнение]
     
    #!/usr/bin/perl
    #
    # Interactive script for deinstalling 'leaf' FreeBSD packages.
    #
    # Copyright (c) 2007 Artem A. Kolpakov <artem.kolpakov at gmail.com>
    #
    # All rights reserved.
    #
    # Redistribution and use in source and binary forms, with or without
    # modification, are permitted provided that the following conditions
    # are met:
    # 1. Redistributions of source code must retain the above copyright
    #    notice, this list of conditions and the following disclaimer.
    # 2. Redistributions in binary form must reproduce the above copyright
    #    notice, this list of conditions and the following disclaimer in the
    #    documentation and/or other materials provided with the distribution.
    #
    # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
    # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
    # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
    # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    # SUCH DAMAGE.
    
    $dbdir="/var/db/pkg";
    
    die "Usage: pkg_deinstall.pl \'package_name\' or \'$dbdir/package_name\'.\n" if(!defined($ARGV[0]));
    $pkg=$ARGV[0];
        
    if(map /$dbdir/, $pkg) {
        $pkg=~/$dbdir\/(\S+[^\/])/; $pkg=$1;
    }
    die "$pkg is not installed!\n" if((!map /\S+\d/, $pkg)||(!-e "$dbdir/$pkg"));
     
    if(-w $dbdir) { $rw=1; } else { $rw=0; }
    if(-s "$dbdir/$pkg/+REQUIRED_BY") {
        open(REQ, "$dbdir/$pkg/+REQUIRED_BY");
        while(<REQ>) { print "Found required dependence: $_"; $req_sum++; }
        close(REQ);
    }
    die "Required dependencies: $req_sum.  Remove is impossible.\n" if($req_sum);
    
    open(DEP, "$dbdir/$pkg/+CONTENTS");
    while(<DEP>) {
    
        if(/\@pkgdep\s(\S+)\n/) {
            $pkg_depends{$1}=1; print "Dependence: $1\n";
        }
    }
    close(DEP);
    
    die "You have not privilegies to complete operation.\n" if(!$rw);
    
    $dep_sum=(keys %pkg_depends);
    if($dep_sum) {
        print "Total dependencies: $dep_sum. Removing package.\n";
    }
    else {
        system "pkg_delete $pkg";
        die "The package has been removed.\n";
    }
    system "pkg_delete $pkg";
    print "Done, processing...\n";
    while(scalar(keys %pkg_depends)) {
        $level++;
        if($level > 1) {
            for $pkg_depends (keys %pkg_depends) {
                if($pkg_depends{$pkg_depends} == $level-1) {
                    if(-e "$dbdir/$pkg_depends/+CONTENTS") {
                        open(DEP, "$dbdir/$pkg_depends/+CONTENTS");
                        while(<DEP>) {
                            if(/\@pkgdep\s(\S+)\n/) {
                                $pkg_depends{$1}=$level;
                            }
                        }
                        close(DEP);
                        open(COMMENT, "$dbdir/$pkg_depends/+COMMENT");
                        chomp($comment=<COMMENT>); close(COMMENT);
                        dialog:
                        print "Are you sure want to remove \'$pkg_depends\'? \- \'$comment\' [Y/n]: ";
                        chomp($in=<STDIN>);
                        if(($in eq "y")||($in eq "Y")||($in eq '')) {
                            system "pkg_delete $pkg_depends";
                            delete $pkg_depends{$pkg_depends}; $rm_dep_sum++;
                        }
                        elsif(($in eq "n")||($in eq "N")) {
                            delete $pkg_depends{$pkg_depends};
                        }
                        else { goto dialog; }
                    }
                    else {
                        delete $pkg_depends{$pkg_depends};
                    }
                }
            }
        }
        for $pkg_depends (keys %pkg_depends) {
            if($pkg_depends{$pkg_depends} == $level) {
                if(-s "$dbdir/$pkg_depends/+REQUIRED_BY") {
                    delete $pkg_depends{$pkg_depends};
                }
            }
        }
    
    }
    if($rm_dep_sum) {
        print "Removed $rm_dep_sum dependencies.\n";
    }
    else { print "No dependencies removed.\n"; }
    
     
    FreeBSD fetch proxy (1)   Автор: Roman Y. Bogdanov  [есть мнение]
     
    shell:
       setenv HTTP_PROXY http://user:pass@10.20.30.40:3128
       setenv FTP_PROXY http://40.30.20.10:8080
    
    
    # cat /etc/make.conf | grep FETCH_CMD
       FETCH_CMD=/usr/bin/fetch -ARrvp -T 10 
    
     
    Работа cvsup и csup через proxy   Автор: st_serg  [есть мнение]
     
    Использования nc (netcat) в качестве прокси для cvsup и csup.
    
    rc.conf:
       inetd_enable="YES"
    
    inetd.conf:
       cvsup stream tcp nowait root /usr/bin/nc nc -xA.B.C.D:8080 -Xconnect cvsup2.ru.freebsd.org 5999
    
    supfile:
       *default host=127.0.0.1
    
     
    Запуск стартовых скриптов из портов FreeBSD без изменения /etc/rc.conf   Автор: Svinka  [есть мнение]
     
    Для запуска/остановки сервиса с помощью стартового скрипта вручную
     без внесения записи в /etc/rc.conf найдено такое решение (FreeBSD 6.*, csh):
    
    
       env samba_enable=YES /usr/local/etc/rc.d/samba start
       env samba_enable=YES /usr/local/etc/rc.d/samba stop
    
     
    Автоматизация создания скомпилированных пэкаджей во FreeBSD   Автор: Eugene Pankratov  [есть мнение]
     
    #!/bin/sh
    #
    # pkgmake
    # Create package by name or full installed tree
    # Version: 1.0b
    # Copyright (c) 2007 Eugene Pankratov
    
    pkg_path="/usr/ports/packages/All"
    pkg_cmd="pkg_create -yb"
    
    usage()
    {
        echo ""
        echo "Usage: `basename $0` <pkg_name>|--all"
        echo ""
        echo "Example: `basename $0` kdebase_3.5.5_3"
        echo "         `basename $0` --all"
        exit 1
    }
    
    do_package()
    {
    pkg_name=$1
    pkg_file=${pkg_name}.tbz
    
        if [ ! -f ${pkg_path}/${pkg_file} ]; then
            echo -n "Creating package '${pkg_name}'... "
            ${pkg_cmd} ${pkg_name}
            echo "Done."
        else
            echo "Package ${pkg_file} already exists. Skiping"
        fi
    }
    
    do_all()
    {
        echo "Creating all installed packages"
        for i in `pkg_info | awk '{ print $1 }'`
        do
            do_package ${i}
        done
    }
    
    main()
    {
        if [ "$1" = "" ]; then usage
        else
            cd ${pkg_path}
            if [ "$1" = "--all" ]; then
                do_all
            else
                do_package $1
            fi
        fi
    
    }
    
    main $1
    
    exit 0
    
    
     
    Скрипт для создания всех пакетов, требуемых по зависимостям, для порта в ОС FreeBSD   Автор: Alexey Tsvetnov  [есть мнение]
     
    По сути, выполняет действия, аналогичные pkg_create с ключём -R, который появился только в FreeBSD 6.x. 
    Однако данный скрипт позволяет указывать короткое имя порта и каталог, 
    в котором создавать пакеты. А главное, он работает и на тех системах, 
    где pkg_create не поддерживает ключ -R.
    
    #!/bin/sh
    #
    # pkg_depend
    # Create all packages (with dependence) needed by some port for FreeBSD 5.x+
    #
    # Version: 1.4
    # Copyright (c) 2005,2006 Alexey Tsvetnov, vorakl@fbsd.kiev.ua
    #
     
    # Path to packages directory
    pkgpath="/usr/ports/packages/All"
     
    # Command for get package's version
    pkgvercmd="pkg_version -v"
    #pkgvercmd="portversion -v"              # more faster than pkg_version
     
    getdepend()
    {
        [ ! -d $2 ] && echo -n "Creating directory ($2)..." && mkdir -p $2 && echo "Done."
     
        cd ${pkgpath}
        if [ ! -f ${pkgpath}/$1.tbz ]; then
            echo -n "Creating package ($1)..."
            pkg_create -yb $1
            echo "Done."
        fi
     
        echo -n "Copying package ($1)..."
        cp -f ${pkgpath}/$1.tbz $2
        echo "Done."
     
    
        for LINE in `pkg_info -r $1 | grep Dependency\: | awk '{print $2}'`
        do
            if [ ! -f ${pkgpath}/${LINE}.tbz ]; then
                echo -n "Creating package (${LINE})..."
                pkg_create -yb ${LINE}
                echo "Done."
            fi
            echo -n "Copying package (${LINE})..."
            cp -f ${pkgpath}/${LINE}.tbz $2
            echo "Done."
        done
    }
     
    gethelp()
    {
        echo ""
        echo "Usage: `basename $0` <Full/Short pkg_name> <Directory>"
        echo ""
        echo "If specify short package name script will get first find entry"
        echo ""
        echo "Example: `basename $0` dia-gnome-0.94_4,1 /tmp/pkg/"
        echo "         `basename $0` dia-gnome /tmp/pkg/"
        echo ""
        exit 1
    }
     
    main()
    {
    if [ "$2" = "" ]; then gethelp
     else
        echo -n "Checking package name ($1)..."
        if [ "`echo $1 | grep '\-[0-9]'`" = "" ]; then
            pkgname=`${pkgvercmd} | grep -E '^'$1'-[0-9].*' | awk '{print $1}' | head -1`
        else
            pkgname=`${pkgvercmd} | grep $1 | awk '{print $1}' | head -1`
        fi
        echo "Done."
     
        if [ "${pkgname}" = "" ]; then
            echo "Package '$1' not found! Exit."
            exit 2
        else
            getdepend ${pkgname} $2
        fi
    fi
    }
     
    main $1 $2
     
    exit 0
    
     
    Скрипт для автоматизации создания бинарных пакетов для FreeBSD   Автор: Alexey Tsvetnov  [есть мнение]
     
    #!/bin/sh
    #
    # Create all packages with sym-links for FreeBSD 5.x+
    #
    # Version: 1.2.2
    # Copyright (c) 2006 Alexey Tsvetnov, vorakl@fbsd.kiev.ua
    #
    # All error in  /var/log/<script_name>.err
    #
    
    # Path to packages directory
    packagespath="/usr/ports/packages"
    
    # Command for get package's version
    pkgvercmd="/usr/sbin/pkg_version -v"
    #pkgvercmd="/usr/local/sbin/portversion -v"	# more faster than pkg_version
    
    #-------------------------------------------------------------------------------
    
    err="\033[0;40;31mError\033[0m"
    ok="\033[1;40;33mOk\033[0m"
    
    
    checkPackagesPath ()
    {
        [ -d $packagespath ] || { /usr/bin/printf " *** $err: $packagespath doesn't exist.\n"; 
    			      /bin/echo " *** Error: $packagespath doesn't exist." > /var/log/`basename $0`.log; 
    			      exit 1; }
        [ -d $packagespath/All ] || { /bin/mkdir $packagespath/All || exit 1; }
        [ -d $packagespath/Latest ] || { /bin/mkdir $packagespath/Latest || exit 1; }
        return 0
    }
    
    checkPkgAll ()
    {
        [ -f $packagespath/All/$fullname.tbz ] && return 0
        return 1
    }
    
    checkPkgLatest ()
    {
        [ -L $packagespath/Latest/$shortname.tbz ] && [ -r $packagespath/Latest/$shortname.tbz ] && return 0
        return 1
    
    }
    
    checkPkgCat ()
    {
        [ -L $packagespath/$subdir/$fullname.tbz ] && [ -r $packagespath/$subdir/$fullname.tbz ] && return 0
        return 1
    }
    
    createPkgAll ()
    {
        /usr/sbin/pkg_create -jb $fullname $packagespath/All/$fullname.tbz && return 0
        return 1
    }
    
    createPkgLatest ()
    {
        /bin/rm -f $packagespath/Latest/$shortname.tbz
        cd $packagespath/Latest && /bin/ln -s ../All/$fullname.tbz $shortname.tbz && return 0
        return 1
    
    }
    
    createPkgCat ()
    {
        if [ -d $packagespath/$subdir ]; then
    	/bin/rm -f $packagespath/$subdir/$fullname.tbz
        else
    	/bin/mkdir -p $packagespath/$subdir
        fi
    
        cd $packagespath/$subdir && /bin/ln -s ../All/$fullname.tbz $fullname.tbz && return 0
        return 1
    }
    
    getPkgFullVersion ()
    {
        echo -n "Geting full version package list..."
        pkglist=`$pkgvercmd | /usr/bin/awk '{print $1}'`
        /usr/bin/printf "$ok\n"
    }
    
    work ()
    {
     for fullname in $pkglist; do
        /bin/echo "Check $fullname"
    
    
        shortname=`/bin/echo $fullname | /usr/bin/sed 's/\-[^-]*$//'`
        subdir=`/usr/sbin/pkg_info -o $fullname | /usr/bin/sed -e '1,3d' -e '$d' | /usr/bin/awk -F/ '{print $1}'`
    
        if ! checkPkgAll; then
    	/bin/echo -n " ==> Create package..."
    	if createPkgAll; then /usr/bin/printf "$ok\n"
    	  else /usr/bin/printf "$err\n"
    	fi
    
    	/bin/echo -n " ==> Create Latest sym-link..."
    	if createPkgLatest; then /usr/bin/printf "$ok\n"
    	  else /usr/bin/printf "$err\n"
    	fi
    
    	/bin/echo -n " ==> Create Category sym-link..."
    	if createPkgCat; then /usr/bin/printf "$ok\n"
    	  else /usr/bin/printf "$err\n"
    	fi
    
    
    	continue
        fi
    
        if ! checkPkgLatest; then  
    	/bin/echo -n " ==> Create Latest sym-link..."
    	if createPkgLatest; then /usr/bin/printf "$ok\n"
    	  else /usr/bin/printf "$err\n"
    	fi
        fi
    
        if ! checkPkgCat; then  
    	/bin/echo -n " ==> Create Category sym-link..."
    	if createPkgCat; then /usr/bin/printf "$ok\n"
    	  else /usr/bin/printf "$err\n"
    	fi
        fi
     done
    }
    
    main ()
    {
        exec 2>/var/log/`basename $0`.log
    
    
        checkPackagesPath
        getPkgFullVersion
        work
    
        exec 2>&-
    }
    
    main
    
    exit 0
    
     
    Создаем из 2х установочных CD с FreeBSD 5.4 - один DVD. (1)   Автор: JackSoft  [есть мнение]
     Вот тут надоело шаманство со сменой СD при инсталляции очередной FreeBSD 5.4 и было решено создать инсталляционный DVD - быстро и все в одном. Сразу оговорюсь - все манипуляции с ISO-образами проводились с помощью UltaISO 7.2.3.906.

    Все началось с того что я сравнил файлы INDEX в папках /packages на обоих CD и нашел их полную идентичность. Позже, изучив их содержимое, определил что за номер диска на котором находится установочный пакет отвечает последняя цифра в строке, которую честно поменял на 1.

    После чего все файлы с CD 2 (кроме cdrom.inf) были полностью перенесены в ISO образ CD 1 и в /packages записан патченный (см. выше) файл INDEX. Записываем ISO и получаем то что нам нужно - инсталяционный DVD.

    Я пошел дальше. С папки /5.4-STABLE-SNAP006/ports (я на этом снепшопе делал) достал архив (tar/gz) ports.tgz, распаковал его и в директорию /ports/distfiles закинул последние скачанные порты (кидал самое необходимое при установке без доступа в Инет - например, Midnight Commander), опять сжал архив и положил его на место в ISO-образе. Теперь порты распаковываются при установке вместе с моими distfiles...

     
    Перенос системы FreeBSD на новый жёсткий диск. (1)   Автор: LM  [есть мнение]
     
    По ссылке приведён удачный метод переноса FreeBSD на новый жёсткий диск произвольного размера.
    
    Вкратце это делается так:
    
    1. Подключаем новый жёсткий диск в систему с FreeBSD (/dev/ad1s1)
    
    2. С помощью /stand/sysinstall разбиваем новый диск на разделы так же как это сделано на старом. 
    То есть чтобы /dev/ad0s1a соответствовал /dev/ad1s1a - размер /dev/ad1s1a может быть большем чем на /dev/ad0s1a.
    
    3. Создаём временные папку и подпапки:
       mkdir /backup
       mkdir /backup/root
       mkdir /backup/usr
       mkdir /backup/var
       mkdir /backup/tmp
    
    4. Загружаемся в single user
    
    5. Монтируем разделы:
       mount /dev/ad1s1a /backup/root
       mount /dev/ad1s1e /backup/var
       mount /dev/ad1s1f /backup/usr
       (тут указываем свои)
    
    6. Переносим систему:
    
       ( dump -0f - / ) | ( cd /backup/root ; restore -rf - )
       ( dump -0f - /var ) | ( cd /backup/var ; restore -rf - )
       ( dump -0f - /usr ) | ( cd /backup/usr ; restore -rf - )
    
    7. Размонтируем
       umount /backup/root
       umount /backup/var
       umount /backup/usr
    
    8. Включаем Soft Updates
    
       tunefs -n enable /dev/ad1s1a
       tunefs -n enable /dev/ad1s1e
       tunefs -n enable /dev/ad1s1f 
    
    Всё теперь можно с чистой совестью убрать из системы старый жёсткий диск, а на его место поставить новый.
    
     
    Как создать INDEX файл после обновления коллекции портов в последних версиях FreeBSD   Автор: [есть мнение]
     
    Скачать индексный файл:
       cd /usr/ports
       make fetchindex
    
    Или сгенерировать с нуля:
       make index (работает очень долго).
    
     
    Сборка FreeBSD портов другой версией GCC   Автор: [есть мнение]
     
    Во FreeBSD 5.3 используется GCC-3.4.2, некоторые программы в портах в связи с этим перестали нормально собираться.
    В некоторых портах появились соответсвующие записи:
         BROKEN="Does not compile with gcc 3.4.2"
    
    Для решения проблемы можно попробовать откомпилировать другой версией gcc, 
    например,  lang/gcc295. Исправить Makefile, закомментировав BROCKEN и устанавливать:
         csh:  # setenv CC /usr/local/bin/gcc295 && make install clean
         bash: # export CC=/usr/local/bin/gcc295 && make install clean