Безопасность и оптимизация Linux.Редакция для Red Hat

         

Атрибут “noatime”.


Linux имеет опцию монтирования файловой системы, называемую “noatime”. Она может быть добавлена в поле опций файла “/etc/fstab”. Если файловая система смонтирована с этой опцией, то при доступе к ней по чтению, информация “atime” изменяться не будет. Важность установки опции “noatime” в том, что она устраняет необходимость операции записи в файловую систему для файлов, которые просто читаются. Так как запись “дорогая” операция, то ее отсутствие может существенно улучшить эффективность системы. Обратите внимание, что информация wtime продолжает изменяться при записи в файл.

В нашем примере мы устанавливаем опцию noatime для файловой системы /chroot.

Редактируйте файл /etc/fstab и добавьте, например, такую строку:
E.I: /dev/sda7 /chroot ext2 defaults,noatime 1 2

Перезагрузите вашу систему и проверьте, что у вас получилось:
[root@deep]# reboot


[root@deep]# cat /proc/mounts


/dev/root / ext2 rw 0 0


/proc /proc proc rw 0 0


/dev/sda1 /boot ext2 rw 0 0


/dev/sda8 /cache ext2 rw 0 0


/dev/sda7 /chroot ext2 rw,noatime 0 0


/dev/sda6 /home ext2 rw 0 0


/dev/sda11 /tmp ext2 rw 0 0


/dev/sda5 /usr ext2 rw 0 0


/dev/sda9 /var ext2 rw 0 0


none /dev/pts devpts rw 0 0

Мы видим, что /chroot имеет атрибут noatime.



Файл “/etc/nsswitch.conf”.


Файл “/etc/nsswich.conf” используется для настройки того, какой сервис использовать для получения такой информации как имя хоста, файл паролей, файл с группами и т.д. Два последних пункта (файл с паролями и файл с группами) мы не используем, так как у нас на сервере нет NIS. Таким образом мы акцентируем наше внимание на строке hosts

Редактируйте файл nsswitch.conf (vi /etc/nsswitch.conf) и измените строку “hosts”, чтобы она читалась:
"hosts: dns files"



которая говорит программам желающим определить адреса, что вначале необходимо воспользоваться службой DNS, а затем, если DNS не отвечает, файлом “/etc/hosts”.

Также, я настоятельно рекомендую удалить все вхождения NIS из каждой строки, если вы не используете NIS. В результате файл /etc/nsswitch.conf может выглядеть следующим образом:
passwd: files


shadow: files


group: files


hosts: dns files


bootparams: files


ethers: files


netmasks: files


networks: files


protocols: files


rpc: files


services: files


automount: files


aliases: files



Файл “/etc/profile”.


Файл “/etc/profile” включает системное окружение всех исполняемых программ. Все настройки добавленные в этот файл отражаются на переменные окружения вашей системы. Так, помещение в этот файл флагов оптимизации – это хорошая идея. Чтобы выжать максимальную эффективность из ваших программ под x86, вы можете использовать при компиляции флаг –09, обозначающий полную оптимизацию. Многие программы содержат в Makefile опцию –02, но –09 обозначает высший уровень оптимизации при которой размер файла увеличивается, но увеличивается и скорость выполнения.

Замечание. Использование опции –09 не всегда приводит к наилучшим результатам. Это верно для x686 и выше процессоров, но для более старых процессоров не всегда так.

При компиляции можно использовать опцию -fomit-frame-pointer, которая говорит, что для доступа к переменным нужно использовать стек. К сожалению, с этой опцией практически невозможна отладка. Можно использовать переключатель -mcpu=cpu_type и -march=cpu_type при помощи которых создается код, оптимизированный для определенного CPU. Полученный код будет работать только на заданном процессоре или более новом. Приведенные ниже оптимизационные флаги запишите в файл /etc/profile. Они влияют только на программы, которые вы будете компилировать в дальнейшем и не оказывают на какого действия на существующую систему.

Шаг 1.

Для CPU i686 или PentiumPro, Pentium II, Pentium III
В файл “/etc/profile” добавьте следующую строку:
CFLAGS=’-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions’

Для CPU i586 или Pentium
В файл “/etc/profile” добавьте следующую строку:
CFLAGS=’-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-double -fno-exceptions’

For CPU i486
В файл “/etc/profile” добавьте следующую строку:
CFLAGS=’-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fno-exceptions’

Шаг 2.

После выбора типа процессора добавьте в строку export файла “/etc/profile” переменные "CFLAGS LANG LESSCHARSET"
export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET


Шаг 3.

Выйдете из системы и вновь в нее войдете, чтобы опции определенные переменной CFLAGS вступили в силу и все программы и другие “configure” утилиты стали ее учитывать. Оптимизация под Pentium (Pro/II/III) будет работать только с компиляторами egcs и pgcc. Egcc уже установлен на вашем сервере, поэтому об этом думать не надо.

Ниже приведено описание опций, которые мы использовали:

-funroll-loops

Выполняется оптимизация развертыванием циклов. Это осуществляется для циклов число итераций которых может быть определено во время компиляции или во время выполнения.

-funroll-all-loops

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

-ffast-math

Эта опция позволяет GCC нарушать некоторые ANSI или IEEE правила и/или спецификации в интересах оптимизации кода по скорости выполнения. Например, это позволяет компилятору предполагать, что параметры к функции sqrt - не-отрицательные числа и что значения не с плавающей запятой являются NaNs.

-malign-double

Контролирует, выравнивает ли GCC double, long double и long long переменные на двусловной границе или однословной границе. Выравнивание double переменных на двусловной границе создает код, который выполняется на “Pentium” процессорах несколько быстрее, расходуя больше памяти.

-mcpu=cpu_type

Определяет значание типа процессора при планировании используемых инструкций. При определении конкретного типа CPU, GCC будет использовать инструкции специфичные для него. Когда эта опция не определена, никогда не будут использоваться команды не работающие на i386 процессоре. "I586" эквивалентен "Pentium", "i686" эквивалентен "Pentium Pro". "K6" - AMD.

-march=cpu_type

Создает инструкции для CPU cpu_type. Выбор типов процессоров такой же как и для mcpu. Кроме того, использование `-march=cpu_type' подразумевает и `- mcpu=cpu_type'.

-fforce-mem

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

-fforce-addr




вынуждает копировать постоянные адреса памяти в регистры перед выполением арифметических операций над ними. В результате может создаваться более хороший код, так же как и при -fforce-mem.

-fomit-frame-pointer

Не сохранять указатель на кадр (frame pointer) в регистре для функций, которые не нуждаются в этом. Это позволяет избежать инструкций на сохранение, определение и восстановление указателя на кадр (frame pointer); в то же время освобождая регистры для других функций. Это делает невозможным отладку на большинстве машин.

Замечание. Все возможности оптимизации, которые описаны в этой книге относятся к семейству процессоров Pentium II/III. Так, что вы должны при необходимости изменить флаги компиляции под ваш тип процессора.
Результаты тестирования быстродействия, суммирование по архитектурам.

В зависимости от типа вашего процессора и версии компилятора (gcc/egcs) опции оптимизации могут отличаться. Графики приведенные ниже помогут вам выбрать лучшие для вас флаги компиляции.

Версия компилятора установленного в Red Hat 6.1 и 6.2 - egcs 2.91.66. Но перед выбором опций оптимизации обязательно проверьте его версию, используя команду:
egcs –version

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

Сейчас приведем пример:

Для CPU Pentium II/III (i686) и компилятора egcs-2.91.66 лучшими опциями оптимизации будут:
CFLAGS=’-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions’



Для CPU pentium (i586) с компилятором egcs-2.91.66 лучшими опциями оптимизации будут:
CFLAGS=’-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-double -fno-exceptions’



Для CPU i486 с компилятором egcs-2.91.66 лучшими опциями оптимизации будут:
CFLAGS=’-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fno-exceptions’




Краткий обзор


На этой стадии вы должны иметь настроенный и защищенный Linux сервер. Наш сервер содержит наиболее необходимые пакеты и программы, которые должным образом настроены, чтобы правильно работать. Прежде чем продолжить дальше и устанавливать сервисы нужные пользователям мы займемся настройкой нашего сервера. То, что мы будем делать дальше относится ко всей системе в целом. Эти настройки будут влиять и на работу сервисов, которые мы установим позже. Если в вашем компьютере не стоит x386 процессор, то Red Hat не настроен под вас оптимальным образом. Эта глава проведет вас через различные шаги настройки сервера и файловой системы под конкретный тип процессор, объем память и сеть.



Настройка производительности IDE дисков.


Быстродействие IDE дисков увеличивается при использовании UDMA, 32- битного режима обмена данными и многосекторного режима. Ядро использует консервативный режим работы с дисками, пока ему не скажешь изменить это. “Волшебная” команда для изменения установок – hdparm.

Включение 32-bit I/O через шину PCI:
[root@deep]# /sbin/hdparm -c 1 /dev/hda (или hdb, hdc и т.д.).

Man для “hdparm” (8) говорит, что для некоторых чипсетов нужно использовать -c 3. Все (E)IDE диски до сих пор имеют 16-разрядное подключение через ленточный кабель к интерфейсной карте.

Включение DMA:
[root@deep]# /sbin/hdparm -d 1 /dev/hda (или hdb, hdc и т.д.).

Возможность использования этой команды зависит от поддержки чипсета вашей материнской платы ядром. При включении DMA отменяется синхронизация буферизированного чтения диска в результате чего быстродействие может увеличиться в 2 раза.

Для включения multiword DMA mode 2:
[root@deep]# /sbin/hdparm -d 1 -X34 /dev/hda (или hdb, hdc и т.д.).

Эта установка используется для (E)IDE/ATA2 дисков (посмотрите документацию к вашему диску).

Для включения UltraDMA mode2:
[root@deep]# /sbin/hdparm -d 1 -X66 /dev/hda (или hdb, hdc и т.д.)

Вам нужно будет заранее подготовить ваш чипсет к использованию UltraDMA, также прочитайте man-ы к hdparm. Используйте этот режим очень осторожно!

Для включения multiple sector mode I/O:
[root@deep]# /sbin/hdparm -m XX /dev/hda (или hdb, hdc и т.д.)

Где “XX” максимальные установки поддерживаемые вашим диском. Флаг –i может использоваться для поиска максимальных значений для инсталлированных жестких дисков. Смотрите значение MaxMultSect.
[root@deep]# /sbin/hdparm -i /dev/hda (or hdb, hdc etc)


/dev/hda:


Model=Maxtor 7540 AV, FwRev=GA7X4647, SerialNo=L1007YZS


Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>5Mbs FmtGapReq }


RawCHS=1046/16/63, TrkSize=0, SectSize=0, ECCbytes=11


BuffType=3(DualPortCache), BuffSize=32kB, MaxMultSect=8, MultSect=8


DblWordIO=yes, maxPIO=2(fast), DMA=yes, maxDMA=1(medium)


CurCHS=523/32/63, CurSects=379584528, LBA=yes, LBA=yes, LBAsects=1054368


tDMA={min:150,rec:150}, DMA modes: sword0 sword1 *sword2 *mword0


IORDY=on/off, tPIO={min:240,w/IORDY:180}, PIO modes: mode3

Многосекторный режим (IDE Block Mode) поддерживается большинством современных IDE жестких дисков, передача нескольких секторов за одно I/O прерывание быстрее, чем обычное односекторное. Когда эта возможность включена, обычно, понижаются накладные расходы на операциях ввода/вывода на 30-50%. На многих системах в результате также увеличивается пропускная способность от 5% до 50%.

Вы можете проверить, чего добились, запустив hdparm в режиме проверки производительности:
[root@deep]# /sbin/hdparm -t /dev/hda (или hdb, hdc и т.д.).

Как только вы определили все параметры "hdparm", не забудьте добавить соответствующие команды в файл "/etc/rc.d/rc.local".



Обработка большего числа TCP/IP соединений за определенное время.


Эти настройки уменьшают время TCP/IP подключения, чтобы можно было обработать больше соединений за тотже интервал. Также будет уменьшено время, которое Linux ждет до закрытия соединения и время через которое Linux разрывает устаревшее соединение. Эти настройки отключат некоторые расширения протокола TCP/IP, которые нам не нужны.

Значения параметров TCP/IP стека принятые в Red Hat по умолчанию:
tcp_fin_timeout "180"


tcp_keepalive_time "7200"


tcp_window_scaling "1"


tcp_sack "1"


tcp_timestamps "1"

Чтобы изменить параметры TCP/IP введите следующие команды на вашем терминале:

Под Red Hat 6.1


[root@deep /]# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout


[root@deep /]# echo 1800 >/proc/sys/net/ipv4/tcp_keepalive_time


[root@deep /]# echo 0 > /proc/sys/net/ipv4/tcp_window_scaling


[root@deep /]# echo 0 > /proc/sys/net/ipv4/tcp_sack


[root@deep /]# echo 0 > /proc/sys/net/ipv4/tcp_timestamps

Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера.

Под Red Hat 6.2

Редактируйте файл “/etc/sysctl.conf” и добавьте следующую строку:
# Decrease the time default value for tcp_fin_timeout connection


net.ipv4.tcp_fin_timeout = 30


# Decrease the time default value for tcp_keepalive_time connection


net.ipv4.tcp_keepalive_time = 1800


# Turn off the tcp_window_scaling


net.ipv4.tcp_window_scaling = 0


# Turn off the tcp_sack


net.ipv4.tcp_sack = 0


# Turn off the tcp_timestamps


net.ipv4.tcp_timestamps = 0

Вы должны перезагрузить ваши сетевые устройства, чтобы изменения вступили в силу. [root@deep /]# /etc/rc.d/init.d/network restart Setting network parameters      [ OK ] Bringing up interface lo        [ OK ] Bringing up interface eth0      [ OK ] Bringing up interface eth1      [ OK ]



Параметр “bdflush”.


Файл bdflush вплотную связан с операциями в подсистеме виртуальной памяти ядра Linux и имеет небольшое влияние на использование диска. Этот файл (/proc/sys/vm/bdflush) контролирует операции демона ядра bdflush. Мы используем этот файл для улучшения производительности файловой системы.

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

По умолчанию bdflush в Red Hat Linux использует следующие значения:
"40 500 64 256 500 3000 500 1884 2"

Для изменения значений в bdflush введите следующие команды на вашем терминале:

Под Red Hat 6.1


[root@deep /]# echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush

Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера.

Под Red Hat 6.2

Редактируйте файл “/etc/sysctl.conf” и добавьте следующую строку:
# Improve file system performance


vm.bdflush = 100 1200 128 512 15 5000 500 1884 2

Вы должны перезагрузить ваши сетевые устройства, чтобы изменения вступили в силу. [root@deep /]# /etc/rc.d/init.d/network restart Setting network parameters [ OK ] Bringing up interface lo        [ OK ] Bringing up interface eth0      [ OK ] Bringing up interface eth1      [ OK ]

В вышеприведенном примере согласно файлу “/usr/src/linux/Documentation/sysctl/vm.txt” первый параметр 100% определяет максимальное число грязных буферов в кэше буферов. Грязные означают то, что содержимое буфера все еще должно быть записано на диск. Установка этому параметру высокого значения означает, что Linux в течении долгого времени может задерживать запись на диск, но в то же время это означает, что будет необходимо произвести много операций ввода-вывода одновременно, когда памяти станет мало. Низкое значение будет распределять операции I/O более равномерно.

Второй параметр (1200) (ndirty) определяет максимальное число грязных буферов которые могут быть одновременно записаны. Высокое значение означает отсроченный, пульсирующий I/O, в то время как маленькое значение может приводить к нехватке памяти, когда bdflush не просыпается достаточно часто.

Третье значение (128) (nrefill) определяет число буферов, которые bdflush будет добавлять в список свободных при вызове функции refill_freelist(). Необходимо распределять свободные буфера заранее, так как они имеют часто размер отличный от размера страницы памяти и некоторый учет системных ресурсов нужно делать заранее. Чем выше число, тем больше памяти будет потрачено впустую и тем реже будет необходимо вызывать refill_freelist(). Когда refill_freelist() (512) натолкнется на больше чем nref_dirt грязных буферов то просыпается bdflush().

age_buffer (50*HZ) и age_super parameters (5*HZ) обозначают максимальное время, которое Linux ждет перед записью грязных буферов на диск. Значение выражено в мигах (clockticks), число мигов в секунду = 100. age_buffer это возраст блоков данных, а age_super – возраст метаданных файловой системы. Пятый (15) и последние два (1884 и 2) не используются системой, так что мы оставим значения по умолчанию.

Замечание. Читайте “/usr/src/linux/Documentation/sysctl/vm.txt” о том как улучшить параметры ядра, связанные с виртуальной памятью.



Параметр “buffermem”.


Файл buffermem также тесно связан с работой подсистемы виртуальной памяти Linux ядра. Значения в этом файле “/proc/sys/vm/buffermem” контролируют как много памяти используется под буферную память (в процентах). Следует отметить, что проценты берутся от общей системной памяти.

Значение по умолчанию параметра “buffermem” под Red Hat:
“20 10 60”.

Для изменения параметра “buffermem” введите следующие команды:

Под Red Hat 6.1


