Ativando o encaminhamento de IP no tempo de compilação do kernel

1

Estou compilando um kernel para um roteador. Eu conheço uma maneira de ativar o encaminhamento de IP em um sistema Linux existente. Em tempo de compilação, CONFIG_IP_FORWARD é dito para fazer a mesma tarefa.

Estou configurando a versão 3.12.14 do kernel vanilla usando a ferramenta de configuração do kernel baseada em GTK ( gconfig ). No entanto, não consigo ver essa opção em nenhum lugar. Existe uma opção de configuração alternativa nos kernels recentes ou estou faltando alguma coisa?

    
por JuliandotNut 09.04.2014 / 22:18

3 respostas

4

A fonte do kernel do Linux não tem a opção CONFIG_IP_FORWARDING desde que o série de kernel 2.0.x . Até onde sei, não há mais nenhuma opção de tempo de compilação para habilitar o encaminhamento de IP por padrão para o kernel construído.

Desde a série 2.1.x, a maneira correta de habilitar o encaminhamento de IP para IPv4 tem sido com o net.ipv4.ip_forward opção sysctl .

Adicione a seguinte linha a sysctl.conf (ou um arquivo em /etc/sysctl.d ):

net.ipv4.ip_forward = 1

Então, tenha sysctl recarregando a configuração:

sysctl -p /etc/sysctl.conf

Dito isso, se por algum motivo você precisar configurar o kernel para que a configuração da opção sysctl (ou o /proc equivalente) no momento da inicialização não seja necessária, você poderá alterar o valor padrão da opção sysctl diretamente na árvore de fontes do kernel *.

A entrada da tabela sysctl para /proc/sys/net/ipv4/ip_forward é inicializada a partir de uma estrutura estática definida em net/ipv4/devinet.c :

static struct ctl_table ctl_forward_entry[] = {
        {
                .procname       = "ip_forward",
                .data           = &ipv4_devconf.data[
                                        IPV4_DEVCONF_FORWARDING - 1],
                .maxlen         = sizeof(int),
                .mode           = 0644,
                .proc_handler   = devinet_sysctl_forward,
                .extra1         = &ipv4_devconf,
                .extra2         = &init_net,
        },
        { },
};

O campo data é inicializado para apontar para uma entrada na matriz inteira data , que é um campo na estrutura ipv4_devconf estática. A entrada é identificada pelo valor IPV4_DEVCONF_FORWARDING enumerated definido em include/uapi/linux/ip.h . A matriz data contida na estrutura é apenas parcialmente inicializada, omitindo a entrada IPV4_DEVCONF_FORWARDING . Como a estrutura tem armazenamento estático, todos os integrantes do tipo integral são inicializados para zero. Assim, para definir o campo de dados para a entrada da tabela ip_forward sysctl ipv4_devconf.data[IPV4_DEVCONF_FORWARD - 1] e o campo correspondente na ipv4_devconf_dflt structure para 1 . Isso pode ser conseguido com o seguinte patch:

diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index bdbf68b..91fe073 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -69,6 +69,7 @@

 static struct ipv4_devconf ipv4_devconf = {
        .data = {
+               [IPV4_DEVCONF_FORWARDING - 1] = 1,
                [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1,
                [IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1,
                [IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1,
@@ -80,6 +81,7 @@ static struct ipv4_devconf ipv4_devconf = {

 static struct ipv4_devconf ipv4_devconf_dflt = {
        .data = {
+               [IPV4_DEVCONF_FORWARDING - 1] = 1,
                [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1,
                [IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1,
                [IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1,

* Isenção de responsabilidade: Não sou especialista em internals em rede Linux, portanto é totalmente possível que o método descrito aqui perca algumas inicializações normalmente executadas pelo devinet_sysctl_forward() quando o encaminhamento está normalmente ativado via sysctl , então prossiga com cuidado. O patch acima parece funcionar na versão 3.14 do kernel, na medida em que /proc/sys/net/ipv4/ip_forward indica que o encaminhamento está habilitado por padrão, sem configuração via sysctl . Tanto quanto eu vejo, 3.12.14 não parece diferir no que diz respeito à inicialização da entrada sysctl . Eu incluí o patch na esperança de que seja útil, mas SEM QUALQUER GARANTIA.

    
por 10.04.2014 / 11:14
0

Eu não sei de nenhuma solução para habilitá-lo estaticamente (e em pelo menos kernels recentes não há CONFIG_IP_FORWARD - apenas grep ed a fonte).

De uma perspectiva de segurança, isso não parece ser uma boa ideia, já que em muitos casos você pode configurar algumas outras coisas antes de ativar o encaminhamento (regras de filtragem, regras de QoS, regras de roteamento [mais exatas], por exemplo) .

    
por 09.04.2014 / 22:48
-1

O encaminhamento de IP é uma das principais funcionalidades do código de rede no Linux. É por isso que não há uma variável de configuração para isso.

    
por 10.04.2014 / 00:16