2004 г.
Oskar Andreasson, перевод
Андрея Киселева
Глава 2. Как произвести запись в переменные
Информация в переменные ipsysctl может заноситься двумя способами, которые обусловливают два совершенно различных метода. Первый из них -- с помощью команды sysctl, которая имеется в большинстве современных дистрибутивов. Второй способ -- посредством файловой системы /proc, которая должна иметься в любом дистрибутиве Linux, в котором ядро собрано с поддержкой этой файловой системы.
Управляться с командой sysctl немного сложнее, чем с файловой системой /proc. Как уже упоминалось ранее, при работе с командой sysctl вам нужно немножко больше, чем просто ядро. Однако sysctl предлагает лучший вариант внесения большого количества изменений. В этом случае все необходимые настройки могут быть записаны в конфигурационный файл и затем внесены в систему единственным вызовом команды sysctl. Другими словами, sysctl предлагает более гибкий способ настройки системы.
Файловая система /proc предоставляет более простой способ изменения настроек. Поэкспериментировав с настройками и выяснив их необходимый объем, мы можем записать эти настройки в файл sysctl.conf и затем воспроизводить их командой sysctl в момент загрузки системы. Конечно, можно написать сценарий на языке командной оболочки, который будет выполнять необходимые настройки через интерфейс файловой системы /proc, но такой сценарий уступает в читабельности конфигурационному файлу, передаваемому sysctl. Поэтому, если вы планируете выполнять достаточно большой объем настроек ipsysctl, то лучше будет обратиться к помощи команды sysctl.
Программа sysctl может использоваться для изменения единичной переменной или большого набора переменных (с помощью конфигурационного файла) из командной строки. Но прежде всего, с помощью этой команды можно получить список всех возможных переменных:
sysctl -a
Эта команда выведет список всех переменных, в котором имена переменных отделены символом "=" от их значений. Для вывода списка переменных можно использовать ключи -a и -A. Ключ -a приводит к выводу списка переменных, отделенных от их значений символом "=", а ключ -A -- выводит список в табличной форме (как описывается в man sysctl), но на сегодняшний день эта особенность (имеется ввиду -- вывод в табличной форме) еще не реализована, надеюсь в будущем этот недостаток будет исправлен.
Как вы можете заметить, значительная часть переменных не имеет отношения к ipsysctl. Также, наверняка от вас не ускользнула и нотация переменных (стиль записи). В ipsysctl разделитель"/" заменен на символ "." (точка). Однако sysctl корректно воспримет и разделитель "/", так что с этой стороны проблем возникать не должно. Если вам нужно просмотреть отдельную переменную, то указать это можно следующим образом:
sysctl net.ipv4.tcp_sack
Для записи значения в переменную следует воспользоваться ключом -w, за которым следуют имя переменной и новое значение, отделенной от имени знаком "=", т.е. примерно так:
sysctl -w net.ipv4.tcp_sack=0
Эта команда запишет в переменную tcp_sack value значение 0 и выведет ее на экран в качестве подтверждения. Вобщем ничего особенного. Для того, чтобы внести изменения, находящиеся в конфигурационном файле (который мы обсуждали выше), следует воспользоваться ключом -p, примерно так:
sysctl -p
Эта команда внесет все изменения, которые содержатся в файле /etc/sysctl.conf. Если возникнет потребность в использовании другого имени файла, то нужно указать этот файл в командной строке:
sysctl -p /etc/testsysctl.conf
Этой командой все необходимые настройки будут взяты не из файла по-умолчанию /etc/sysctl.conf, а из указанного в командной строке -- /etc/testsysctl.conf. Формат конфигурационного файла sysctl.conf очень прост. Прежде всего -- строки, начинающиеся символом ";" или "#", являются комментариями. Все командные строки начинаются с пути к переменной, включая имя самой переменной, далее следуют символ "=" и значение, которое должно быть записано в переменную. Путь к переменной указывается относительно /proc/sys. Ниже приводится пример файла sysctl.conf:
# Это комментарий
net.ipv4.ip_forward = 0
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 0
В этом файле в переменную net.ipv4.ip_forward записывается 0, т.е. отключается форвардинг (передача транзитных пакетов) между сетевыми интерфейсами. Если вам необходимо разделять единственное подключение к Internet между несколькими компьютерами, то в эту переменную нужно записать 1. Затем в переменную net.ipv4.conf.all.rp_filter записывается 1, включая тем самым, политику фильтрации маршрутов. Эта переменная сообщает ядру о необходимости фильтрации пакетов по их исходящему адресу.
И наконец, посредством записи значения 0 в переменную kernel.sysrq (которая собственно не имеет никакого отношения к сетевой подсистеме), отключается комбинация клавиш sysrq, которая используется при крахе системы. Эта строка добавлена лишь с цель продемонстрировать, что можно изменять и другие переменные, не являющиеся частью ipsysctl.
Интерфейс файловой системы /proc предоставляет простой доступ к переменным ipsysctl, однако, он более подходит для экспериментов с настройками, либо когда команда sysctl отсутствует в системе. Очень удобно пользоваться файловой системой /proc в отдельных случаях, когда переменная не должна включаться до определенного момента во время загрузки. Например, было бы просто замечательно, если бы переменная ip_forward включалась уже после того, как будет запущен брандмауэр.
Все что вам необходимо, чтобы пользоваться таким методом чтения-записи переменных -- это команды cat и echo. Очень трудно поверить в то, что у вас нет какой либо из них. Практически невозможно установить систему так, чтобы в ней не было этих команд.
Прежде всего, вам нужно запомнить, что все переменные, которые могут быть использованы или изменены, находятся в каталоге /proc/sys/. Все переменные, которые описываются в данном руководстве, находятся в каталоге /proc/sys/net/ipv4. В общем, для начала вам следует набирать команду
cd /proc/sys/net/ipv4
Чтобы просмотреть список доступных переменных, следует выполнить команду
ls
Проще говоря -- вы все это уже должны знать! Если это не так, то вы взялись читать не то руководство! Чтобы посмотреть значение конкретной переменной, выполните команду cat ip_forward. На мониторе это будет выглядеть примерно так:
[blueflux@work1 ipv4]$ cat ip_forward
0
[blueflux@work1 ipv4]$
Как вы можете убедиться, значения переменных могут быть прочитаны любым, кто имеет доступ к системе. Это может показаться вам проблемой с точки зрения безопасности, поскольку любой, имеющий доступ к системе сможет выяснить все настройки системы.
| К сожалению невозможно ограничить права доступа к файловой системе /proc. Дело в том, что все права на доступ жестко "зашиты" в нее, а потому "вручную" они не изменяются. Если вы очень, ОЧЕНЬ захотите изменить права доступа, то вы сможете сделать это внеся изменения в исходный текст программ, которые находятся в каталоге linux/fs/proc. |
Для записи значения в переменную воспользуйтесь командой echo. Обычно, команда echo используется для вывода на экран, но мы можем перенаправить вывод и в файл. Для случая bash это может выглядеть примерно так:
[root@work1 ipv4]# echo "1" > ip_forward
[root@work1 ipv4]#
Как вы уже наверняка заметили, на сей раз мы находимся в каталоге, где лежит файл (переменная) ip_forward, поэтому не был указан полный путь к переменной. Операции записи доступны только если у вас есть права суперпользователя root. Под простым пользователем попытка записи в переменную будет выглядеть примерно так:
[blueflux@work1 ipv4]$ echo "1" > ip_forward
bash: ip_forward: Permission denied
[blueflux@work1 ipv4]$
Обратите внимание на то, что все команды из примеров запускаются в соответствующем каталоге. По этой причине не указывается полный путь к переменным.