Averiguando los valores de las opciones del kernel relacionadas con sysctl.conf y sysctl.d

20

En mi máquina Ubuntu, en el /etc/sysctl.confarchivo, tengo las opciones de filtrado de ruta inversa comentadas por defecto de esta manera:

#net.ipv4.conf.default.rp_filter=1
#net.ipv4.conf.all.rp_filter=1

pero en /etc/sysctl.d/10-network-security.confellos están (nuevamente, por defecto) no comentados:

net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1

Entonces, ¿está habilitado o no el filtrado de ruta inversa? ¿Cuál de las ubicaciones de configuración tiene prioridad? ¿Cómo verifico los valores actuales de estas y otras opciones del núcleo?

Desmond Hume
fuente

Respuestas:

32

Verificar el valor de una variable sysctl es tan fácil como

sysctl <variable name>

y, por cierto, establecer una variable sysctl es tan sencillo como

sudo sysctl -w <variable name>=<value>

pero los cambios realizados de esta manera probablemente solo se mantendrán hasta el próximo reinicio.

En cuanto a cuál de las ubicaciones de configuración, /etc/sysctl.confo /etc/sysctl.d/, tiene prioridad, aquí está lo /etc/sysctl.d/READMEque dice el archivo:

Los usuarios finales pueden usar 60 - *. Conf y superior, o usar /etc/sysctl.conf directamente, que anula cualquier cosa en este directorio .

Después de editar la configuración en cualquiera de las dos ubicaciones, los cambios se pueden aplicar con

sudo sysctl -p
Desmond Hume
fuente
¿No es esto sysctl -epara editar y sysctl -fpara ejecutar la configuración?
Nils
@Nils linux.die.net/man/8/sysctl
Desmond Hume
Correcto: extrañamente, ambas opciones funcionan.
Nils
2

Este tipo de cosas generalmente se encuentra en las interfaces del kernel /procy / o /sys(primero, tenga en cuenta que nada en esos directorios es un archivo de disco normal, todos son líneas directas al kernel).

Entonces, por ejemplo:

»for x in /proc/sys/net/ipv4/conf/*/rp_filter; do echo -ne "$x "`cat $x`"\n"; done
/proc/sys/net/ipv4/conf/all/rp_filter 0
/proc/sys/net/ipv4/conf/default/rp_filter 1
/proc/sys/net/ipv4/conf/em1/rp_filter 1
/proc/sys/net/ipv4/conf/lo/rp_filter 0
/proc/sys/net/ipv4/conf/wlan0/rp_filter 1

Parece que tengo rp_filter configurado para em1, wlan0 y "default". Puede configurarlos o desactivarlos simplemente escribiendo en el identificador de archivo:

»cd /proc/sys/net/ipv4/conf/lo
»echo 1 > rp_filter
»cat rp_filter
1
»echo 0 > rp_filter
»cat rp_filter
0

Como se mencionó, esta es una comunicación directa con el núcleo, por lo que surte efecto de inmediato. Estos no son archivos de configuración. Si intentas hacer algo mal:

»echo whatever > rp_filter
bash: echo: write error: Invalid argument

Lo que no quiere decir que no pueda arruinar las cosas de esta manera, por supuesto. Y asegúrese de leer los comentarios a continuación.

encerrada dorada
fuente
Prefiero apegarme a los archivos de configuración porque de esta manera puedo mantener docenas de líneas de mi configuración preferida en un archivo de texto sin formato y reutilizarlas (algunas) cuando sea necesario. Escribir un guión para este propósito se siente como una complicación innecesaria. Pero gracias por la información sobre un método para verificar los valores actuales.
Desmond Hume
Definitivamente, usar archivos de configuración es mucho mejor. No estaba sugiriendo que escribiera un script, solo ilustraba que esos no son valores de "solo lectura" y pueden usarse para hacer ajustes manuales. ;)
Ricitos de Oro
1
Ese script de shell es una forma bastante interesante de reescribir sysctl -a...
derobert
Es cierto, pero (dependiendo de la naturaleza de su explorador de archivos) la lectura de proc / sys podría considerarse más conveniente, por lo que vale la pena saberlo. Otra es que WRT a la obtención de información mediante programación, la interfaz es más eficiente que el "sistema (sysctl)" entubada tipo cosas, y funciona independientemente del idioma, librerías disponibles, etc.
GOLDILOCKS
1
No entiendes lo que quiero decir programáticamente , tal vez necesito aclararlo: no quise decir scripts de shell. Hay un equivalente C nativo de sysctl(ver man 2 sysctl), sin embargo, esto no se transfiere a la mayoría de los otros lenguajes (lo es en algunos), y en estos casos la mejor opción es leer o escribir en proc. Bien puede ser que bash echopueda fallar, ya que puedo decir que las funciones de E / S de flujo de alto nivel disponibles en C y otros lenguajes pueden hacerlo. Sin embargo, el nivel bajo de lectura / escritura no lo hará. En cualquier caso, conocer la interfaz de proceso es importante, por eso lo
mencioné
0

Para completar la respuesta aceptada , si bien es cierto que la /etc/sysctl.confconfiguración tiene prioridad sobre las que se encuentran /etc/sysctl.d/, el ejemplo expuesto en la pregunta original muestra dos variables comentadas en /etc/sysctl.conf:

#net.ipv4.conf.default.rp_filter=1
#net.ipv4.conf.all.rp_filter=1

y las mismas variables no comentadas en /etc/sysctl.d/10-network-security.conf:

net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1

Esto puede ser engañoso porque un comentario no es una configuración, sino solo un comentario de lo que podría ser una configuración.

En esta situación, las variables en realidad están establecidas en 1, a pesar de que en el archivo de configuración más fuerte están comentadas.

Si en /etc/sysctl.conftuvimos:

net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0

entonces las variables eventualmente se establecerían en 0.

Bozzy
fuente