[root@deep /]# echo "80 10 60" >/proc/sys/vm/buffermem

Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера.

Под Red Hat 6.2

Редактируйте файл “/etc/sysctl.conf” и добавьте следующую строку:
# Improve virtual memory performance


vm.buffermem = 80 10 60

Вы должны перезагрузить ваши сетевые устройства, чтобы изменения вступили в силу. [root@deep /]# /etc/rc.d/init.d/network restart Setting network parameters      [ OK ] Bringing up interface lo        [ OK ] Bringing up interface eth0      [ OK ] Bringing up interface eth1      [ OK ]

В вышеприведенном примере согласно файлу “/usr/src/linux/Documentation/sysctl/vm.txt” первый параметр (80%) говорит использовать минимум 80% системной памяти под буферный кэш; минимальное число процентов памяти, которое должно быть использовано под буферную память.

Последние два параметра (10 и 60) не используются системой и мы их оставляем без изменений.

Замечание. Читайте “/usr/src/linux/Documentation/sysctl/vm.txt” о том, как улучшить параметры ядра связанные с виртуальной памятью.



Параметр “file-max”.


Значение в file-max определяет максимальное число дескрипторов файлов, которые может распределить ядро. Мы настраиваем этот файл на увеличение числа открытых файлов. Увеличьте значение “/proc/sys/fs/file-max” до значения примерно равного 256 на каждые 4M RAM, например, для машины со 128 M установите значение равное 8192 (128/4=32, 32*256=8192).

По умолчанию в Red Hat file-max равен
"4096"

Чтобы изменить эти значения введите следующие команды на вашем терминале:

Под Red Hat 6.1


[root@deep /]# echo "8192" >/proc/sys/fs/file-max

Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера.

Под Red Hat 6.2

Редактируйте файл “/etc/sysctl.conf” и добавьте следующую строку:
# Improve the number of open files


fs.file-max = 8192

Вы должны перезагрузить ваши сетевые устройства, чтобы изменения вступили в силу. [root@deep /]# /etc/rc.d/init.d/network restart Setting network parameters [ OK ] Bringing up interface lo        [ OK ] Bringing up interface eth0      [ OK ] Bringing up interface eth1      [ OK ]

Замечание. Когда вы начинаете получать много ошибок о выходе за пределы файловых дескрипторов (running out of file handles) – увеличьте значение file- max. Файловому и веб серверам нужно много открытых файлов.



Параметр “inode-max”.


Файл inode-max “/proc/sys/fs/inode-max” определяет максимальное число дескрипторов блоков индексов (inode). Мы настраиваем этот файл на увеличение числа открытых блоков индексов (inode), увеличивая “/proc/sys/fs/inode-max” до значения в 3-4 раза большего (8192*4=32768) числа открытых файлов (file-max). Это обусловлено тем, что на каждый открытый файл приходится как минимум 1 блок индекса, а для больших файлов намного больше.

По умолчанию в Red Hat inode-max равен
"16376"

Чтобы изменить эти значения введите следующие команды на вашем терминале:

Под Red Hat 6.1


[root@deep /]# echo "32768" >/proc/sys/fs/inode-max

Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера.

Под Red Hat 6.2

Редактируйте файл “/etc/sysctl.conf” и добавьте следующую строку:
# Improve the number of inodes opened


fs.inode-max = 32768

Вы должны перезагрузить ваши сетевые устройства, чтобы изменения вступили в силу. [root@deep /]# /etc/rc.d/init.d/network restart Setting network parameters      [ OK ] Bringing up interface lo        [ OK ] Bringing up interface eth0      [ OK ] Bringing up interface eth1      [ OK ]

Замечание. Если вы регулярно получаете сообщение run out of inodes, то вам необходимо увеличить значение inode-max. Помните, что этот параметр зависит от file-max. Файловому и Веб серверам требуется много открытых индексных блоков.



Параметр “ip_local_port_range”.


ip_local_port_range содержит два целых числа, которые определяют интервал портов, которые используют TCP и UDP при выборе локального порта. Первое число – это нижнее возможное значение, а второе – верхнее. В часто используемых системах измените эти значения на 32768-61000.

По умолчанию в Red Hat ip_local_port_range равен
"1024 4999"

Чтобы изменить эти значения введите следующие команды на вашем терминале:

Под Red Hat 6.1


[root@deep /]# echo "32768 61000" > /proc/sys/net/ipv4/ip_local_port_range

Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера.

Под Red Hat 6.2

Редактируйте файл “/etc/sysctl.conf” и добавьте следующую строку:
# Allowed local port range


net.ipv4.ip_local_port_range = 32768 61000

Вы должны перезагрузить ваши сетевые устройства, чтобы изменения вступили в силу. [root@deep /]# /etc/rc.d/init.d/network restart Setting network parameters [ OK ] Bringing up interface lo        [ OK ] Bringing up interface eth0      [ OK ] Bringing up interface eth1      [ OK ]



Параметр “ulimit’.


Linux имеет ограничение "Max Processes" для каждого пользователя. Этот параметр показывает как много процессов может иметь пользователь. Для улучшения производительности, вы можете спокойно увеличить это значение для пользователя root, сделав его неограниченным.

Добавьте следующую строку в /root/.bashrc:
ulimit -u unlimited

Теперь вы должны выйти и вновь войти на сервер. Для проверки, что вы все сделали правильно дайте команду (как root):
ulimit –a

в строке с max user processes должен быть текст “unlimited”.
[root@deep]# ulimit -a


core file size (blocks) 1000000


data seg size (kbytes) unlimited


file size (blocks) unlimited


max memory size (kbytes) unlimited


stack size (kbytes) 8192


cpu time (seconds) unlimited


max user processes unlimited (эта строка)


pipe size (512 bytes) 8


open files 1024


virtual memory (kbytes) 2105343

Замечание. Вы можете дать команду ulimit -u unlimited в командной строке, но я всегда забываю делать это, поэтому вношу ее в файл /root/.bashrc.



Swap раздел.


Поместите ваш swap раздел вблизи начала вашего диска, которое физически располагается на внешней стороне цилиндра. В результате за один оборот головка охватывает большую поверхность. При помощи команды hdparm –t, я вижу, что с разделом помещенным в конце диска скорость работы на 3 MB/s медленнее.



Увеличьте системные ограничения на открытые файлы.


Процесс в Red Hat 6.0 с ядром 2.2.5 может открыть не меньше 31000 файловых дескрипторов и процесс на ядре 2.2.12 – не меньше 90000 файловых дескрипторов (согласно установленным ограничениям). Верхняя граница зависит от доступной памяти. Увеличение этого числа до 90000 для пользователя root делается следующим образом:

Редактируйте файл /root/.bashrc:
ulimit -n 90000

Теперь вы должны выйти и вновь войти на сервер. Для проверки, что вы все сделали правильно дайте команду (как root):
ulimit –a в строке с open files должен быть текст “90000”.
[root@deep]# ulimit -a


core file size (blocks) 1000000


data seg size (kbytes) unlimited


file size (blocks) unlimited


max memory size (kbytes) unlimited


stack size (kbytes) 8192


cpu time (seconds) unlimited


max user processes unlimited


pipe size (512 bytes) 8


open files 90000 (эта строка).


virtual memory (kbytes) 2105343

Замечание. В более старых 2.2 ядрах, тем не менее, число открытых файлов одним процессом все еще ограничено 1024, даже с вышеупомянутыми изменениями.

Атрибут “atime”.

В дополнении к информации о дате создания и последней модификации файла, Linux создает запись о последнем обращении к файлу. Эта информация не очень полезна и при этом происходят затраты системных ресурсов на ее ведение. Файловая система ext2 позволяет суперпользователю маркировать отдельные файлы, чтобы запись о времени последнего доступа к ним не велась. Это может существенно улучшить эффективность системы, особенно, если установить этот атрибут для часто используемых файлов, например, “/var/spool/news”.

Для установки атрибута:
[root@deep]# chattr +A filename

Для всех файлов в каталоге:
[root@deep /root]# chattr -R +A /var/spool/


[root@deep /root]# chattr -R +A /cache/


[root@deep /root]# chattr -R +A /home/httpd/ona/



Безопасность ядра.


Secure Linux kernel patches от Openwall Project прекрасный путь предупредить атаки Stack Buffer Overflows и подобные ей. Этот патч включает набор дополнительных возможностей связанных с обеспечением безопасности ядра Linux, которые настраиваются через новую конфигурационную секцию '”Security options”.

Новые возможности патча linux-2_2_14-ow2_tar.gz:

Неисполняемая область стека пользователя;

Ограничение использования ссылок в /tmp;

Ограничение использования FIFO в /tmp;

Ограничения в /proc;

Специальные дескрипторы для fd 0,1 и 2

Усиление RLIMIT_NPROC на execve(2)

Уничтожение неиспользуемых разделенных сегментов памяти;

Замечание. Когда вы наложите патч linux-2_2_14-ow2 в конце конфигурации ядра будет добавлена секция “Security options”. Для получения большей информации о новых возможностях читайте в файле README, поставляемого вместе с исходными кодами патча.

Применение патча.
[root@deep]# cp linux-2_2_14-ow2_tar.gz /usr/src/


[root@deep]# cd /usr/src/


[root@deep]# tar xzpf linux.2_2_14-ow2_tar.gz


[root@deep]# cd linux-2.2.14-ow2/


[root@deep]# mv linux-2.2.14-ow2.diff /usr/src/


[root@deep]# cd ..


[root@deep]# patch -p0 < linux-2.2.14-ow2.diff


[root@deep]# rm -rf linux-2.2.14-ow2


[root@deep]# rm -f linux-2.2.14-ow2.diff


[root@deep]# rm -f linux-2_2_14-ow2_tar.gz

Первое, мы копируем программный архив в каталог /usr/src, затем мы перемещаемся в этот каталог и раскрываем там архив linux-2_2_14ow2_tar.gz, переходим в раскрытый патч и перемещаем оттуда файл linux-2.2.14-ow2.diff в /usr/src, возвращаемся в /usr/src и патчим ядро файлом linux-2.2.14-ow2.diff. После этого мы удаляем все файлы, связанные с этим патчем. Замечание. Все сообщения обеспечения безопасности связанные с патчем linux- 2.2.14-ow2 должны фиксироваться в файле /var/log/massage. Стадия наложения патча на ваше ядро завершена. Теперь пора вернуться к созданию ядра и перезагрузке.

ЗАМЕЧАНИЕ ОТ ПЕРЕВОДЧИКА. При определение опции "Destroy shared memory segments not in use" в секции "Security options" у меня начала "ругаться" программа, предназначенная для работы с UPS, apcupsd. Пришлось эту опцию отключить.



Деинсталляция и оптимизация.


Шаг 1.

Скопируйте архив ядра в /usr/src и перейдите туда:
[root@deep]# cp linux-version_tar.gz /usr/src/


[root@deep]# cd /usr/src/


Если вы уже инсталлировали ядро из tar архива.

Эти шаги нужно выполнять, если у вас уже были установлены ранее исходные кодя ядра из tar.gz. Если это первое обновление ядра, то надо деинсталлировать два rpm пакета: kernel-headers-version.i386.rpm и kernel-version.i386.rpm.

Удаление символической ссылки.
[root@deep]# rm -rf linux

Удаление текущий каталог с заголовочными файлами ядра
[root@deep]# rm -rf linux-2.2.xx

Удаление каталога с модулями ядра:
[root@deep src]# rm -rf /lib/modules/2.2.xx

Замечание. Удаление старых модулей ядра необходимо, если вы до этого устанавливали модульное ядро. Если в “/lib” вы не находите каталога с модулями, значит ядро у вас было монолитных.
Если у вас были установлены стандартные RPM пакеты с ядром.

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

Для проверки, что они у вас установлены дайте команду.
[root@deep]# rpm -qa | grep kernel


kernel-headers-2.2.12-20.i386.rpm


kernel-2.2.12-20.i386.rpm

Для деинсталляции RPM пакетов:
[root@deep src]# rpm -e --nodeps kernel-headers kernel


cannot remove /usr/src/linux-2.2.xx - directory not empty


cannot remove /lib/modules/2.2.xx - directory not empty


[root@deep src]# rm -rf /usr/src/linux-2.2.xx/


[root@deep src]# rm -rf /lib/modules/2.2.xx/

Мы вручную удалили каталоги “/usr/src/linux-2.2.12” и “/lib/modules/2.2.12”, которые останутся после деинсталляции rpm пакетов.
Шаг 2.


Разворачивание архива с ядром Linux

Сейчас мы будем разворачивать исходные коды нового ядра из tar.gz затем удалим Linux tar-архив.
[root@deep]# tar xzpf linux-version_tar.gz


[root@deep]# rm -f linux-version_tar.gz

Шаг 3.


Увеличение числа задач (оптимизация).

Для увеличения числа разрешенных задач (максимальное число процессов для пользователя) вам нужно редактировать файл "/usr/src/linux/include/linux/tasks.h" и изменить следующий параметр:

Редактируйте tasks.h file (vi +14 /usr/src/linux/include/linux/tasks.h) и измените:
NR_TASKS из 512 в 3072



MIN_TASKS_LEFT_FOR_ROOT из 4 в 24

Замечание. 1. Значение NR_TASKS определяет максимальное число идентификаторов задач (процессов), которое ядро будет назначать каждому пользователю. Увеличение этого числа приведет к увеличению количества соединений от клиента к серверу (например, веб-сервер сможет обслуживать большее количество запросов).
2. Linux защищен от того, чтобы распределить все свободные области памяти процессов обычным пользователям. С помощью опции MIN_TASKS_LEFT_FOR_ROOT резервируются подобные области для root. (24 хорошее значение).
Шаг 4.

Оптимизация ядра.

Для оптимизации ядра Linux под вашу конкретную архитектуру CPU и включения оптимизационных флагов вам надо редактировать файл "/usr/src/linux/Makefile" и изменить следующие параметры:

Редактируйте Makefile (vi +18 /usr/src/linux/Makefile) и измените следующую строку:
HOSTCC =gcc

Должна быть:
HOSTCC =egcs

Редактируйте Makefile (vi +25 /usr/src/linux/Makefile) и измените следующую строку:
CC =$(CROSS_COMPILE)gcc -D__KERNEL__ -I$(HPATH)

Должна быть:
CC =$(CROSS_COMPILE)egcs -D__KERNEL__ -I$(HPATH)

Редактируйте Makefile (vi +90 /usr/src/linux/Makefile) и измените следующую строку:
CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer

Должна быть:
CFLAGS = -Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions

Редактируйте файл Makefile (vi +19 /usr/src/linux/Makefile) и измените следующую строку:
HOSTCFLAGS =-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer

Должна быть:
HOSTCFLAGS =-Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions

Они включают агрессивные оптимизационные трюки, которые могут и не работать со всеми ядрами. Пожалуйста, если оптимизационные флаги приведенные выше не работают у вас, не пытайтесь во чтобы то ни стало заставить их работать. Я не хочу сделать вашу систему нестабильной, подобно Microsoft Windows.


Инсталляция нового ядра.


1. Копируйте “/usr/src/linux/arch/i386/boot/bzImage” из дерева исходных кодов ядра в каталог “/boot” и дайте ему новое имя.
[root@deep linux]# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-kernel.version.number

Замечание. Я рекомендую название подобное vmlinuz-2.2.14, потому что если вы хотите создать новый спасательный или загрузочные диски при помощи mkbootdisk, то она требует некоторой точности, например vmlinuz-2.2.14 вместо vmlinuz-2.2.14.a

2. Копируйте “/usr/src/linux/System.map” из дерева исходных кодов ядра в каталог “/boot” и дайте ему новое имя.
[root@deep linux]# cp /usr/src/linux/System.map /boot/System.map-kernel.version.number

3. Переместитесь в каталог /boot и создайте символические ссылки vmlinuz и System.map.
[root@deep linux]# cd /boot


[root@deep /boot]# ln -fs vmlinuz-kernel.version.number vmlinuz


[root@deep /boot]# ln -fs System.map-kernel.version.number System.map

Мы должны пересоздать ссылки “vmlinuz” и “System.map” на новую версию ядра. Иначе lilo будет использовать старое ядро.

4. Удалите устаревшие и ненужные файлы из каталога “/boot”, чтобы освободить место на диске:
[root@deep /boot]# rm -f module-info


[root@deep /boot]# rm -f initrd-2.2.xx.img

“module-info” это ссылка на каталог с модулями к старому ядру. Так как мы инсталлируем новое ядро, мы не нуждаемся в потерянных ссылках. Файл “initrd-2.2.xx” содержит инициализационный образ RAM диска, который выступает как система пока не будут доступны диски. Этот файл будет существовать и будет инсталлирован в ходе установки сервера, если вы имеете SCSI диск. Все необходимые драйвера сейчас встроены в ваше монолитное ядро, поэтому спокойно удаляйте этот файл.

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

Помните, что мы должны создать три символические ссылки в “/usr/include”, которые являются точками входа в заголовочные файлы ядра Linux. Каталог “/usr/include” содержит все заголовочные файлы вашей системы, которые нужны для компиляции новых программ. Ссылки asm, linux и scsi используются когда программам нужно знать некоторые функции времени компиляции ядра инсталлированного на вашей системе. Программы вызывают другие заголовочные файлы из каталога “include” когда им нужна специальная информация, зависимости и т.д.
[root@deep /]# mkdir -p /usr/src/linux-2.2.14/include



