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.