|
Главная / 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) |
Автор:
[обсудить]
|
| Стратегии организации ввода-вывода:
- Блокируемый I/O - после вызова read/write происходит блокировка до завершения
операции, функция завершается только после принятия или передачи блока данных.
- Неблокируемый I/0 - функция завершается сразу, если данные не были приняты/отправлены
возвращается код ошибки (т.е. нужно вызывать функции I/O в цикле пока не получим
положительный результат).
- Мультиплексирование через select/poll - опрашиваем список состояния сокетов,
перебирая состояния определяем сокеты готовые для приема/передачи.
Главный минус - затраты на перебор, особенно при большом числе неактивных
сокетов.
- select - число контролируемых сокетов ограничено лимитом FD_SETSIZE,
в некоторых случаях лимит обходится пересборкой программы, в других - пересборкой
ядра ОС.
- poll - нет лимита FD_SETSIZE, но менее эффективен из за большего размера передаваемой
в ядро структуры.
- Генерация сигнала SIGIO при изменении состояния сокета (ошибка, есть данные для приема,
или отправка завершена), который обрабатывает обработчик SIGIO.
В классическом виде применение ограничено и трудоемко, подходит больше для UDP.
- Асинхронный I/O - описан в POSIX 1003.1b (aio_open, aio_write, aio_read...),
функция aio_* завершается мгновенно, далее процесс сигнализируется о
полном завершении операции ввода/вывода (в предыдущих пунктах процесс информировался
о готовности прочитать или передать данные, т.е. данные еще нужно было принять или отправить
через read/write, в aio_* процесс сигнализируется когда данные полностью получены и скопированы в локальный буфер).
- Передача данных об изменении состояния сокета через генерацию событий. (специфичные для определенных ОС решения, малопереносимы, но эффективны).
- kqueue - лучшее для FreeBSD, NetBSD. Данные о нескольких событиях могут быть переданы за раз, очень гибкое решение.
- /dev/epoll - лучшее для 2.6 Linux ядра, передача нескольких событий за раз, трудоемкость поддержки /dev/epoll если параллельно в программе поддерживаются другие механизмы нотификации.
- Realtime Signals (F_SETSIG) - лучшее для 2.4 Linux ядра.
- /dev/poll - имеет смысл в Solaris, в Linux реализация недостаточно хороша.
- Ссылки:
|
|
|
|
|
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
|
|
|
|
|
|
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 запросы для привязанных к нему адресам.
|
|
|
|
|
|
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. |
Автор:
[есть мнение]
|
| Скрипт /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 &
|
|
|
|
|
|
Два провайдера и 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
|
|
|
|
|
|
Пример настройки 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
|
|
|
|
|
|
Настройка беспроводного соединения в 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
|
|
|
|
|
|
Обход блокировки 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
|
|
|
|
|
|
Экспорт 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
|
|
|
|
|
|
Как в 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
|
|
|
|
|
|
Как сгенерировать 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
|
|
|
|
|
|
Туннели с использованием 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").
|
|
|
|
|
|
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";
};
};
|
|
|
|
|
|
Настройка 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 не запускается и ругается на отсутствие файла history |
Автор:
Andrey Slusar
[обсудить]
|
| makehistory -b -f history -O -l 30000 -I
makedbz -f history -i -o -s 30000
|
|
|
|
|
|
Полезные команды 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 – 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
|
|
|
|
|
|
Блокирование спама в 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/
|
|
|
|
|
|
Как через 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 клиента под 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 скинуть 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 сервере (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
Для того что бы администрировать сервер придется поставить
программу удаленного администрирования через веб-интерфейс – Webmin.
После установки к серверу можно подключится через веб интерфейс по адресу https://localhost:10000
и там в службах есть настройка SMB-сервера, где можно Linux-пользователей копировать в SMB-пользователей.
|
|
|
|
|
Сборка Samba с авторизацией в домене 2003 на FreeBSD |
Автор:
Артём
[есть мнение]
|
| Решил рассказать про проблемы с которыми я столкнулся при сборке самбы:
- В самбе 3.14a наблюдается некорректная запись в логи даже при правильной настройке.
- Были проблемы при сборке с heimdal. Команда id не выводила пользователей доменов при правильных конфигах, хотя всё работало.
- Чтобы керберос работал по tcp надо писать
tcp/имя сервера:порт, а не kdc = tcp/server !
- Пока не обновил порты и не пересобрал базу портов ( смотрите статью "хитрости работы с портами") 5 керберос не собирался.
- После того как я решил переджойнить машину в домен, билет не хотел обновляться ни в какую. Пришлось ждать 10 часов пока он умрёт. Желающие могут поразвлекаться с утилитой управления билетами, которая входит в 2003 recourse kit и называется kutil.
- Решение - сразу обновить порты собирать только новое ! 3.0.22 на данный момент + 5 kerberos . Сразу включать его работу через tcp .
После того как всё завелось ничего не переджойнивать и преспокойно раздавать шары.
- Без обновлений портов работала связка 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
|
|
|
|
|
|
Туннели с использованием 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
}
|
|
|
|
|
|
Обеспечение работы системы мониторинга 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
|
|
|
|
|
|
Почему 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 в корень сайта.
|
|
|
|
|
|
Как назначить 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"
|
|
|
|
|
|
Решение проблемы с постингом русских сообщений в 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 и некоторые модули. |
Автор:
[обсудить]
|
| Директива 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
|
|
|
|
|
|
Отдача статического 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 в режиме акселератора для кэширования.
|
|
|
|
|
|
Каким 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-сервер для раздачи статики и картинок.
|
|
|
|
|
|
Пример привязки к географическому положению посетителя в 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]
|
|
|
|
|
|
Как узнать логин в домене 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 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
|
|
|
|
|
|
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 к 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 занимаются переиндексацией системных баз |
Автор:
[есть мнение]
|
| /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 (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
|
|
|
|
|
|
Как включить 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
|
|
|
|
|
|
Как увеличить производительность дисковой подсистемы 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
|
|
|
|
|
|
Быстрое создание 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 запретить свободный вход как 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 на 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
|
| | |