[root@deep /]# cp -r /usr/src/linux/include/asm-generic /usr/src/linux-2.2.14/include

[root@deep /]# cp -r /usr/src/linux/include/asm-i386 /usr/src/linux-2.2.14/include

[root@deep /]# cp -r /usr/src/linux/include/linux /usr/src/linux-2.2.14/include

[root@deep /]# cp -r /usr/src/linux/include/net /usr/src/linux-2.2.14/include

[root@deep /]# cp -r /usr/src/linux/include/video /usr/src/linux-2.2.14/include

[root@deep /]# cp -r /usr/src/linux/include/scsi /usr/src/linux-2.2.14/include

[root@deep /]# rm -rf /usr/src/linux

[root@deep /]# cd /usr/src

[root@deep src]# ln -s /usr/src/linux-2.2.14 linux

Первое, мы создаем новый каталог “linux-2.2.14”, базирующийся на версии ядра, которое мы инсталлируем для более легкой интерпретации, затем мы копируем туда каталоги asm-generic, asm-i386, linux, net, video, и scsi из “/usr/linux/include”. После этого мы удаляем каталог в котором компилировали новое ядро и создаем в “/usr/src” ссылку “linux”, указывающую на “linux-2.2.14”. Последний шаг позволяет сэкономить место на диске. Ядро в разархивированном виде занимает около 75M, а каталоги “include” – 3M.

6. В заключении нам необходимо редактировать файл “/etc/lilo.conf”, чтобы сделать новое ядро, загружаемым по уолчанию.
Шаг 1.

Редактируем файл lilo.conf (vi /etc/lilo.conf) и делаем соответствующие изменения в линии “image=/boot/”:
[root@deep /]# vi /etc/lilo.conf

boot=/dev/sda

map=/boot/map

install=/boot/boot.b

prompt

timeout=00

restricted

password=somepasswd

image=/boot/vmlinuz-kernel.version.number #(добавьте здесь имя вашего нового ядра).

label=linux

root=/dev/sda6

read-only

Замечание. Не забудьте удалить строку “initrd=/boot/initrd-2.2.12-20.img”, так как она нам больше ну нужна.
Шаг 2.

Когда имя нового ядра было внесено в файл “/etc/lilo.conf”, как это было описано выше, мы должны дать следующие команды, чтобы изменения вступили в силу:
[root@deep /]# /sbin/lilo -v

LILO version 21, [Copyright 1992-1998 Werner Almesberger

Reading boot sector from /dev/sda

Merging with /boot/boot.b

Boot image: /boot/vmlinuz-2.2.14

Added linux *

/boot/boot.0800 exits – no backup copy made.

Writing boot sector.

ВАЖНОЕ ЗАМЕЧАНИЕ: Если вы сказали No на вопрос “Unix98 PTY support (CONFIG_UNIX98_PTYS)” во время конфигурирования ядра, то отредактируйте файл “/etc/fstab” и удалите следующую строку: none    /dev/pts        devpts  gid=5,mode=620   0 0


Компиляция.


Очень важно, чтобы ваши “/usr/include/asm”, “/usr/include/linux” и “/usr/include/scsi” представляли из себя символические ссылки к исходным кодам ядра.
Шаг 1.

Каталоги “asm”, “linux” и “scsi” являются символическими ссылками к реальным include директориям необходимым для конкретной архитектуры, например, "/usr/src/linux/include/asm-i386" для “asm”.
[root@deep]# cd /usr/include/


[root@deep]# rm -rf asm linux scsi


[root@deep]# ln -s /usr/src/linux/include/asm-i386 asm


[root@deep]# ln -s /usr/src/linux/include/linux linux


[root@deep]# ln -s /usr/src/linux/include/scsi scsi

Это очень важная часть конфигурирования, мы удаляем каталоги “asm”, “linux”, и “scsi” под “/usr/include”, затем создаем ссылки на каталоги с такими же именами в дереве исходных кодов нового ядра. Каталог “include” содержит важнейшие заголовочные файлы необходимые для вашего ядра и для программ, которые вы будете компилировать.
Шаг 2.

Сделайте так, чтобы у вас не было старых .o файлов и неправильных зависимостей:
[root@deep]# cd /usr/src/linux/


[root@deep]# make mrproper

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

Сейчас мы имеет корректно установленные исходные коды ядра. Существует три пути для конфигурирования ядра.

Команда make config. Она предоставляет вам текстовый интерфейс для ответов на вопросы относительно всех параметров настройки ядра. Вы будете запрошены обо всех нужных вам опциях.

Команда make menuconfig. Она предоставляет все опции настройки в легком в использовании меню.

Команда make xconfig. Она предоставляет полный графический интерфейс ко всем опциям ядра.

Шаг 3.

В этой главе, для конфигурирования ядра мы используем команду make config, потому что у нас на сервере не установлен Xfree86.
[root@deep /]# cd /usr/src/linux/ (если вы еще не в этом каталоге).


[root@deep linux]# make config


rm -f include/asm


( cd include ; ln -sf asm-i386 asm)


/bin/sh scripts/Configure arch/i386/config.in



#

# Using defaults found in arch/i386/defconfig

#

Конфигурация ядра.
Code maturity level options

Prompt for development and/or incomplete code/drivers

(CONFIG_EXPERIMENTAL) [N/y/?]

Processor type and features

Processor family (386, 486/Cx486, 586/K5/5x86/6x86, Pentium/K6/TSC,

PPro/6x86MX) [PPro/6x86MX]

Maximum Physical Memory (1GB, 2GB) [1GB]

Math emulation (CONFIG_MATH_EMULATION) [N/y/?]

MTRR ( Memory Type Range Register) support (CONFIG_MTRR) [N/y/?]

Symmetric multi-processing support (CONFIG_SMP) [Y/n/?] N

Loadable module support

Enable loadable module support (CONFIG_MODULES) [Y/n/?] N

General setup

Networking support (CONFIG_NET) [Y/n/?]

PCI support (CONFIG_PCI) [Y/n/?]

PCI access mode (BIOS, Direct, Any) [Any]

PCI quirks (CONFIG_PCI_QUIRKS) [Y/n/?] N

Backward-compatible /proc/pci (CONFIG_PCI_OLD_PROC) [Y/n/?] N

MCA support (CONFIG_MCA) [N/y/?]

SGI Visual Workstation support (CONFIG_VISWS) [N/y/?]

System V IPC (CONFIG_SYSVIPC) [Y/n/?]

BSD Process Accounting (CONFIG_BSD_PROCESS_ACCT) [N/y/?]

Sysctl support (CONFIG_SYSCTL) [Y/n/?]

Kernel support for a.out binaries (CONFIG_BINFMT_AOUT) [Y/n/?]

Kernel support for ELF binaries (CONFIG_BINFMT_ELF) [Y/n/?]

Kernel support for MISC binaries (CONFIG_BINFMT_MISC) [Y/n/?]

Parallel port support (CONFIG_PARPORT) [N/y/?]

Advanced Power Management BIOS support (CONFIG_APM) [N/y/?]

Plug and Play support

Plug and Play support (CONFIG_PNP) [N/y/?]

Block devices

Normal PC floppy disk support (CONFIG_BLK_DEV_FD) [Y/n/?]

Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support

(CONFIG_BLK_DEV_IDE) [Y/n/?]

Use old disk-only driver on primary interface (CONFIG_BLK_DEV_HD_IDE)

[N/y/?]

Include IDE/ATA-2 DISK support (CONFIG_BLK_DEV_IDEDISK) [Y/n/?]

Include IDE/ATAPI CDROM support (CONFIG_BLK_DEV_IDECD) [Y/n/?]

Include IDE/ATAPI TAPE support (CONFIG_BLK_DEV_IDETAPE) [N/y/?]

Include IDE/ATAPI FLOPPY support (CONFIG_BLK_DEV_IDEFLOPPY) [N/y/?]

SCSI emulation support (CONFIG_BLK_DEV_IDESCSI) [N/y/?]

CMD640 chipset bugfix/support (CONFIG_BLK_DEV_CMD640) [Y/n/?] N




RZ1000 chipset bugfix/support (CONFIG_BLK_DEV_RZ1000) [Y/n/?] N

Generic PCI IDE chipset support (CONFIG_BLK_DEV_IDEPCI) [Y/n/?]

Generic PCI bus-master DMA support (CONFIG_BLK_DEV_IDEDMA) [Y/n/?]

Boot off-board chipsets first support (CONFIG_BLK_DEV_OFFBOARD) [N/y/?]

Use DMA by default when available (CONFIG_IDEDMA_AUTO) [Y/n/?]

Other IDE chipset support (CONFIG_IDE_CHIPSETS) [N/y/?]

Loopback device support (CONFIG_BLK_DEV_LOOP) [N/y/?]

Network block device support (CONFIG_BLK_DEV_NBD) [N/y/?]

Multiple devices driver support (CONFIG_BLK_DEV_MD) [N/y/?]

RAM disk support (CONFIG_BLK_DEV_RAM) [N/y/?]

XT hard disk support (CONFIG_BLK_DEV_XD) [N/y/?]

Mylex DAC960/DAC1100 PCI RAID Controller support

(CONFIG_BLK_DEV_DAC960) [N/y/?] (NEW)

Parallel port IDE device support (CONFIG_PARIDE) [N/y/?]

Compaq SMART2 support (CONFIG_BLK_CPQ_DA) [N/y/?] (NEW)

Networking options

Packet socket (CONFIG_PACKET) [Y/n/?]

Kernel/User netlink socket (CONFIG_NETLINK) [N/y/?]

Network firewalls (CONFIG_FIREWALL) [N/y/?] Y

Socket Filtering (CONFIG_FILTER) [N/y/?]

Unix domain sockets (CONFIG_UNIX) [Y/n/?]

TCP/IP networking (CONFIG_INET) [Y/n/?]

IP: multicasting (CONFIG_IP_MULTICAST) [N/y/?]

IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [N/y/?]

IP: kernel level autoconfiguration (CONFIG_IP_PNP) [N/y/?]

IP: firewalling (CONFIG_IP_FIREWALL) [N/y/?] (NEW) Y

IP: transparent proxy support (CONFIG_IP_TRANSPARENT_PROXY) [N/y/?]

(NEW)

IP: masquerading (CONFIG_IP_MASQUERADE) [N/y/?] (NEW)

IP: optimize as router not host (CONFIG_IP_ROUTER) [N/y/?]

IP: tunneling (CONFIG_NET_IPIP) [N/y/?]

IP: GRE tunnels over IP (CONFIG_NET_IPGRE) [N/y/?]

IP: aliasing support (CONFIG_IP_ALIAS) [N/y/?]

IP: TCP syncookie support (not enabled per default) (CONFIG_SYN_COOKIES)

[N/y/?] Y

IP: Reverse ARP (CONFIG_INET_RARP) [N/y/?]

IP: Allow large windows (not recommended if <16Mb of memory)

(CONFIG_SKB_LARGE) [Y/n/?]

The IPX protocol (CONFIG_IPX) [N/y/?]

Appletalk DDP (CONFIG_ATALK) [N/y/?]




Telephony support

Linux telephony support (CONFIG_PHONE) [N/y/?] (NEW)

SCSI support

SCSI support (CONFIG_SCSI) [Y/n/?]

SCSI disk support (CONFIG_BLK_DEV_SD) [Y/n/?]

SCSI tape support (CONFIG_CHR_DEV_ST) [N/y/?]

SCSI CD-ROM support (CONFIG_BLK_DEV_SR) [N/y/?]

SCSI generic support (CONFIG_CHR_DEV_SG) [N/y/?]

Probe all LUNs on each SCSI device (CONFIG_SCSI_MULTI_LUN) [Y/n/?] N

Verbose SCSI error reporting (kernel size +=12K) (CONFIG_SCSI_CONSTANTS)

[Y/n/?] N

SCSI logging facility (CONFIG_SCSI_LOGGING) [N/y/?]

SCSI low-level drivers

7000FASST SCSI support (CONFIG_SCSI_7000FASST) [N/y/?]

ACARD SCSI support (CONFIG_SCSI_ACARD) [N/y/?]

Adaptec AHA152X/2825 support (CONFIG_SCSI_AHA152X) [N/y/?]

Adaptec AHA1542 support (CONFIG_SCSI_AHA1542) [N/y/?]

Adaptec AHA1740 support (CONFIG_SCSI_AHA1740) [N/y/?]

Adaptec AIC7xxx support (CONFIG_SCSI_AIC7XXX) [N/y/?] Y

Enable Tagged Command Queueing (TCQ) by default [N/y/?] (NEW) Y

Maximum number of TCQ commands per device

(CONFIG_AIC7XXX_CMDS_PER_DEVICE) [8] (NEW)

Collect statistics to report in /proc (CONFIG_AIC7XXX_PROC_STATS) [N/y/?]

(NEW)

Delay in seconds after SCSI bus reset (CONFIG_AIC7XXX_RESET_DELAY) [5]

(NEW)

IBM ServeRAID support (CONFIG_SCSI_IPS) [N/y/?] (NEW)

AdvanSys SCSI support (CONFIG_SCSI_ADVANSYS) [N/y/?]

Always IN2000 SCSI support (CONFIG_SCSI_IN2000) [N/y/?]

AM53/79C974 PCI SCSI support (CONFIG_SCSI_AM53C974) [N/y/?]

AMI MegaRAID support (CONFIG_SCSI_MEGARAID) [N/y/?]

BusLogic SCSI support (CONFIG_SCSI_BUSLOGIC) [N/y/?]

DTC3180/3280 SCSI support (CONFIG_SCSI_DTC3280) [N/y/?]

EATA ISA/EISA/PCI (DPT and generic EATA/DMA) support

(CONFIG_SCSI_EATA) [N/y/?]

EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix)

support

(CONFIG_SCSI_EATA_DMA) [N/y/?]

EATA-PIO (old DPT PM2001, PM2012A) support (CONFIG_SCSI_EATA_PIO)

[N/y/?]

Future Domain 16xx SCSI/AHA-2920A support

(CONFIG_SCSI_FUTURE_DOMAIN) [N/y/?]

GDT SCSI Disk Array Controller support (CONFIG_SCSI_GDTH) [N/y/?]




Generic NCR5380/53c400 SCSI support (CONFIG_SCSI_GENERIC_NCR5380)

[N/y/?]

Initio 9100U(W) support (CONFIG_SCSI_INITIO) [N/y/?]

Initio INI-A100U2W support (CONFIG_SCSI_INIA100) [N/y/?]

NCR53c406a SCSI support (CONFIG_SCSI_NCR53C406A) [N/y/?]

symbios 53c416 SCSI support (CONFIG_SCSI_SYM53C416) [N/y/?]

Simple 53c710 SCSI support (Compaq, NCR machines) (CONFIG_SCSI_SIM710)

[N/y/?] (NEW)

NCR53c7,8xx SCSI support (CONFIG_SCSI_NCR53C7xx) [N/y/?]

NCR53C8XX SCSI support (CONFIG_SCSI_NCR53C8XX) [N/y/?]

SYM53C8XX SCSI support (CONFIG_SCSI_SYM53C8XX) [Y/n/?] N

PAS16 SCSI support (CONFIG_SCSI_PAS16) [N/y/?]

PCI2000 support (CONFIG_SCSI_PCI2000) [N/y/?]

PCI2220i support (CONFIG_SCSI_PCI2220I) [N/y/?]

PSI240i support (CONFIG_SCSI_PSI240I) [N/y/?]

Qlogic FAS SCSI support (CONFIG_SCSI_QLOGIC_FAS) [N/y/?]

Qlogic ISP SCSI support (CONFIG_SCSI_QLOGIC_ISP) [N/y/?]

Qlogic ISP FC SCSI support (CONFIG_SCSI_QLOGIC_FC) [N/y/?]

Seagate ST-02 and Future Domain TMC-8xx SCSI support

(CONFIG_SCSI_SEAGATE) [N/y/?]

Tekram DC390(T) and Am53/79C974 SCSI support (CONFIG_SCSI_DC390T)

[N/y/?]

Trantor T128/T128F/T228 SCSI support (CONFIG_SCSI_T128) [N/y/?]

UltraStor 14F/34F support (CONFIG_SCSI_U14_34F) [N/y/?]

UltraStor SCSI support (CONFIG_SCSI_ULTRASTOR) [N/y/?]

Network device support

Network device support (CONFIG_NETDEVICES) [Y/n/?]

ARCnet devices

ARCnet support (CONFIG_ARCNET) [N/y/?]

Dummy net driver support (CONFIG_DUMMY) [Y/n/?]

EQL (serial line load balancing) support (CONFIG_EQUALIZER) [N/y/?]

General Instruments Surfboard 1000 (CONFIG_NET_SB1000) [N/y/?] (NEW)

Ethernet (10 or 100Mbit)

Ethernet (10 or 100Mbit) (CONFIG_NET_ETHERNET) [Y/n/?]

3COM cards (CONFIG_NET_VENDOR_3COM) [N/y/?]

AMD LANCE and PCnet (AT1500 and NE2100) support (CONFIG_LANCE)

