Вопрос или проблема
Я пытаюсь настроить ядро моего сервера Linux так, чтобы он не выполнял роль маршрутизатора для большей безопасности. Суть в том, чтобы не пересылать пакеты.
Я нашел это:
echo 0 > /proc/sys/net/ipv4/ip_forward
и это:
sysctl -w net.ipv4.ip_forward=0
Очевидно, что оба делают одно и то же, но я не уверен, в чем на самом деле разница между ними. Я также хотел бы сделать эффект постоянным, если это возможно.
Разницы нет. Команда sysctl
в Linux записывает напрямую в файлы в /proc/sys
. Этот фрагмент исходного кода для sysctl
это подтверждает:
/*
* Запись настройки sysctl
*/
static int WriteSetting(const char *setting)
{
/* ... */
/* используется для открытия файла */
tmpname = xmalloc(equals - name + 1 + strlen(PROC_PATH));
strcpy(tmpname, PROC_PATH);
strncat(tmpname, name, (int) (equals - name));
tmpname[equals - name + strlen(PROC_PATH)] = 0;
/* заменяем . на / */
slashdot(tmpname + strlen(PROC_PATH), '.', "https://superuser.com/");
/* ... */
fp = fopen(tmpname, "w");
/* проверка на ошибки ... */
rc = fprintf(fp, "%s\n", value);
/* ... */
}
Если вы хотите что-то постоянное, вам нужно отредактировать /etc/sysctl.conf
или добавить файл в /etc/sysctl.d
(например, /etc/sysctl.d/99-disable-ip-forwarding.conf
), содержащий:
# Отключить пересылку IP-пакетов
net.ipv4.ip_forward = 0
Кстати, некоторые дистрибутивы уже отключают это явно по умолчанию. Например, RHEL <= 6 или Fedora <= 15 имеют это в /etc/sysctl.conf
:
# Управляет пересылкой IP-пакетов
net.ipv4.ip_forward = 0
Fedora 20 больше не отключает это явно. Нет настройки пересылки в /etc/sysctl.conf
, /etc/sysctl.d/
или /usr/lib/sysctl.d/
.
Ответ или решение
Директория /proc
в Linux представляет собой виртуальную файловую систему, которая предоставляет интерфейс к состоянию ядра и его параметрам. Файл /proc/sys/net/ipv4/ip_forward
— это специфичный файл, управляющий параметром, отвечающим за маршрутизацию IP-пакетов. Настройки можно изменить различными способами, включая перезапись этого файла непосредственно или использование команды sysctl
.
Сравнение методов
-
Запись напрямую в
/proc
:echo 0 > /proc/sys/net/ipv4/ip_forward
Этот метод меняет значение непосредственно в системном файле. Он мгновенно применяет изменения, но они будут потеряны при перезагрузке системы.
-
Использование
sysctl
:sysctl -w net.ipv4.ip_forward=0
Команда
sysctl
также изменяет значение, но она делает это через интерфейс, предоставляемый для управления параметрами ядра. С точки зрения функциональности разницы нет;sysctl
фактически выполняет запись в файл/proc/sys/net/ipv4/ip_forward
за кулисами. Однако использованиеsysctl
предпочтительнее, поскольку:- Оно более читаемо и интуитивно понятно.
- Предоставляет дополнительные возможности для управления и получения информации о текущих параметрах ядра.
Постоянное изменение
Если вы хотите сделать изменения постоянными, чтобы они сохранялись после перезагрузки, вам необходимо внести изменения в конфигурационные файлы. Рекомендуется редактировать файл /etc/sysctl.conf
или добавить новый файл в каталоге /etc/sysctl.d/
. Например, создайте файл /etc/sysctl.d/99-disable-ip-forwarding.conf
и добавьте следующее содержимое:
# Отключить маршрутизацию IP-пакетов
net.ipv4.ip_forward = 0
После изменения конфигурационных файлов, чтобы применить новые настройки без перезагрузки системы, выполните команду:
sysctl -p /etc/sysctl.conf
Или:
sysctl --system
Дополнительные замечания
Некоторые дистрибутивы Linux по умолчанию отключают маршрутизацию. Например, в RHEL ≤ 6 и Fedora ≤ 15 значение net.ipv4.ip_forward
уже установлено на 0 в файле /etc/sysctl.conf
. Начиная с Fedora 20, данная конфигурация больше неявно указана.
Таким образом, использование sysctl
для изменения конфигурации является более предпочтительным подходом с учетом читаемости и консистентности, а также для достижения постоянных изменений через корректное редактирование системных конфигурационных файлов.