Descobrindo os valores das opções do kernel relacionadas ao sysctl.conf e sysctl.d

20

Na minha máquina Ubuntu, em /etc/sysctl.confarquivo, tenho opções de filtragem de caminho reverso comentadas por padrão, como esta:

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

mas /etc/sysctl.d/10-network-security.confeles (novamente, por padrão) não são comentados:

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

A filtragem de caminho reverso está ativada ou não? Qual dos locais de configuração tem prioridade? Como verifico os valores atuais dessas e de outras opções do kernel?

Desmond Hume
fonte

Respostas:

32

Verificar o valor de uma variável sysctl é tão fácil quanto

sysctl <variable name>

e, a propósito, definir uma variável sysctl é tão simples quanto

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

mas as alterações feitas dessa maneira provavelmente permanecerão apenas até a próxima reinicialização.

Quanto a qual dos locais de configuração, /etc/sysctl.confou /etc/sysctl.d/, tem precedência, eis o que /etc/sysctl.d/READMEdiz o arquivo:

Os usuários finais podem usar 60 - *. Conf e acima, ou usar /etc/sysctl.conf diretamente, que substitui qualquer coisa nesse diretório .

Após editar a configuração em qualquer um dos dois locais, as alterações podem ser aplicadas com

sudo sysctl -p
Desmond Hume
fonte
Isso não é sysctl -epara editar e sysctl -fexecutar a configuração?
Nils
@Nils linux.die.net/man/8/sysctl
Desmond Hume
Certo - estranhamente as duas opções funcionam.
Nils
2

Esse tipo de coisa geralmente está nas interfaces /proce / ou no /syskernel (primeiro, lembre-se de que nada nesses diretórios é um arquivo de disco comum, todos eles são linhas diretas para o kernel).

Então, por exemplo:

»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 eu tenho o rp_filter definido para em1, wlan0 e "default". Você pode defini-las ou desabilitá-las escrevendo no identificador de arquivo:

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

Como mencionado, essa é uma comunicação direta com o kernel, e isso entra em vigor imediatamente. Estes não são arquivos de configuração. Se você tentar fazer algo errado:

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

O que não quer dizer que você não possa estragar tudo dessa maneira, é claro. E não deixe de ler os comentários abaixo.

Cachinhos Dourados
fonte
Eu preferiria ficar com os arquivos de configuração, pois dessa forma posso manter dezenas de linhas da minha configuração preferida em um arquivo de texto sem formatação e reutilizá-las (algumas) quando necessário. Escrever um script para esse fim parece uma complicação desnecessária. Mas obrigado pela informação de um método para verificar os valores atuais.
Desmond Hume
Definitivamente, usar arquivos de configuração é muito melhor. Eu não estava sugerindo que você escrevesse um script, apenas ilustrando que esses não são valores "somente leitura" e podem ser usados ​​para fazer ajustes manuais. ;)
goldilocks
1
Esse script shell é uma forma bastante interessante para re-escrever sysctl -a...
derobert
É verdade, mas (dependendo da natureza do seu navegador de arquivos) a leitura de proc / sys pode ser considerada mais conveniente, e é por isso que vale a pena conhecer. Outra é que WRT para a obtenção de informações por meio de programação, essa interface é mais eficiente do que o "sistema (sysctl)" canalizado tipo de material, e funciona independentemente da linguagem, libs disponíveis, etc.
Goldilocks
1
Você entende mal o que quero dizer com programação , talvez precise esclarecer: não quis dizer scripts de shell. Existe um equivalente C nativo de sysctl(consulte man 2 sysctl), no entanto, ele não é portado para a maioria dos outros idiomas (em alguns casos) e, nesses casos, a melhor opção é ler ou gravar em proc. Pode ser que os bashs echofalhem, como posso dizer que as funções de E / S de fluxo de alto nível disponíveis em C e em outros idiomas podem. O nível baixo de leitura / gravação não será, no entanto. Em qualquer caso, saber sobre a interface proc é importante, e é por isso que eu trouxe para cima ...
Goldilocks
0

Para concluir a resposta aceita , embora seja verdade que as /etc/sysctl.confconfigurações têm precedência sobre as apresentadas /etc/sysctl.d/, o exemplo exposto na pergunta original mostra duas variáveis ​​comentadas em /etc/sysctl.conf:

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

e as mesmas variáveis ​​não comentadas em /etc/sysctl.d/10-network-security.conf:

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

Isso pode ser enganador porque um comentário não é uma configuração, mas apenas uma observação do que poderia ser uma configuração.

Nessa situação, as variáveis ​​são realmente definidas como 1, apesar do fato de que no arquivo de configuração mais forte elas são comentadas.

Se /etc/sysctl.conftivéssemos:

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

as variáveis ​​acabariam sendo definidas como 0.

Bozzy
fonte