[N/y/?]

Western Digital/SMC cards (CONFIG_NET_VENDOR_SMC) [N/y/?]

Racal-Interlan (Micom) NI cards (CONFIG_NET_VENDOR_RACAL) [N/y/?]

Other ISA cards (CONFIG_NET_ISA) [N/y/?]

EISA, VLB, PCI and on board controllers (CONFIG_NET_EISA) [Y/n/?]




AMD PCnet32 (VLB and PCI) support (CONFIG_PCNET32) [N/y/?]

Apricot Xen-II on board Ethernet (CONFIG_APRICOT) [N/y/?]

CS89x0 support (CONFIG_CS89x0) [N/y/?]

DM9102 PCI Fast Ethernet Adapter support (EXPERIMENTAL)

(CONFIG_DM9102) [N/y/?] (NEW)

Generic DECchip & DIGITAL EtherWORKS PCI/EISA (CONFIG_DE4X5) [N/y/?]

DECchip Tulip (dc21x4x) PCI support (CONFIG_DEC_ELCP) [N/y/?]

Old DECchip Tulip (dc21x4x) PCI support (CONFIG_DEC_ELCP_OLD) [N/y/?]

(NEW)

Digi Intl. RightSwitch SE-X support (CONFIG_DGRS) [N/y/?]

EtherExpressPro/100 support (CONFIG_EEXPRESS_PRO100) [Y/n/?]

PCI NE2000 support (CONFIG_NE2K_PCI) [N/y/?]

TI ThunderLAN support (CONFIG_TLAN) [N/y/?]

VIA Rhine support (CONFIG_VIA_RHINE) [N/y/?]

SiS 900/7016 PCI Fast Ethernet Adapter support (CONFIG_SIS900) [N/y/?] (NEW)

Pocket and portable adaptors (CONFIG_NET_POCKET) [N/y/?]

Ethernet (1000 Mbit)

SysKonnect SK-98xx support (CONFIG_SK98LIN) [N/y/?] (NEW)

FDDI driver support (CONFIG_FDDI) [N/y/?]

PPP (point-to-point) support (CONFIG_PPP) [N/y/?]

SLIP (serial line) support (CONFIG_SLIP) [N/y/?]

Wireless LAN (non-hamradio) (CONFIG_NET_RADIO) [N/y/?]

Token ring devices

Token Ring driver support (CONFIG_TR) [N/y/?]

Fibre Channel driver support (CONFIG_NET_FC) [N/y/?] (NEW)

Wan interfaces

MultiGate (COMX) synchronous serial boards support (CONFIG_COMX) [N/y/?]

(NEW)

Frame relay DLCI support (CONFIG_DLCI) [N/y/?]

WAN drivers (CONFIG_WAN_DRIVERS) [N/y/?]

SBNI12-xx support (CONFIG_SBNI) [N/y/?] (NEW)

Amateur Radio support

Amateur Radio support (CONFIG_HAMRADIO) [N/y/?]

IrDA subsystem support

IrDA subsystem support (CONFIG_IRDA) [N/y/?]

ISDN subsystem

ISDN support (CONFIG_ISDN) [N/y/?]

Old CD-ROM drivers (not SCSI, not IDE)

Support non-SCSI/IDE/ATAPI CDROM drives (CONFIG_CD_NO_IDESCSI)

[N/y/?]

Character devices

Virtual terminal (CONFIG_VT) [Y/n/?]

Support for console on virtual terminal (CONFIG_VT_CONSOLE) [Y/n/?]

Standard/generic (dumb) serial support (CONFIG_SERIAL) [Y/n/?]

Support for console on serial port (CONFIG_SERIAL_CONSOLE) [N/y/?]




Extended dumb serial driver options (CONFIG_SERIAL_EXTENDED) [N/y/?]

Non-standard serial port support (CONFIG_SERIAL_NONSTANDARD) [N/y/?]

Unix98 PTY support (CONFIG_UNIX98_PTYS) [Y/n/?]

Maximum number of Unix98 PTYs in use (0-2048)

(CONFIG_UNIX98_PTY_COUNT) [256] 128

Mouse Support (not serial mice) (CONFIG_MOUSE) [Y/n/?]

Mice

ATIXL busmouse support (CONFIG_ATIXL_BUSMOUSE) [N/y/?]

Logitech busmouse support (CONFIG_BUSMOUSE) [N/y/?]

Microsoft busmouse support (CONFIG_MS_BUSMOUSE) [N/y/?]

PS/2 mouse (aka "auxiliary device") support (CONFIG_PSMOUSE) [Y/n/?]

C&T 82C710 mouse port support (as on TI Travelmate)

(CONFIG_82C710_MOUSE) [Y/n/?] N

PC110 digitizer pad support (CONFIG_PC110_PAD) [N/y/?]

Joystick support

Joystick support (CONFIG_JOYSTICK) [N/y/?]

QIC-02 tape support (CONFIG_QIC02_TAPE) [N/y/?]

Watchdog Timer Support (CONFIG_WATCHDOG) [N/y/?]

/dev/nvram support (CONFIG_NVRAM) [N/y/?]

Enhanced Real Time Clock Support (CONFIG_RTC) [N/y/?]

Video for Linux

Video For Linux (CONFIG_VIDEO_DEV) [N/y/?]

Double Talk PC internal speech card support (CONFIG_DTLK) [N/y/?]

Ftape, the floppy tape device driver

Ftape (QIC-80/Travan) support (CONFIG_FTAPE) [N/y/?]

Filesystems

Quota support (CONFIG_QUOTA) [N/y/?] Y

Kernel automounter support (CONFIG_AUTOFS_FS) [Y/n/?] N

Amiga FFS filesystem support (CONFIG_AFFS_FS) [N/y/?]

Apple Macintosh filesystem support (experimental) (CONFIG_HFS_FS) [N/y/?]

DOS FAT fs support (CONFIG_FAT_FS) [N/y/?]

ISO 9660 CDROM filesystem support (CONFIG_ISO9660_FS) [Y/n/?]

Microsoft Joliet CDROM extensions (CONFIG_JOLIET) [N/y/?]

Minix fs support (CONFIG_MINIX_FS) [N/y/?]

NTFS filesystem support (read only) (CONFIG_NTFS_FS) [N/y/?]

OS/2 HPFS filesystem support (read only) (CONFIG_HPFS_FS) [N/y/?]

/proc filesystem support (CONFIG_PROC_FS) [Y/n/?]

/dev/pts filesystem for Unix98 PTYs (CONFIG_DEVPTS_FS) [Y/n/?]

ROM filesystem support (CONFIG_ROMFS_FS) [N/y/?]

Second extended fs support (CONFIG_EXT2_FS) [Y/n/?]




System V and Coherent filesystem support (CONFIG_SYSV_FS) [N/y/?]

UFS filesystem support (CONFIG_UFS_FS) [N/y/?]

Network File Systems

Coda filesystem support (advanced network fs) (CONFIG_CODA_FS) [N/y/?]

NFS filesystem support (CONFIG_NFS_FS) [Y/n/?] N

SMB filesystem support (to mount WfW shares etc.) (CONFIG_SMB_FS) [N/y/?]

NCP filesystem support (to mount NetWare volumes) (CONFIG_NCP_FS) [N/y/?]

Partition Types

BSD disklabel (BSD partition tables) support (CONFIG_BSD_DISKLABEL) [N/y/?]

Macintosh partition map support (CONFIG_MAC_PARTITION) [N/y/?]

SMD disklabel (Sun partition tables) support (CONFIG_SMD_DISKLABEL) [N/y/?]

Solaris (x86) partition table support (CONFIG_SOLARIS_X86_PARTITION)

[N/y/?]

Console drivers

VGA text console (CONFIG_VGA_CONSOLE) [Y/n/?]

Video mode selection support (CONFIG_VIDEO_SELECT) [N/y/?]

Sound

Sound card support (CONFIG_SOUND) [N/y/?]

(Security options will appear only if you are patched your kernel with the Openwall

Project patch).

Security options

Non-executable user stack area (CONFIG_SECURE_STACK) [Y]

Autodetect and emulate GCC trampolines (CONFIG_SECURE_STACK_SMART)

[Y]

Restricted links in /tmp (CONFIG_SECURE_LINK) [Y]

Restricted FIFOs in /tmp (CONFIG_SECURE_FIFO) [Y]

Restricted /proc (CONFIG_SECURE_PROC) [N] Y

Special handling of fd 0, 1, and 2 (CONFIG_SECURE_FD_0_1_2) [Y]

Enforce RLIMIT_NPROC on execve(2) (CONFIG_SECURE_RLIMIT_NPROC) [Y]

Destroy shared memory segments not in use (CONFIG_SECURE_SHM) [N] Y

Kernel hacking

Magic SysRq key (CONFIG_MAGIC_SYSRQ) [N/y/?]

Сейчас вернитесь в каталог “/usr/src/linux” (если вы там не находитесь). Вам нужно компилировать новое ядро. Для этого используйте следующие команды:
[root@deep]# make dep; make clean; make bzImage

Эта строка содержит три команды. Первая, make dep, берет вашу конфигурацию и создает надлежащее дерево зависимостей. Этот процесс определяет, что надо компилировать, а что нет.

make clean – стирает все следы предыдущих компиляций, чтобы ошибки предыдущей версии не попали в новое ядро.

make bzImage – осуществляет полную компиляцию ядра.

После того как процесс компиляции завершается, ядро сжимается и готово к инсталляции. Перед тем как инсталлировать ядро вы должны скомпилировать необходимые модули. Это необходимо, если вы ответите Yes на вопрос “Enable loadable module support (CONFIG_MODULES)” и отметили некоторые опции в ядре как модули. В этом случае введите следующие команды:
[root@deep linux]# make modules

[root@deep linux]# make modules_install

Замечание. Команды make modules и make modules_install нужны, если вы ответили Yes на вопрос “Enable loadable module support (CONFIG_MODULES)”.


Обновление “/dev” входов


Если вы добавили новое устройство в вашу систему или провели крупное обновление ядра (например, из версии 2.2.9 к 2.2.15), то необходимо обновить ваши входы в “/proc” для предотвращения проблем с потерянными устройствами. Мы можем решить эту задачу при помощи скрипта MAKEDEV. Он сканирует каталог “/proc”, где все устройства связываются с драйверами ядра. Специальная опция “update” позволяет утилите MAKEDEV создать новые
устройства, которые вы сконфигурировали в вашем ядре и удалить ненужные.

Для обновления входов в “/proc” выполните следующие команды:
[root@deep /]# cd /dev [root@deep /dev]# ./MAKEDEV update



Общий обзор.


Ну хорошо, вы видите, что ваш сервер приобрел общую форму. Но подождите, что является основной частью вашего сервера? Да, это ядро. Оно является основой операционной системы. Без него Linux не Linux. Так что мы должны очень внимательно отнестись к ядру и настроить его так, чтобы оно соответствовало нашим потребностям. Первое о чем вы думаете, создавая новое ядро, это его более отличная настроенность под вашу систему. Это сделать очень просто, но в любом случае прочитайте вначале файл README в каталоге “/usr/src/linux”. При конфигурировании ядра вы должны компилировать коды, которые вам нужны. Это даст следующие преимущества: ядро будет быстрее (меньше размер кода, входящего в него), у вас освободиться место в RAM (меньше кода, меньше размер ядра, а части ядра никогда не помещаются в виртуальную память), ядро будет более стабильным (не надо искать не существующих устройств), неиспользуемые части могут использоваться нападающим для получения доступа к вашей или другим системам. Модули работают медленнее, чем тот же код в компилированный в ядро. При конфигурировании и компиляции мы будем создавать монолитное ядро. Такое ядро получатся при ответе на вопросы Yes или No (никогда не создавайте модули) и пропуске следующих шагов: make modules и make modules_install. Также мы будем патчить наше новое ядро кодом защиты от переполнения буфера. Подобный патч для ядра существует и работает он подобно Solar Designer's, отвергая выполнение кода находящегося в стеке, делая осуществление атак типа “переполнение буфера” более сложным, и полностью защищая систему от всех текущих эксплойтов взятых из "script kiddies" всемирной сети.

Помните, что на все вопросы надо отвечать Yes или No, если вы хотите создать монолитное ядро. Ели вы собираетесь использовать маскарадинг или дозвон через ppp соединение, то создать монолитное ядро невозможно, эти функции требуют использования ряда модулей. Поэтому вам придется создавать модульное ядро.

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

1 Pentium II 400 MHz (i686) processor

1 Motherboard SCSI

1 Hard Disk SCSI

1 SCSI Controler Adaptec AIC 7xxx

1 CD-ROM ATAPI IDE

1 Floppy Disk

2 Ethernet Cards Intel EtherExpressPro 10/100

1 Mouse PS/2



Пакеты.


Домашняя страница ядер Linux:
Вы должны скачать: linux-2_2_14_tar.gz
Домашняя страница Secure Linux Kernel Patches: /
Вы должны скачать: linux-2_2_14-ow2_tar.gz
FTP сервер, где лежит Secure Linux Kernel Patches:



Создание аварийного загрузочного флоппи-диска.


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

Для создания аварийной загрузочной дискеты сделайте следующее:
Шаг 1.

Вставьте дискету и форматируйте ее, используя команду:
[root@deep /]# fdformat /dev/fd0H1440


Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.


Formatting ... done


Verifying ... done

Шаг 2.

Копируйте файл vmlinuz из каталога “/boot” на дискету:
[root@deep /]# cp /boot/vmlinuz /dev/fd0


cp: overwrite `/dev/fd0'? y

vmlinuz – это символическая ссылка на реальной ядро.
Шаг 3.

Определяем корневой раздел ядра:
[root@deep /]# rdev


/dev/sda12 /

Корневой раздел ядра – это раздел, где находится корневая файловая система. В этом примере, корневой раздел - “dev/sda12”; на вашей системе это имя может быть другим.
Шаг 4.

Устанавливаем корневой раздел ядра:
[root@deep /]# rdev /dev/fd0 /dev/sda12

В качестве корневого раздела ядра используется значение полученной на предыдущем шаге.
Шаг 5.

Маркируем корневой раздел как только для чтения:
[root@deep /]# rdev -R /dev/fd0 1

При инициализации Linux корневая файловая система монтируется только для чтения. Подобная установка избавит вас от ряда предупреждающих сообщений и сообщений об ошибках.
Шаг 6.

Вставьте загрузочную дискету в дисковод A: и перезагрузите систему:
[root@deep /]# reboot



Создание аварийной загрузочной дискеты.


Первый прединсталляционный шаг – создание “аварийной загрузочной дискеты” (если ее у вас еще нет). Самый простой путь – это воспользоваться командой mkbootdisk.

Первое, надо выяснить какое ядро вы сейчас используете. Для этого просмотрите файл “/etc/lilo.conf” и посмотрите какой образ загружается. У меня этот файл выглядит так: [root@deep]# cat /etc/lilo.conf boot=/dev/sda map=/boot/map install=/boot/boot.b prompt timeout=50 image=/boot/vmlinuz-2.2.12-20 label=linux   root=/dev/sda6   initrd=/boot/initrd-2.2.12-20.img   read-only

Найдите в нем образ ядра, который вы используете. Обычно, он имеет метку linux. В нашем примере это “/boot/vmlinuz-2.2.12-20”. Теперь просто вставьте дискетку 1,44’’ и подключитесь к системе как пользователь root.
[root@deep]# mkbootdisk --device /dev/fd0 2.2.12-20


Insert a disk in /dev/fd0. Any information on the disk will be lost.


Press <Enter> to continue or ^C to abort:

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



Создание новой аварийной дискеты


После перезагрузки сервера, вы должны получить систему с новым ядром. Теоретически, в этот момент, вам надо создать новую “спасательную” дискету с новым ядром. Что бы сделать это сделайте следующее:

Подключитесь к системе, вставьте новую дискету и выполните следующую команду:
[root@deep /]# mkbootdisk --device /dev/fd0 2.2.14


Insert a disk in /dev/fd0. Any information on the disk will be lost.


Press <Enter> to continue or ^C to abort:

Важное замечание. Программа mkbootdisk запускается только для модульных ядер. Так, что вы не можете использовать ее на монолитном ядре, вместо этого создайте аварийную загрузочную дискету так, как это описано ниже.



Удаление программ, файлов и строк связанных с модулями.


Когда вы инсталлируете Linux в первый раз (как это делали мы) у вас устанавливается модульное ядро. Это означает, что каждый элемент или функция, которые нам нужны, существует в виде модуля и контролируется демоном ядра, который называется kmod. Он автоматически загружает модули и функции в память, когда это нужно, и выгружает их, когда необходимости в них отпадает.
Шаг 1.

kmod и другие программы, управляющие модулями, включенные в RPM пакет “modutils” используют файл “conf.modules”, который находится в каталоге “/etc”. В этом файле определяется, например, какие Ethernet карты вы имеете и какие параметры настройки она использует. Так как мы не используем модулей в нашем новом ядре, мы удаляем файл “conf.modules” и полностью деинсталлируем пакет “modutils”.
[root@deep /]# rm -f /etc/conf.modules


[root@deep /]# rpm -e --nodeps modutils

Шаг 2.

Теперь необходимо редактировать файл “rc.sysinit” и закомментировать все строки, в которых упоминается “depmod -a”, вставив в их начало символ “#”. Это нужно потому, что при загрузке система читает скрипт “rc.sysinit” для поиска модульных зависимостей.

Под Red Hat Linux 6.1

Комментируем строку 260 в rc.sysinit file (vi +260 /etc/rc.d/rc.sysinit):
if [ -x /sbin/depmod -a -n "$USEMODULES" ]; then

должна читаться:
#if [ -x /sbin/depmod -a -n "$USEMODULES" ]; then

Комментируем строки с 272 по 277 в rc.sysinit file (vi +272 /etc/rc.d/rc.sysinit):
if [ -L /lib/modules/default ]; then


INITLOG_ARGS= action "Finding module dependencies" depmod -a default


else


INITLOG_ARGS= action "Finding module dependencies" depmod -a


fi


fi

должны читаться:
# if [ -L /lib/modules/default ]; then


# INITLOG_ARGS= action "Finding module dependencies" depmod -a default


# else


# INITLOG_ARGS= action "Finding module dependencies" depmod -a


# fi


#fi

ЗАМЕЧАНИЕ: Процедура описанная выше связана с пакетом initscripts-4_70-1 package дистрибутива Red Hat Linux 6.1.

Под Red Hat Linux 6.2


Комментируем строку 243 в rc.sysinit file (vi +243 /etc/rc.d/rc.sysinit):
if [ -x /sbin/depmod -a -n "$USEMODULES" ]; then

должна читаться:
#if [ -x /sbin/depmod -a -n "$USEMODULES" ]; then

Комментируем строки с 255 по 260 в rc.sysinit file (vi +255 /etc/rc.d/rc.sysinit):
if [ -L /lib/modules/default ]; then

INITLOG_ARGS= action "Finding module dependencies" depmod -a default

else

INITLOG_ARGS= action "Finding module dependencies" depmod -a

fi

fi

должны читаться:
# if [ -L /lib/modules/default ]; then

# INITLOG_ARGS= action "Finding module dependencies" depmod -a default

# else

# INITLOG_ARGS= action "Finding module dependencies" depmod -a

# fi

#fi

Замечание. Еще раз повторим, вся эта часть (“Удаление программ, файлов и строк связанных с модулями.”) требуется только если вы ответили No на вопрос “Enable loadable module support (CONFIG_MODULES)” при конфигурировании ядра.
Шаг 3.

Когда система перезагрузится и вы подключитесь к серверу, проверьте версию используемого ядра:
[root@deep /]# uname -a

Linux deep.openna.com 2.2.14 #1 Mon Jan 10 10:40:35 EDT 2000 i686 unknown

[root@deep]#

Поздравляем.


Все шаги описанные ниже подразумевают


UNIX-совместимые команды
Исходные коды находятся в /usr/src
Тестирование проводилось под Rad Hat 6.1 и 6.2
Все шаги инсталляции выполнялись от пользователя root
Последняя версия ядра 2.2.14
Последняя версия Secure Linux Kernel Patches 2_2_14-ow2



Часть III Рекомендации связанные с сетью


Управление TCP/IP сетями


Сетевой брандмауэр


Сетевой брандмауэр с поддержкой маскарадинга и маршрутизации



Файлы связанные с функционированием сети.


В Linux, TCP/IP сеть настраивается через несколько текстовых файлов, которые вы можете редактировать, чтобы заставить вашу сеть работать. Очень важно знать все конфигурационные файлы, связанные с TCP/IP, так чтобы вы могли редактировать их в случае необходимости. Помните, что ваш сервер не имеет Xwindow интерфейса для настройки этих файлов. Даже если вы используете графический пользовательский интерфейс в своей повседневной работе, важно знать как конфигурировать сеть в текстовом режиме. Следующие секции описывают базовые конфигурационные файлы TCP/IP.
Файл "/etc/HOSTNAME".

В этом файле хранится полное доменное имя вашего компьютера, например, deep.openna.com. Ниже приведен пример содержимого этого файла:
deep.openna.com

Файл "/etc/sysconfig/network-scripts/ifcfg-ethN".

Конфигурационный файл для каждого сетевого устройства, которое существует или вы планируете добавить (в Red Hat 6.1 и 6.2) находится в каталоге "/etc/sysconfig/network- scripts/" и называется ifcfg-eth0 для первого интерфейса, ifcfg-eth1 для второго и т.д. Ниже приведен пример конфигурационного файла "/etc/sysconfig/network-scripts/ifcfg- eth0":
DEVICE=eth0


IPADDR=208.164.186.1


NETMASK=255.255.255.0


NETWORK=208.164.186.0


BROADCAST=208.164.186.255


ONBOOT=yes


BOOTPROTO=none


USERCTL=no

Если вы хотите модифицировать ваши сетевые адреса вручную или добавить новое устройство на новом интерфейсе, редактируйте этот файл (ifcfg-ethN), или создайте новый, и внесите в него соответствующие изменения.

DEVICE=devicename, где devicename имя физического сетевого устройства. IPADDR=ipaddr, где ipaddr IP адрес.
NETMASK=netmask, где netmask сетевая IP маска.
NETWORK=network, где network IP адрес сети.
BROADCAST=broadcast, где broadcast широковещательный IP адрес.
ONBOOT=answer, где answer это yes или no (Будет ли интерфейс активным во время загрузки или нет).
BOOTPROTO=proto, где proto одно из:

none – не использовать протоколов времени загрузки.

bootp – использовать протокол bootp (сейчас pump).


dhcp - использовать dhcp протокол.

USERCTL=answer, где answer одно из:

yes ( Не только пользователь root может контролировать это устройство).

no (Только пользователь root может контролировать это устройство).

Файл "/etc/resolv.conf".

Этот еще одни текстовый файл, используемый определителем (resolver) – библиотекой, которая определяет IP адрес по имени.

Пример этого файла:
search openna.com

nameserver 208.164.186.1

nameserver 208.164.186.2

Замечание. Запросы посылаются на сервера имен в порядке перечисления в файле "/etc/resolv.conf" (primary, secondary и т.д).

Файл "/etc/host.conf".

Этот файл устанавливает как определяются имена. Linux использует библиотеку определителей для получения IP адреса по имени.

Пример этого файла:
# Поиск имени сперва через DNS а затем, в случае ошибки, в файле /etc/hosts.

order bind,hosts

# У нас есть машины с несколькими адресами.

multi on

# Проверять подмену IP адресов (IP spoofing).

nospoof on

Опция order используется для определения порядка использования сервисов. В примере установлено, что вначале библиотека определителя обращается к DNS серверу, а затем к файлу "/etc/hosts".
Опция multi говорит, что компьютеры, описанные в файле /etc/hosts, могут иметь несколько IP адресов (несколько интерфейсов ethN). Например, шлюз всегда имеет несколько адресов и у них эта опция должна быть всегда определена в ON.
Опция nospoof не разрешать подмену адресов. IP-Spoofing – это способ атаки при котором удаленный компьютер представляется кем-то, кем он не является на самом деле.

Файл "/etc/sysconfig/network".

Файл "/etc/sysconfig/network" описывает желательную сетевую конфигурацию сервера.

Пример этого файла:
NETWORKING=yes

FORWARD_IPV4=yes

HOSTNAME=deep. openna.com

GATEWAY=0.0.0.0

GATEWAYDEV=

NETWORKING=answer, где answer это yes или no (Настраивать сеть или нет).
FORWARD_IPV4=answer, где answer это yes или no (Выполнять IP маршрутизацию или нет).
HOSTNAME=hostname, где hostname это имя вашего сервера.
GATEWAY=gwip, где gwip это IP адрес удаленного маршрутизатора (если доступен).
GATEWAYDEV=gwdev, где gwdev имя устройства (eth#) через которое вы имеете доступ к удаленному маршрутизатору.

Замечание. Для совместимости со старым программным файл /etc/HOSTNAME должен содержать тоже имя, что и HOSTNAME= hostname. В новой версии Red Hat Linux 6.2 параметр "FORWARD_IPV4=" определяется в файле "/etc/sysctl.conf" вместо "/etc/sysconfig/network".

Файл "/etc/sysctl.conf".



В Red Hat Linux 6. 2 многие опции ядра связанные с сетевой безопасностью такие как сбрасывать ли пакеты, которые приходят для другого интерфейса, или игнорировать ping/широковещательные запросы и т.д., могут быть определены в новом файле "/etc/sysctl.conf" вместо"/etc/rc.d/rc.local". Одним из самых важных параметров, задаваемых в этом файле это IPv4 forwarding, который сейчас включается программой sysctl. sysctl настройки хранятся в файле "/etc/sysctl.conf", который обрабатывается при каждой загрузке системы перед скриптом "/etc/rc.d/rc.local". Мы уже говорили обо всех сетевых настройках связанных с безопасностью в главе 3 , поэтому сейчас сконцентрируемся только на опции ядра IPv4 forwarding. Для включения маршрутизации в Red Hat 6.2 используйте следующую команду.

Редактируйте файл "/etc/sysctl.conf" и добавьте следующие строки:
# Enable packet forwarding

net.ipv4.ip_forward = 1

Вы должны перезагрузить ваши сетевые настройки, чтобы изменения вступили в силу: [root@deep /]# /etc/rc.d/init.d/network restart Setting network parameters [ OK ] Bringing up interface lo                [ OK ] Bringing up interface eth0              [ OK ] Bringing up interface eth1              [ OK ]

ЗАМЕЧАНИЕ. Включение маршрутизации через файл "sysctl.conf" работает только для Red Hat 6.2. Пользователям Red Hat 6.1 нужно устанавливать этот параметр через "/etc/sysconfig/network", как это было описано выше.

Файл "/etc/hosts".

Когда вы включаете компьютер, необходимо знать карту соответствия IP адресов и имен некоторых машин, пока DNS сервер не отвечает. Эта карта хранится в файле "/etc/hosts". При отсутствии сервера имен все программы будут узнавать у этого файла какой IP адрес отвечает на определенное имя.

Ниже приводится пример файла "/etc/hosts": IP Address              Hostname                        Alias 127.0.0.1               localhost                       deep.openna.com 208.164.186.1           deep.openna.com                 deep 208.164.186.2           mail.openna.com                 mail 208.164.186.3           web.openna.com                  web



В левой колонке записываются IP адреса, в средней соответствующий им имена машин, а в последней псевдонимы этих компьютеров. Например, адресу 208.164.186.1 соответствует машина deep.openna.com, называемая также deep.

После окончания настройки этих файлов не забудьте перезагрузить сетевые настройки вашего сервера, чтобы изменения вступили в силу: [root@deep /]# /etc/rc.d/init.d/network restart Setting network parameters      [ OK ] Bringing up interface lo        [ OK ] Bringing up interface eth0      [ OK ] Bringing up interface eth1      [ OK ]

ВАЖНОЕ ЗАМЕЧАНИЕ. Проблемы таймаута, возникающие при telnet и ftp соединениях, часто связаны с тем, что сервер не может определить IP адрес по DNS имени. Это бывает в двух случаях или не правильно сконфигурирован DNS сервер, или клиентская машина не знает о DNS. Если вы планируете запускать telnet или ftp сервисы на машине, не имеющей DNS сервера, не забудьте добавить имя клиентской машины и ее IP адрес в ваш файл "/etc/hosts", иначе, вы можете ждать несколько минут, пока lookup запрос не завершится по таймауту, до появления запроса "login:"


Инсталляция более одной Ethernet карты на одной машине


Вы можете использовать Linux как шлюз между двумя сетями. Для этого вы должны иметь на сервере две сетевые карты. Ядро Linux не определяет несколько сетевых карт автоматически при загрузке. Если вы хотите иметь больше одной сетевой карты, то надо определить параметры карт в "lilo.conf" для монолитного ядра и в "conf.modules" для модульного ядра. При работе с вашими сетевыми картами вы можете столкнуться со следующими проблемами.
Проблема 1.

Если драйвер(а) карты были созданы как загружаемые модули (модульное ядро), в случае PCI карт, модули определяют карты автоматически. Для ISA карт вам надо определить I/O адрес карты, чтобы модуль знал где ее смотреть. Эта информация хранится в "/etc/conf.modules".

Например, мы рассмотрим две ISA карты 3c509, у первой I/O=0x300, а у второй I/O=320. Для ISA карт редактируем файл conf.modules (vi /etc/conf.modules) и добавляем в него:
alias eth0 3c509


alias eth1 3c509


options 3c509 io=0x300,0x320

Это говорит, что драйвер 3c509 должен быть загружен для eth0 и eth1 и что при этом I/O=0x300 и 0x320 соответственно. Обратите внимание на запись. Прерывания записываются как 0x, а не как в DOS 300h.

Для PCI карт обычно достаточно alias строк, определяющих связь между устройством (ethN) и драйвером (3c509), потому что, обычно, I/O спокойно определяется автоматически.

Для PCI карт, редактируйте файл conf.modules (vi /etc/conf.modules) и добавьте в него:
alias eth0 3c509


alias eth1 3c509

Проблема 2.

Если драйвера вкомпилированы в ядро (монолитное ядро), проверка PCI будет находить все карты автоматически. ISA карты также будут определяться автоматически, но в некоторых случаях нужно сделать следующее. Эта информация сохраняется в файле "/etc/lilo.conf". Метод заключается в передачи аргументов времени загрузки ядру, которое обычно делает LILO.

Для ISA карт, редактируйте файл lilo.conf (vi /etc/lilo.conf) и добавьте в него:
append="ether=0,0,eth1"

Замечание. В первый раз попробуйте загрузиться без аргументов времени загрузки, и только если ничего не получится воспользуйтесь вышеприведенной строкой. В этом случае eth0 и eth1 будут назначаться в порядке котором карты будут определены. Так как мы перекомпилировали ядро, мы должны использовать второй метод (если драйвера встроены в ядро) для инсталляции второй Ethernet карты в нашей системе. Помните, что он нужен только в ряде случаев для ISA карт, PCI карты будут определяться автоматически.



Краткий обзор


Мы пока еще не поиграли с сетевыми возможностями Linux. Linux – это одна из самых лучших операционных систем в мире по поддерживаемым сетевым функциям. Большое количество серверов знают об этом и активно используют его. Понимание вашего сетевого оборудования и всех файлов связанных с сетью очень важно для полного контроля над тем с чем сталкивается сервер. Хорошее знание всех основных сетевых команд жизненно важно. Управление сетью охватывает обширный ряд тем. В общем, они включают сбор статистических данных о состоянии частей вашей сети и принятие мер в случае необходимости при возникновении сбоев или других причин. Наиболее примитивная техника сетевого мониторинга – это периодическое пингование проблемных хостов. Более сложная система контроля за сетью требует наличия возможности сбора состояний и статистической информации о работе различных устройств сети. В этой главе мы будем давать ответы на фундаментальные вопросы относительно сетевых устройств, файлов связанных с функционированием сети и важнейших сетевых команд.



Настройка TCP/IP сети вручную из командной строки.


Утилита ifconfig используется для включения и настройки сетевых карт. Вы должны разобраться в этой команду, если хотите настраивать сеть в ручную. Следует отметить, что когда вы используете ifconfig, вам не нужно перезагружать компьютер, изменения вступят в силу сразу.

Для назначения интерфейсу eth0 IP адреса 208.164.186.2 используйте команду:
[root@deep /]# ifconfig eth0 208.164.186.2 netmask 255.255.255.0

ЗАМЕЧАНИЕ. Обычно, люди настраивают сеть вручную, чтобы проверить как скажутся новые параметры на работе сервера. Если вы хотите сохранить новые настройки, то используйте для этого конфигурационные файлы, связанные с работой сети.

Для отображения всех интерфейсов существующих на сервере введите команду:
[root@deep /]# ifconfig

В ответ вы получите следующую информацию. eth0    Link encap:Ethernet HWaddr 00:E0:18:90:1B:56         inet addr:208.164.186.2 Bcast:208.164.186.255 Mask:255.255.255.0         UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1         RX packets:1295 errors:0 dropped:0 overruns:0 frame:0         TX packets:1163 errors:0 dropped:0 overruns:0 carrier:0         collisions:0 txqueuelen:100         Interrupt:11 Base address:0xa800 lo      Link encap:Local Loopback         inet addr:127.0.0.1 Mask:255.0.0.0         UP LOOPBACK RUNNING MTU:3924 Metric:1         RX packets:139 errors:0 dropped:0 overruns:0 frame:0         TX packets:139 errors:0 dropped:0 overruns:0 carrier:0         collisions:0 txqueuelen:0

ЗАМЕЧАНИЕ. Если вы вызвали ifconfig без параметров, то она выдаст вам информацию обо всех интерфейсах. Опция "-a" покажет также неактивные интерфейсы.
[root@deep /]# ifconfig -a


В ответ вы получите следующую информацию. eth0    Link encap:Ethernet HWaddr 00:E0:18:90:1B:56         inet addr:208.164.186.2 Bcast:208.164.186.255 Mask:255.255.255.0         UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1         RX packets:1295 errors:0 dropped:0 overruns:0 frame:0         TX packets:1163 errors:0 dropped:0 overruns:0 carrier:0         collisions:0 txqueuelen:100         Interrupt:11 Base address:0xa800 eth1    Link encap:Ethernet HWaddr 00:E0:18:90:1B:56         inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0         UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1         RX packets:1295 errors:0 dropped:0 overruns:0 frame:0         TX packets:1163 errors:0 dropped:0 overruns:0 carrier:0         collisions:0 txqueuelen:100         Interrupt:5 Base address:0xa320 lo      Link encap:Local Loopback         inet addr:127.0.0.1 Mask:255.0.0.0         UP LOOPBACK RUNNING MTU:3924 Metric:1         RX packets:139 errors:0 dropped:0 overruns:0 frame:0         TX packets:139 errors:0 dropped:0 overruns:0 carrier:0         collisions:0 txqueuelen:0

Для назначения маршрутизатора по умолчанию используйте команду:
[root@deep /]# route add default gw 208.164.186.1

ЗАМЕЧАНИЕ. В этом примере маршрутизатор по умолчанию имеет адрес 208.164.186.1. Если вы хотите зафиксировать этот адрес, то внесите его в файл /etc/sysconfig/network.

Чтобы проверить, что компьютер присутствует в сети введите следующую команду (проверяется адрес 208.164.186.1).
[root@deep /]# ping 208.164.186.1



В ответ вы получите следующую информацию. [root@deep networking]# ping 208.164.186.1 PING 208.164.186.1 (208.164.186.1) from 208.164.186.2 : 56 data bytes 64 bytes from 208.164.186.2: icmp_seq=0 ttl=128 time=1.0 ms 64 bytes from 208.164.186.2: icmp_seq=1 ttl=128 time=1.0 ms 64 bytes from 208.164.186.2: icmp_seq=2 ttl=128 time=1.0 ms 64 bytes from 208.164.186.2: icmp_seq=3 ttl=128 time=1.0 ms --- 208.164.186.1 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 1.0/1.0/1.0 ms

Вы должны просмотреть таблицу маршрутизации командой route, чтобы убедиться, что оба хоста имеют корректные вхождения в нее.
[root@deep /]# route -n

В ответ вы получите следующую информацию. Kernel IP routing table Destination    Gateway        Genmask          Flags  Metric  Ref  Use  Iface 208.164.186.2  0.0.0.0        255.255.255.255  UH     0       0    0    eth0 208.164.186.0  208.164.186.2  255.255.255.0    UG     0       0    0    eth0 208.164.186.0  0.0.0.0        255.255.255.0    U      0       0    0    eth0 127.0.0.0      0.0.0.0        255.0.0.0        U      0       0    0    lo

Для быстрой проверки статуса интерфейсов используйте команду netstat –i:
[root@deep /]# netstat -i

В ответ вы получите следующую информацию. Kernel Interface table Iface  MTU   Met  RX-OK  RX-ERR RX-DRP  RX-OVR  TX-OK  TX-ERR TX-DRP  TX-OVR Flg eth0   1500  0    4236   0      0       0       3700   0      0       0      BRU lo     3924  0    13300  0      0       0       13300  0      0       0      LRU ppp0   1500  0    14     1      0       0       16     0      0       0      PRU



Другая чрезвычайно полезная опция программы netstat "-t", которая показывает все активные TCP соединения.
[root@deep /]# netstat -t

В ответ вы получите следующую информацию. Active Internet connections (w/o servers) Proto  Recv-Q  Send-Q Local Address            Foreign Address       State Tcp    0       0      deep.openar:netbios-ssn  gate.openna.com:1045  ESTABLISHED Tcp    0       0      localhost:1032           localhost:1033        ESTABLISHED Tcp    0       0      localhost:1033           localhost:1032        ESTABLISHED Tcp    0       0      localhost:1030           localhost:1034        ESTABLISHED Tcp    0       0      localhost:1031           localhost:1030        ESTABLISHED Tcp    0       0      localhost:1028           localhost:1029        ESTABLISHED Tcp    0       0      localhost:1029           localhost:1028        ESTABLISHED Tcp    0       0      localhost:1026           localhost:1027        ESTABLISHED Tcp    0       0      localhost:1027           localhost:1026        ESTABLISHED Tcp    0       0      localhost:1024           localhost:1025        ESTABLISHED Tcp    0       0      localhost:1025           localhost:1024        ESTABLISHED



Для просмотра всех активных и прослушиваемых TCP соединений используйте опции "-vat"
[root@deep /]# netstat -vat

В ответ вы получите следующую информацию. Active Internet connections (servers and established) Proto  Recv-Q  Send-Q Local Address           Foreign Address      State tcp     0        0    deep.openna.co:domain   *:*                  LISTEN tcp     0        0    localhost:domain        *:*                  LISTEN tcp     0        0    deep.openna.com:ssh     gate.openna.com:1682 ESTABLISHED tcp     0        0    *:webcache              *:*                  LISTEN tcp     0        0    deep.openar:netbios-ssn *:*                  LISTEN tcp     0        0    localhost:netbios-ssn   *:*                  LISTEN Tcp     0        0    localhost:1032          localhost:1033       ESTABLISHED Tcp     0        0    localhost:1033          localhost:1032       ESTABLISHED Tcp     0        0    localhost:1030          localhost:1034       ESTABLISHED Tcp     0        0    localhost:1031          localhost:1030       ESTABLISHED Tcp     0        0    localhost:1028          localhost:1029       ESTABLISHED Tcp     0        0    localhost:1029          localhost:1028       ESTABLISHED Tcp     0        0    localhost:1026          localhost:1027       ESTABLISHED Tcp     0        0    localhost:1027          localhost:1026       ESTABLISHED Tcp     0        0    localhost:1024          localhost:1025       ESTABLISHED Tcp     0        0    localhost:1025          localhost:1024       ESTABLISHED tcp     0        0    deep.openna.com:www     *:*                  LISTEN tcp     0        0    deep.openna.com:https   *:*                  LISTEN tcp     0        0    *:389                   *:*                  LISTEN tcp     0        0    *:ssh                   *:*                  LISTEN

Для остановки всех сетевых устройств вручную используйте команду: [root@deep /]# /etc/rc.d/init.d/network stop Shutting down interface eth0                    [ OK ] Disabling IPv4 packet forwarding                [ OK ]

Для запуска всех сетевых устройств вручную используйте команду: [root@deep /]# /etc/rc.d/init.d/network start Enabling IPv4 packet forwarding         [ OK ] Bringing up interface lo                [ OK ] Bringing up interface eth0              [ OK ]


Фильтрация адреса источника.


Все IP пакеты содержат в своих заголовках IP адреса источника и получателя и тип IP протокола помещенного в пакет (TCP, UDP, ICMP). Единственным средством идентификации согласно протоколу IP является адрес источника сообщений. Это приводит к возможности подмены адреса (spoofing), когда злоумышленник заменят адрес источника на несуществующий адрес или на адрес другого сервера.
# Отбрасывание spoof-пакетов, с адресом источника совпадающим с вашим внешним адресом.


ipchains -A input -i $EXTERNAL_INTERFACE -s $IPADDR -l -j DENY

Существует по крайней мере семь адресов на внешнем интерфейсе от которых необходимо отказаться. К ним относятся:

вашего внешнего IP адреса

от приватных IP адресов класса A

от приватных IP адресов класса B

от приватных IP адресов класса C

от широковещательного адреса класса D

от зарезервированных адресов класса E

от loopback интерфейса

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

Замечание. Не забудьте исключить ваш собственный IP адрес из списка исходящих блокируемых пакетов. По умолчанию, я исключаю приватные адреса класса C, так как они наиболее часто используются большинством людей сегодня. Если вы использовали другой класс вместо C, то вы должны раскомментировать соответствующие строки в секции “SPOOFING & BAD ADDRESSES” файла конфигурации файрвола.



Конфигурация “/etc/rc.d/init.d/firewall” скрипта для почтового сервера.


Это конфигурация скрипта для почтового сервера. Он разрешает неограниченный трафик на Loopback интерфейсе, ICMP, DNS сервер и клиент (53), SSH сервер (22), SMTP сервер и клиент (25), IMAP сервер (143) и исходящие TRACEROUTE запросы.

Если вы не хотите использовать какие-нибудь сервисы открытые в этом файле по умолчанию, закомментируйте их, добавив в начало строки символ “#”. Если же вы хотите использовать сервисы, которые я запретил – удалите символ комментария “#”.

Создайте скрипт файл firewall (touch /etc/rc.d/init.d/firewall) на вашем почтовом сервере:

#!/bin/sh # # ---------------------------------------------------------------------------- # Last modified by Gerhard Mourani: 04-25-2000 # ---------------------------------------------------------------------------- # Copyright (C) 1997, 1998, 1999 Robert L. Ziegler # # Permission to use, copy, modify, and distribute this software and its # documentation for educational, research, private and non-profit purposes, # without fee, and without a written agreement is hereby granted. # This software is provided as an example and basis for individual firewall # development. This software is provided without warranty. # # Any material furnished by Robert L. Ziegler is furnished on an # "as is" basis. He makes no warranties of any kind, either expressed # or implied as to any matter including, but not limited to, warranty # of fitness for a particular purpose, exclusivity or results obtained # from use of the material. # ---------------------------------------------------------------------------- # # Invoked from /etc/rc.d/init.d/firewall. # chkconfig: - 60 95 # description: Starts and stops the IPCHAINS Firewall \ # used to provide Firewall network services. # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. if [ ${NETWORKING} = "no" ] then exit 0 fi if [ ! -x /sbin/ipchains ]; then exit 0 fi # See how we were called. case "$1" in start) echo -n "Starting Firewalling Services: " # Некоторые определения для облегчения управления.. # ---------------------------------------------------------------------------- # EDIT THESE TO SUIT YOUR SYSTEM AND ISP. EXTERNAL_INTERFACE="eth0" # Интерфейс подключенный к Интернет LOOPBACK_INTERFACE="lo" # loopback интерфейс IPADDR="my.ip.address" # Ваш IP адрес ANYWHERE="any/0" # любой IP адрес NAMESERVER_1="my.name.server.1" # 1-й DNS сервер NAMESERVER_2="my.name.server.2" # 2-й DNS сервер MY_ISP="my.isp.address.range/24" # диапазон адресов ISP & NOC SMTP_SERVER="my.smtp.server" # Ваш концентратор почты SYSLOG_SERVER="syslog.internal.server" # Ваш внутренний syslog сервер SYSLOG_CLIENT="sys.int.client.range/24" # Диапазон клиентов вашего syslog LOOPBACK="127.0.0.0/8" # Диапазон зарезервированных loopback адресов CLASS_A="10.0.0.0/8" # Приватная сеть класса A CLASS_B="172.16.0.0/12" # Приватная сеть класса B CLASS_C="192.168.0.0/16" # Приватная сеть класса C CLASS_D_MULTICAST="224.0.0.0/4" # Широковещательные адреса класса D CLASS_E_RESERVED_NET="240.0.0.0/5" # Зарезервированные адреса класса E BROADCAST_SRC="0.0.0.0" # Широковещательный адрес BROADCAST_DEST="255.255.255.255" # Широковещательный адрес назначения PRIVPORTS="0:1023" # Диапазон привилегированных портов UNPRIVPORTS="1024:65535" # Диапазон непривилегированных портов # ---------------------------------------------------------------------------- # SSH стартует с 1023 и работает вниз до 513 для # каждого дополнительного одновременного входящего соединения. SSH_PORTS="1022:1023" # диапазон привилегированных портов для SSH # traceroute обычно использует -S 32769:65535 -D 33434:33523 TRACEROUTE_SRC_PORTS="32769:65535" TRACEROUTE_DEST_PORTS="33434:33523" # ---------------------------------------------------------------------------- # Политика по умолчанию DENY # Явно принимать желательные входящие и исходящие соединения # Удалить все существующие правила принадлежащие этому фильтру ipchains -F # Очистка всех правил и пользовательских цепочек ipchains -X # Установка политики по умолчанию deny. # Don't even bother sending an error message back. ipchains -P input DENY ipchains -P output DENY ipchains -P forward DENY # ---------------------------------------------------------------------------- # LOOPBACK # Неограниченный трафик на loopback интерфейсе. ipchains -A input -i $LOOPBACK_INTERFACE -j ACCEPT ipchains -A output -i $LOOPBACK_INTERFACE -j ACCEPT # ---------------------------------------------------------------------------- # Сетевые вампиры # Запрещение доступа jerks # /etc/rc.d/rc.firewall.blocked содержит список # ipchains -A input -i $EXTERNAL_INTERFACE -s address -j DENY # правил для блокирования любого доступа. # Запрещение любых соединений из проблемных сайтов #if [ -f /etc/rc.d/rc.firewall.blocked ]; then # . /etc/rc.d/rc.firewall.blocked #fi # ---------------------------------------------------------------------------- # SPOOFING & BAD ADDRESSES # Отбрасывание spoofed пакетов. # Блокирование пакетов от явно неправильных адресов. # Защита себя от посылки плохих адресов. # Блокирование обманных пакетов посланных как бы от вашего внешнего адреса. ipchains -A input -i $EXTERNAL_INTERFACE -s $IPADDR -j DENY -l # Блокирование пакетов как бы от или к приватной сети класса A ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_A -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -d $CLASS_A -j DENY -l ipchains -A output -i $EXTERNAL_INTERFACE -s $CLASS_A -j REJECT -l ipchains -A output -i $EXTERNAL_INTERFACE -d $CLASS_A -j REJECT -l # Блокирование пакетов как бы от или к приватной сети класса B ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_B -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -d $CLASS_B -j DENY -l ipchains -A output -i $EXTERNAL_INTERFACE -s $CLASS_B -j REJECT -l ipchains -A output -i $EXTERNAL_INTERFACE -d $CLASS_B -j REJECT -l # Блокирование пакетов как бы от или к приватной сети класса C # ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_C -j DENY -l # ipchains -A input -i $EXTERNAL_INTERFACE -d $CLASS_C -j DENY -l # ipchains -A output -i $EXTERNAL_INTERFACE -s $CLASS_C -j REJECT -l # ipchains -A output -i $EXTERNAL_INTERFACE -d $CLASS_C -j REJECT -l # Блокирование пакетов как бы от loopback интерфейса ipchains -A input -i $EXTERNAL_INTERFACE -s $LOOPBACK -j DENY -l ipchains -A output -i $EXTERNAL_INTERFACE -s $LOOPBACK -j REJECT -l # Блокирование пакетов от широковещательных адресов ipchains -A input -i $EXTERNAL_INTERFACE -s $BROADCAST_DEST -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -d $BROADCAST_SRC -j DENY -l # Блокирование широковещательных адресов класса D (NET-3-HOWTO) # Широковещательный (Multicast) адрес – это неправильный адрес источника. # Multicast использует UDP. ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_D_MULTICAST -j DENY -l # Блокирование резервированных IP адресов класса E ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_E_RESERVED_NET -j DENY -l # блокирование адресов определенных IANA как резервных # 0.*.*.*, 1.*.*.*, 2.*.*.*, 5.*.*.*, 7.*.*.*, 23.*.*.*, 27.*.*.* # 31.*.*.*, 37.*.*.*, 39.*.*.*, 41.*.*.*, 42.*.*.*, 58-60.*.*.* # 65-95.*.*.*, 96-126.*.*.*, 197.*.*.*, 201.*.*.* (?), 217-223.*.*.* ipchains -A input -i $EXTERNAL_INTERFACE -s 1.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 2.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 5.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 7.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 23.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 27.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 31.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 37.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 39.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 41.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 42.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 58.0.0.0/7 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 60.0.0.0/8 -j DENY -l #65: 01000001 - /3 includes 64 - need 65-79 spelled out ipchains -A input -i $EXTERNAL_INTERFACE -s 65.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 66.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 67.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 68.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 69.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 70.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 71.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 72.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 73.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 74.0.0.0/8 -j DENY –l ipchains -A input -i $EXTERNAL_INTERFACE -s 75.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 76.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 77.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 78.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 79.0.0.0/8 -j DENY -l #80: 01010000 - /4 masks 80-95 ipchains -A input -i $EXTERNAL_INTERFACE -s 80.0.0.0/4 -j DENY -l # 96: 01100000 - /4 makses 96-111 ipchains -A input -i $EXTERNAL_INTERFACE -s 96.0.0.0/4 -j DENY -l #126: 01111110 - /3 includes 127 - need 112-126 spelled out ipchains -A input -i $EXTERNAL_INTERFACE -s 112.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 113.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 114.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 115.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 116.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 117.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 118.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 119.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 120.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 121.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 122.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 123.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 124.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 125.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 126.0.0.0/8 -j DENY -l #217: 11011001 - /5 includes 216 - need 217-219 spelled out ipchains -A input -i $EXTERNAL_INTERFACE -s 217.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 218.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 219.0.0.0/8 -j DENY -l #223: 11011111 - /6 masks 220-223 ipchains -A input -i $EXTERNAL_INTERFACE -s 220.0.0.0/6 -j DENY -l # ---------------------------------------------------------------------------- # ICMP # Предотвращение denial of service атак базирующихся на ICMP бомбах, фильтрация # входящего Redirect (5) и исходящего Destination Unreachable (3). # Обычно блокировка Destination Unreachable (3) не желательна # так как этот тип пакета используется при обсуждении размера фрагмента пакета. # Для реверсивного (bi-directional) ping. # Типы сообщений: Echo_Reply (0), Echo_Request (8) # Для предотвращения атак, ограничьте адрес источника диапазоном адресов вашего ISP. # # Для исходящих traceroute. # Тип сообщений: INCOMING Dest_Unreachable (3), Time_Exceeded (11) # default UDP base: 33434 to base+nhops-1 # # Для входящих traceroute. # Тип сообщений: OUTGOING Dest_Unreachable (3), Time_Exceeded (11) # Для блокирования этого, запрещение OUTGOING 3 и 11 # 0: echo-reply (pong) # 3: destination-unreachable, port-unreachable, fragmentation-needed, etc. # 4: source-quench # 5: redirect # 8: echo-request (ping) # 11: time-exceeded # 12: parameter-problem ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 0 -d $IPADDR -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 3 -d $IPADDR -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 4 -d $IPADDR -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 11 -d $IPADDR -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 12 -d $IPADDR -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $MY_ISP 8 -d $IPADDR -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \ -s $IPADDR 0 -d $MY_ISP -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \ -s $IPADDR 3 -d $MY_ISP -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \ -s $IPADDR 4 -d $ANYWHERE -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \ -s $IPADDR 8 -d $ANYWHERE -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \ -s $IPADDR 12 -d $ANYWHERE -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \ -s $IPADDR 11 -d $MY_ISP -j ACCEPT # ---------------------------------------------------------------------------- # UDP INCOMING TRACEROUTE # traceroute обычно использует -S 32769:65535 -D 33434:33523 ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -s $MY_ISP $TRACEROUTE_SRC_PORTS \ -d $IPADDR $TRACEROUTE_DEST_PORTS -j ACCEPT -l ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -s $ANYWHERE $TRACEROUTE_SRC_PORTS \ -d $IPADDR $TRACEROUTE_DEST_PORTS -j DENY -l # ---------------------------------------------------------------------------- # DNS сервер # ---------- # DNS: полный сервер # сервер/клиент к серверу запросы или ответы ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -s $ANYWHERE $UNPRIVPORTS \ -d $IPADDR 53 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p udp \ -s $IPADDR 53 \ -d $ANYWHERE $UNPRIVPORTS -j ACCEPT # DNS клиент & пересылка зон (53) # --------------- ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -s $NAMESERVER_1 53 \ -d $IPADDR $UNPRIVPORTS -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p udp \ -s $IPADDR $UNPRIVPORTS \ -d $NAMESERVER_1 53 -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $NAMESERVER_1 53 \ -d $IPADDR $UNPRIVPORTS -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \ -s $IPADDR $UNPRIVPORTS \ -d $NAMESERVER_1 53 -j ACCEPT # ---------------------------------------------------------------------------- # TCP принимается только для выбранных портов # --------------------------------- # ------------------------------------------------------------------ # SSH сервер (22) # --------------- ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -s $ANYWHERE $UNPRIVPORTS \ -d $IPADDR 22 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $IPADDR 22 \ -d $ANYWHERE $UNPRIVPORTS -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -s $ANYWHERE $SSH_PORTS \ -d $IPADDR 22 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $IPADDR 22 \ -d $ANYWHERE $SSH_PORTS -j ACCEPT # ------------------------------------------------------------------ # AUTH сервер (113) # ----------------- # Reject предпочтительней чем deny для входящих сообщений на auth порт. (NET-3-HOWTO) ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -s $ANYWHERE \ -d $IPADDR 113 -j REJECT # ------------------------------------------------------------------ # SYSLOG сервер (514) # ----------------- # Предоставляет полную удаленную регистрацию. Используйте эту возможность если хотите # контролировать все syslog сообщения на одном компьютере. # ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ # -s $SYSLOG_CLIENT \ # -d $IPADDR 514 -j ACCEPT # SYSLOG клиент (514) # ----------------- # ipchains -A output -i $EXTERNAL_INTERFACE -p udp \ # -s $IPADDR 514 \ # -d $SYSLOG_SERVER 514 -j ACCEPT # ------------------------------------------------------------------ # SMTP сервер (25) # ---------------- ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -s $ANYWHERE $UNPRIVPORTS \ -d $IPADDR 25 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $IPADDR 25 \ -d $ANYWHERE $UNPRIVPORTS -j ACCEPT # SMTP клиент (25) # ---------------- ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $ANYWHERE 25 \ -d $IPADDR $UNPRIVPORTS -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \ -s $IPADDR $UNPRIVPORTS \ -d $ANYWHERE 25 -j ACCEPT # ------------------------------------------------------------------ # IMAP сервер (143) # ----------------- ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -s $ANYWHERE $UNPRIVPORTS \ -d $IPADDR 143 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $IPADDR 143 \ -d $ANYWHERE $UNPRIVPORTS -j ACCEPT # POP сервер (110) # ----------------- # ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ # -s $ANYWHERE $UNPRIVPORTS \ # -d $IPADDR 110 -j ACCEPT # ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \ # -s $IPADDR 110 \ # -d $ANYWHERE $UNPRIVPORTS -j ACCEPT # ------------------------------------------------------------------ # Исходящие TRACEROUTE # ------------------- ipchains -A output -i $EXTERNAL_INTERFACE -p udp \ -s $IPADDR $TRACEROUTE_SRC_PORTS \ -d $ANYWHERE $TRACEROUTE_DEST_PORTS -j ACCEPT # ---------------------------------------------------------------------------- # Включение регистрации для избранных заблокированных пакетов ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -d $IPADDR -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -d $IPADDR $PRIVPORTS -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -d $IPADDR $UNPRIVPORTS -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 5 -d $IPADDR -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 13:255 -d $IPADDR -j DENY -l # ---------------------------------------------------------------------------- ;; stop) echo -n "Shutting Firewalling Services: " # Remove all existing rules belonging to this filter ipchains -F # Delete all user-defined chain to this filter ipchains -X # Reset the default policy of the filter to accept. ipchains -P input ACCEPT ipchains -P output ACCEPT ipchains -P forward ACCEPT ;; status) status firewall ;; restart|reload) $0 stop $0 start ;; *) echo "Usage: firewall {start|stop|status|restart|reload}" exit 1 esac exit 0

Сделайте этот скрипт исполняемым и измените права доступа

[root@deep /]# chmod 700 /etc/rc.d/init.d/firewall

[root@deep /]# chown 0.0 /etc/rc.d/init.d/firewall

Создайте символическую rc.d ссылку для вашего Firewall следующей командой:

[root@deep /]# chkconfig --add firewall [root@deep /]# chkconfig --level 345 firewall on

Сейчас ваши правила для firewall готовы к использованию с System V init (System V init запускает все нормальные процессы, которые надо стартовать во время загрузки системы) и будут автоматически стартовать при каждой загрузке сервера.

Ручная остановка firewall:

[root@deep /]# /etc/rc.d/init.d/firewall stop Shutting Firewalling Services: [ OK ]

Запуск firewall вручную:

[root@deep /]# /etc/rc.d/init.d/firewall start Starting Firewalling Services: [ OK ]



Конфигурация скрипта “/etc/rc.d/init.d/firewall” для Веб сервера.


Здесь предсьавлен конфигурационный скрипт для вашего Веб сервера. Эта конфигурация позволяет неограниченный трафик на loopback интерфейсе, ICMP, DNS кэш и клиент сервер (53), SSH сервер (22), HTTP сервер (80), HTTPS сервер (443), SMTP клиент (25), FTP сервер (20, 21) и исходящие TRACEROUTE запросы.

Если вы не хотите использовать какие-нибудь сервисы открытые в этом файле по умолчанию, закомментируйте их, добавив в начало строки символ “#”. Если же вы хотите использовать сервисы, которые я запретил – удалите символ комментария “#”.

#!/bin/sh # # ---------------------------------------------------------------------------- # Last modified by Gerhard Mourani: 04-25-2000 # ---------------------------------------------------------------------------- # Copyright (C) 1997, 1998, 1999 Robert L. Ziegler # # Permission to use, copy, modify, and distribute this software and its # documentation for educational, research, private and non-profit purposes, # without fee, and without a written agreement is hereby granted. # This software is provided as an example and basis for individual firewall # development. This software is provided without warranty. # # Any material furnished by Robert L. Ziegler is furnished on an # "as is" basis. He makes no warranties of any kind, either expressed # or implied as to any matter including, but not limited to, warranty # of fitness for a particular purpose, exclusivity or results obtained # from use of the material. # ---------------------------------------------------------------------------- # # Invoked from /etc/rc.d/init.d/firewall. # chkconfig: - 60 95 # description: Starts and stops the IPCHAINS Firewall \ # used to provide Firewall network services. # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. if [ ${NETWORKING} = "no" ] then exit 0 fi if [ ! -x /sbin/ipchains ]; then exit 0 fi # See how we were called. case "$1" in start) echo -n "Starting Firewalling Services: " # Некоторые определения для облегчения управления. # ---------------------------------------------------------------------------- # Редактируйте это, для соответствия настроек вашей системы ISP. EXTERNAL_INTERFACE="eth0" # Интерфейс подключенный к Интернет LOOPBACK_INTERFACE="lo" # loopback интерфейс IPADDR="my.ip.address" # Ваш IP адрес ANYWHERE="any/0" # любой IP адрес NAMESERVER_1="my.name.server.1" # 1-й DNS сервер NAMESERVER_2="my.name.server.2" # 2-й DNS сервер MY_ISP="my.isp.address.range/24" # диапазон адресов ISP & NOC SMTP_SERVER="my.smtp.server" # Ваш почтовый концентратор SYSLOG_SERVER="syslog.internal.server" # Ваш внутренний syslog сервер SYSLOG_CLIENT="sys.int.client.range/24" # Диапазон клиентов вашего syslog LOOPBACK="127.0.0.0/8" # Диапазон зарезервированных loopback адресов CLASS_A="10.0.0.0/8" # Приватная сеть класса A CLASS_B="172.16.0.0/12" # Приватная сеть класса B CLASS_C="192.168.0.0/16" # Приватная сеть класса C CLASS_D_MULTICAST="224.0.0.0/4" # Широковещательные адреса класса D CLASS_E_RESERVED_NET="240.0.0.0/5" # Зарезервированные адреса класса E BROADCAST_SRC="0.0.0.0" # Широковещательный адрес BROADCAST_DEST="255.255.255.255" # Широковещательный адрес назначения PRIVPORTS="0:1023" # Диапазон привилегированных портов UNPRIVPORTS="1024:65535" # Диапазон непривилегированных портов # ---------------------------------------------------------------------------- # SSH стартует с 1023 и работает вниз до 513 для # каждого дополнительного одновременного входящего соединения. SSH_PORTS="1022:1023" # диапазон привилегированных портов для SSH # traceroute обычно использует -S 32769:65535 -D 33434:33523 TRACEROUTE_SRC_PORTS="32769:65535" TRACEROUTE_DEST_PORTS="33434:33523" # ---------------------------------------------------------------------------- # Политика по умолчанию DENY # Явно принимать желательные входящие и исходящие соединения # Удалить все существующие правила принадлежащие этому фильтру ipchains -F # Очистка всех правил и пользовательских цепочек ipchains -X # Установка политики по умолчанию deny. # Don't even bother sending an error message back. ipchains -P input DENY ipchains -P output DENY ipchains -P forward DENY # ---------------------------------------------------------------------------- # LOOPBACK # Неограниченный трафик на loopback интерфейсе. ipchains -A input -i $LOOPBACK_INTERFACE -j ACCEPT ipchains -A output -i $LOOPBACK_INTERFACE -j ACCEPT # ---------------------------------------------------------------------------- # Сетевые вампиры # Запрещение доступа jerks # /etc/rc.d/rc.firewall.blocked содержит список # ipchains -A input -i $EXTERNAL_INTERFACE -s address -j DENY # правил для блокирования любого доступа. # Запрещение любых соединений из проблемных сайтов #if [ -f /etc/rc.d/rc.firewall.blocked ]; then # . /etc/rc.d/rc.firewall.blocked #fi # ---------------------------------------------------------------------------- # SPOOFING & BAD ADDRESSES # Отбрасывание spoofed пакетов. # Блокирование пакетов от явно неправильных адресов. # Защита себя от посылки плохих адресов. # Блокирование обманных пакетов посланных как бы от вашего внешнего адреса. ipchains -A input -i $EXTERNAL_INTERFACE -s $IPADDR -j DENY -l # Блокирование пакетов как бы от или к приватной сети класса A ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_A -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -d $CLASS_A -j DENY -l ipchains -A output -i $EXTERNAL_INTERFACE -s $CLASS_A -j REJECT -l ipchains -A output -i $EXTERNAL_INTERFACE -d $CLASS_A -j REJECT -l # Блокирование пакетов как бы от или к приватной сети класса B ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_B -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -d $CLASS_B -j DENY -l ipchains -A output -i $EXTERNAL_INTERFACE -s $CLASS_B -j REJECT -l ipchains -A output -i $EXTERNAL_INTERFACE -d $CLASS_B -j REJECT -l # Блокирование пакетов как бы от или к приватной сети класса C # ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_C -j DENY -l # ipchains -A input -i $EXTERNAL_INTERFACE -d $CLASS_C -j DENY -l # ipchains -A output -i $EXTERNAL_INTERFACE -s $CLASS_C -j REJECT -l # ipchains -A output -i $EXTERNAL_INTERFACE -d $CLASS_C -j REJECT -l # Блокирование пакетов как бы от loopback интерфейса ipchains -A input -i $EXTERNAL_INTERFACE -s $LOOPBACK -j DENY -l ipchains -A output -i $EXTERNAL_INTERFACE -s $LOOPBACK -j REJECT -l # Блокирование пакетов от широковещательных адресов ipchains -A input -i $EXTERNAL_INTERFACE -s $BROADCAST_DEST -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -d $BROADCAST_SRC -j DENY -l # Блокирование широковещательных адресов класса D (NET-3-HOWTO) # Широковещательный (Multicast) адрес – это неправильный адрес источника. # Multicast использует UDP. ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_D_MULTICAST -j DENY -l # Блокирование резервированных IP адресов класса E ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_E_RESERVED_NET -j DENY -l # блокирование адресов определенных IANA как резервных # 0.*.*.*, 1.*.*.*, 2.*.*.*, 5.*.*.*, 7.*.*.*, 23.*.*.*, 27.*.*.* # 31.*.*.*, 37.*.*.*, 39.*.*.*, 41.*.*.*, 42.*.*.*, 58-60.*.*.* # 65-95.*.*.*, 96-126.*.*.*, 197.*.*.*, 201.*.*.* (?), 217-223.*.*.* ipchains -A input -i $EXTERNAL_INTERFACE -s 1.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 2.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 5.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 7.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 23.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 27.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 31.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 37.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 39.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 41.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 42.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 58.0.0.0/7 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 60.0.0.0/8 -j DENY -l #65: 01000001 - /3 includes 64 - need 65-79 spelled out ipchains -A input -i $EXTERNAL_INTERFACE -s 65.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 66.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 67.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 68.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 69.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 70.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 71.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 72.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 73.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 74.0.0.0/8 -j DENY –l ipchains -A input -i $EXTERNAL_INTERFACE -s 75.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 76.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 77.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 78.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 79.0.0.0/8 -j DENY -l #80: 01010000 - /4 masks 80-95 ipchains -A input -i $EXTERNAL_INTERFACE -s 80.0.0.0/4 -j DENY -l # 96: 01100000 - /4 masks 96-111 ipchains -A input -i $EXTERNAL_INTERFACE -s 96.0.0.0/4 -j DENY -l #126: 01111110 - /3 includes 127 - need 112-126 spelled out ipchains -A input -i $EXTERNAL_INTERFACE -s 112.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 113.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 114.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 115.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 116.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 117.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 118.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 119.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 120.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 121.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 122.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 123.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 124.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 125.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 126.0.0.0/8 -j DENY -l #217: 11011001 - /5 includes 216 - need 217-219 spelled out ipchains -A input -i $EXTERNAL_INTERFACE -s 217.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 218.0.0.0/8 -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -s 219.0.0.0/8 -j DENY -l #223: 11011111 - /6 masks 220-223 ipchains -A input -i $EXTERNAL_INTERFACE -s 220.0.0.0/6 -j DENY -l # ---------------------------------------------------------------------------- # ICMP # Предотвращение denial of service атак базирующихся на ICMP бомбах, фильтрация # входящего Redirect (5) и исходящего Destination Unreachable (3). # Обычно блокировка Destination Unreachable (3) не желательна # так как этот тип пакета используется при обсуждении размера фрагмента пакета. # Для реверсивного (bi-directional) ping. # Типы сообщений: Echo_Reply (0), Echo_Request (8) # Для предотвращения атак, ограничьте адрес источника диапазоном адресов вашего ISP. # # Для исходящих traceroute. # Тип сообщений: INCOMING Dest_Unreachable (3), Time_Exceeded (11) # default UDP base: 33434 to base+nhops-1 # # Для входящих traceroute. # Тип сообщений: OUTGOING Dest_Unreachable (3), Time_Exceeded (11) # Для блокирования этого, запрещение OUTGOING 3 и 11 # 0: echo-reply (pong) # 3: destination-unreachable, port-unreachable, fragmentation-needed, etc. # 4: source-quench # 5: redirect # 8: echo-request (ping) # 11: time-exceeded # 12: parameter-problem ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 0 -d $IPADDR -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 3 -d $IPADDR -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 4 -d $IPADDR -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 11 -d $IPADDR -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 12 -d $IPADDR -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $MY_ISP 8 -d $IPADDR -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \ -s $IPADDR 0 -d $MY_ISP -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \ -s $IPADDR 3 -d $MY_ISP -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \ -s $IPADDR 4 -d $ANYWHERE -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \ -s $IPADDR 8 -d $ANYWHERE -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \ -s $IPADDR 12 -d $ANYWHERE -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \ -s $IPADDR 11 -d $MY_ISP -j ACCEPT # ---------------------------------------------------------------------------- # UDP INCOMING TRACEROUTE # traceroute обычно использует -S 32769:65535 -D 33434:33523 ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -s $MY_ISP $TRACEROUTE_SRC_PORTS \ -d $IPADDR $TRACEROUTE_DEST_PORTS -j ACCEPT -l ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -s $ANYWHERE $TRACEROUTE_SRC_PORTS \ -d $IPADDR $TRACEROUTE_DEST_PORTS -j DENY -l # ---------------------------------------------------------------------------- # DNS forwarding, caching only nameserver (53) # -------------------------------------------- # от сервера к серверу только запросы и ответы # Кэширующий сервер имен требует только UDP, не TCP ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -s $NAMESERVER_1 53 \ -d $IPADDR 53 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p udp \ -s $IPADDR 53 \ -d $NAMESERVER_1 53 -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -s $NAMESERVER_2 53 \ -d $IPADDR 53 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p udp \ -s $IPADDR 53 \ -d $NAMESERVER_2 53 -j ACCEPT # DNS клиент (53) # --------------- ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -s $NAMESERVER_1 53 \ -d $IPADDR $UNPRIVPORTS -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p udp \ -s $IPADDR $UNPRIVPORTS \ -d $NAMESERVER_1 53 -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -s $NAMESERVER_2 53 \ -d $IPADDR $UNPRIVPORTS -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p udp \ -s $IPADDR $UNPRIVPORTS \ -d $NAMESERVER_2 53 -j ACCEPT # Запросы от клиента к серверу по протоколу TCP разрешены если # не прошли UDP запросы. Это встречается редко. Обычно клиенты # используют TCP для передачи зон вторичному серверу от # первичного и если они хакеры. ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $NAMESERVER_1 53 \ -d $IPADDR $UNPRIVPORTS -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \ -s $IPADDR $UNPRIVPORTS \ -d $NAMESERVER_1 53 -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $NAMESERVER_2 53 \ -d $IPADDR $UNPRIVPORTS -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \ -s $IPADDR $UNPRIVPORTS \ -d $NAMESERVER_2 53 -j ACCEPT # ---------------------------------------------------------------------------- # Принимать TCP только для определенных портов # --------------------------------- # ------------------------------------------------------------------ # SSH сервер (22) # --------------- ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -s $ANYWHERE $UNPRIVPORTS \ -d $IPADDR 22 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $IPADDR 22 \ -d $ANYWHERE $UNPRIVPORTS -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -s $ANYWHERE $SSH_PORTS \ -d $IPADDR 22 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $IPADDR 22 \ -d $ANYWHERE $SSH_PORTS -j ACCEPT # ------------------------------------------------------------------ # HTTP сервер (80) # ---------------- ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -s $ANYWHERE $UNPRIVPORTS \ -d $IPADDR 80 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $IPADDR 80 \ -d $ANYWHERE $UNPRIVPORTS -j ACCEPT # ------------------------------------------------------------------ # HTTPS сервер (443) # ------------------ ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -s $ANYWHERE $UNPRIVPORTS \ -d $IPADDR 443 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $IPADDR 443 \ -d $ANYWHERE $UNPRIVPORTS -j ACCEPT # ------------------------------------------------------------------ # SYSLOG сервер (514) # ----------------- # Предоставляет полную удаленную регистрацию. Используйте эту возможность если хотите # контролировать все syslog сообщения на одном компьютере. # ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ # -s $SYSLOG_CLIENT \ # -d $IPADDR 514 -j ACCEPT # SYSLOG клиент (514) # ----------------- # ipchains -A output -i $EXTERNAL_INTERFACE -p udp \ # -s $IPADDR 514 \ # -d $SYSLOG_SERVER 514 -j ACCEPT # ------------------------------------------------------------------ # AUTH сервер (113) # ----------------- # Reject предпочтительней чем deny для входящих сообщений на auth порт. (NET-3-HOWTO) ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -s $ANYWHERE \ -d $IPADDR 113 -j REJECT # ------------------------------------------------------------------ # SMTP клиент (25) # ---------------- ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $SMTP_SERVER 25 \ -d $IPADDR $UNPRIVPORTS -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \ -s $IPADDR $UNPRIVPORTS \ -d $SMTP_SERVER 25 -j ACCEPT # ------------------------------------------------------------------ # FTP сервер (20, 21) # ------------------- # входящие запросы ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -s $ANYWHERE $UNPRIVPORTS \ -d $IPADDR 21 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $IPADDR 21 \ -d $ANYWHERE $UNPRIVPORTS -j ACCEPT # PORT MODE ответ по каналу данных # ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $ANYWHERE $UNPRIVPORTS \ -d $IPADDR 20 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \ -s $IPADDR 20 \ -d $ANYWHERE $UNPRIVPORTS -j ACCEPT # PASSIVE MODE ответ по каналу данных ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -s $ANYWHERE $UNPRIVPORTS \ -d $IPADDR $UNPRIVPORTS -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \ -s $IPADDR $UNPRIVPORTS \ -d $ANYWHERE $UNPRIVPORTS -j ACCEPT # ------------------------------------------------------------------ # Исходящие TRACEROUTE # ------------------- ipchains -A output -i $EXTERNAL_INTERFACE -p udp \ -s $IPADDR $TRACEROUTE_SRC_PORTS \ -d $ANYWHERE $TRACEROUTE_DEST_PORTS -j ACCEPT # ---------------------------------------------------------------------------- # Включение регистрации для избранных заблокированных пакетов ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \ -d $IPADDR -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -d $IPADDR $PRIVPORTS -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -p udp \ -d $IPADDR $UNPRIVPORTS -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 5 -d $IPADDR -j DENY -l ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \ -s $ANYWHERE 13:255 -d $IPADDR -j DENY -l # ---------------------------------------------------------------------------- ;; stop) echo -n "Shutting Firewalling Services: " # Remove all existing rules belonging to this filter ipchains -F # Delete all user-defined chain to this filter ipchains -X # Reset the default policy of the filter to accept. ipchains -P input ACCEPT ipchains -P output ACCEPT ipchains -P forward ACCEPT ;; status) status firewall ;; restart|reload) $0 stop $0 start ;; *) echo "Usage: firewall {start|stop|status|restart|reload}" exit 1 esac exit 0

Сделайте этот скрипт исполняемым и измените права доступа

[root@deep /]# chmod 700 /etc/rc.d/init.d/firewall

[root@deep /]# chown 0.0 /etc/rc.d/init.d/firewall

Создайте символическую rc.d ссылку для вашего Firewall следующей командой:

[root@deep /]# chkconfig --add firewall

[root@deep /]# chkconfig --level 345 firewall on

Сейчас ваши правила для firewall готовы к использованию с System V init (System V init запускает все нормальные процессы, которые надо стартовать во время загрузки системы) и будут автоматически стартовать при каждой загрузке сервера.

Ручная остановка firewall:

[root@deep /]# /etc/rc.d/init.d/firewall stop Shutting Firewalling Services: [ OK ]

Запуск firewall вручную:

[root@deep /]# /etc/rc.d/init.d/firewall start Starting Firewalling Services: [ OK ]



Linux IPCHAINS


Краткое описание

Кто-нибудь может мне сказать, почему я должен использовать коммерческий брандмауэр, а не простой в использовании Ipchains? Что я теряю используя Ipchains? Ipchains хорош и становится все лучше и лучше, чем коммерческие продукты с точки зрения поддержки и функциональных возможностей. Вы, скорее всего, будете лучше понимать процессы происходящие в вашей сети, если будете использовать Ipchains, а не его коммерческий аналоги.
Что такое политика безопасности сетевого брандмауэра.

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

Все, что специально не разрешено – запрещено.


Этот метод блокирует весь трафик между двумя сетями, за исключением тех сервисов и приложений которым выдано разрешение. Поэтому каждую необходимую службу и приложение нужно разрешать. Никогда нельзя разрешать работу тем службам и приложениям, которые могут быть использованы для атаки на вашу систему. Это наиболее безопасный метод – отвергать все, что явно не разрешено. С другой стороны, со стороны пользователя, этот метод более ограничительный и менее удобный. Именно его мы будем использовать для построения брандмауэра в этой книге.

Все, что не запрещено, то разрешено.


Этот метод позволяет весь трафик между сетями, за исключением определенных сервисов и приложений. Поэтому каждую ненужную службу надо явно запрещать. Это очень удобный и гибкий метод для пользователей, но несущий в себе серьезные потенциальные проблемы в безопасности.
Что такое пакетный фильтр?

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


IP адрес источника

IP адрес получателя

TCP/UDP порт источника

TCP/UDP порт получателя

Тип ICMP сообщения

Информация об инкапсулированном протоколе (TCP, UDP, ICMP или IP tunnel).

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

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

В нашей конфигурации мы дадим вам три различных примера, которые помогут вам настроить ваши правила брандмауэра в зависимости от типа сервера и его размещения в вашей сети. Первый пример будет для Веб сервера, второй для почтового сервера и третий для Шлюза, который действует как сервер- посредник (proxy server) для внутренних Wins машин, рабочих станций и серверов.


www.openna.com
Кэширующий DNS
208.164.186.3

deep.openna.com
Мастер DNS сервер
208.164.186.1

mail.openna.com
Slave DNS сервер
208.164.186.2

Разрешен неограниченный трафик на интерфейсе loopback

Разрешен ICMP трафик

Разрешен DNS сервер и клиент на порту 53

Разрешен SSH сервер на порту 22

Разрешен HTTP сервер на 80 порту

Разрешен HTTPS сервер на порту 443

Разрешен SMTP клиент на порт 25

Разрешен FTP сервер на 20, 21 портах

Разрешены исходящие traceroute запросы

Разрешен неограниченный трафик на интерфейсе loopback

Разрешен ICMP трафик

Разрешен DNS сервер и клиент на порт 53

Разрешен SSH сервер и клиент на порт 22

Разрешен HTTP сервер и клиент на порт 80

Разрешен HTTPS сервер и клиент на порт 443

Разрешен WWW-CACHE клиент на порт 8080

Разрешен внешний POP клиент на порт 110

Разрешен внешний NNTP NEWS клиент на порт 119

Разрешен SMTP сервер и клиент на порт 25

Разрешен IMAP сервер на порт 143

Разрешен IRC клиент на порт 6667

Разрешен ICQ клиент на порт 4000

Разрешен FTP клиент на порты 20, 21

Разрешен RealAudio/QuickTime клиент 

Разрешены исходящие traceroute запросы

Разрешен неограниченный трафик на интерфейсе loopback

Разрешен ICMP трафик

Разрешен DNS сервер и клиент на порт 53

Разрешен SSH сервер на порт 22

Разрешен SMTP сервер и клиент на порт 25

Разрешен IMAP сервер на порт 143

Разрешены исходящие traceroute запросы

Эта таблица показывает, какие порты я должен открыть на различных серверах. В зависимости от того, какой сервис должен быть доступен на сервере, вы должны настроить скрипт брандмауэра на разрешение трафика к определенному порту. www.openna.com – наш Веб сервер, mail.openna.com – это наш почтовый сервер для всех внутренних сетей и deep.openna.com – это шлюз в всех примеров объясненных в этой главе.


Некоторые пояснения к правилам, используемым в скриптах настройки брандмауэра.


Ниже приводятся пояснения к некоторым правилам, которые мы используем в примере firewall. Они приводятся только как рекомендации, потому что скрипты хорошо комментированы и легко модифицируются.

Константы, используемые в примере скрипта firewall-а.

EXTERNAL_INTERFACE


Это имя внешнего сетевого интерфейса, обращенного в Интернет. В нашем примере это eth0.
LOCAL_INTERFACE_1


Это имя интерфейса подключенного к внутренней сети LAN. В нашем примере это eth1.
LOOPBACK_INTERFACE


Это имя loopback интерфейса. В нашем примере это lo.
IPADDR


Это IP адрес вашего внешнего интерфейса. Это или статический адрес зарегистрированный в InterNIC, или динамический адрес присвоенный вашим ISP (обычно, через DHCP).
LOCALNET_1


Это адрес вашей локальной сети (LAN), если любой – полный диапазон IP адресов, используемых машинами в вашей сети. Они могут быть статически присвоенными, или могут назначаться локальным DHCP сервером. В нашем примере, диапазон адресов представляет собой часть сети класса C – 192.168.1.0/24.
ANYWHERE


Это обозначение адреса, который ipchains воспринимает как любая машина (не широковещательный адрес). Обе программы предоставляют метку any/0 для подобного адреса, который равен 0.0.0.0/0.
NAMESERVER_1


Это IP адрес Primary DNS сервера из вашей сети или вашего ISP.
NAMESERVER_2


Это IP адрес Secondary DNS сервера из вашей сети или вашего ISP.
MY_ISP


Это диапазон адресов вашего ISP & NOC. Это значение используется firewall-ом для разрешения запросов ICMP ping и traceroute. Если вы не определите это диапазон, то будет запрещено посылать ping в Интернет из вашей локальной сети.
LOOPBACK


Диапазон адресов loopback равен 127.0.0.0/8. Интерфейс непосредственно адресован как 127.0.0.1 (в файле /etc/hosts).
PRIVPORTS


Привилегированные порты, обычно, с 0 по 1023.
UNPRIVPORTS


Непривилегированные порты, обычно, с 1024 по 65535. Они определяются на динамически на стороне клиента соединения.
Default Policy


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

ЗАМЕЧАНИЕ. Люди, которые динамически получают адреса от ISP могут включить следующие две строки в описания firewall-а. Эти строки определяют IP адрес интерфейса ppp0 и адрес сети удаленного ppp сервера.
IPADDR=`/sbin/ifconfig | grep -A 4 ppp0 | awk '/inet/ { print $2 } ' | sed -e s/addr://`


MY_ISP=`/sbin/ifconfig | grep -A 4 ppp0 | awk '/P-t-P/ { print $3 } ' | sed -e s/P-t-P:// | cut -d '.' -f 1-3`.0/24



Остальная часть правил.


Другие правила используемые в скрипте брандмауэра описывают:

доступ к сервисам из внешнего мира

доступ к сервисам во внешнем миру

Маскарадинг внутренних машин



Разрешение локального трафика.


Так как политика по умолчанию в нашем примере запрещать все, что не разрешено, то некоторые установки должны быть возвращены в исходное состояние. Локальные сетевые сервисы не проходят через внешний интерфейс, они идут через специальный приватный интерфейс, называемый loopback. Ни одна из ваших локальных сетевых программ не будет работать, пока не будет разрешен полный трафик через loopback интерфейс.
# Неограниченный трафик через loopback интерфейс.


ipchains -A input -i $LOOPBACK_INTERFACE -j ACCEPT


ipchains -A output -i $LOOPBACK_INTERFACE -j ACCEPT



Скрипт для настройки брандмауэра.


Утилита ipchains позволяет вам установить брандмауэр, IP маскарадинг и т.д. Ipchains общается с ядром и говорит какие пакеты необходимо отфильтровать. Теоретически, все установки вашего брандмауэра запоминаются в ядре и теряются при перезагрузке сервера. Для борьбы с этим, чтобы сделать правила постоянными, мы рекомендуем использовать инициализационные скрипты System V. Для этого создайте файл, содержащий скрипт файрвола подобный описанному ниже, в каталоге “/etc/rc.d/init.d/” на каждом сервере. Конечно, каждый сервер имеет различные сервисы и будет иметь разные скрипты. По этим причинам, мы предоставляем три различных набора правил, с которыми вы можете поиграть и подогнать под ваши нужды. Также, я подразумеваю, что вы имеете хотя бы минимальные знания о том, как фильтрует firewall, и как работают его правила.



Создание ядра с поддержкой брандмауэра Ipchains.


Первое о чем вы должны подумать, это чтобы ваше ядро было создано с поддержкой сетевого Firewall и Firewalling. Помните, что все сервера должны быть настроены на блокирование неиспользуемых портов, даже если они не выступают в роли брандмауэра. В ядре 2.2.14 вам нужно ответить Yes на следующие вопросы: Networking options:


Network firewalls (CONFIG_FIREFALL) [N] Y


IP:Firewalling (CONFIG_IP_FIREWALL) [N] Y


IP:TCP syncookie support (CONFIG_SYN_COOKIES) [N] Y

ЗАМЕЧАНИЕ. Если при создание ядра вы использовали материалы из главы 3 книги, то все необходимые опции (“Network firewalls, IP:Firewalling, and IP:TCP syncookie support”) были отмечены.