在内核编译时启用IP转发

在内核编译时启用IP转发

我正在为路由器编译内核。我知道一种在现有 Linux 系统中启用 IP 转发的方法。据说在编译时CONFIG_IP_FORWARD会执行相同的任务。

我正在使用基于 GTK 的内核配置工具 ( ) 配置 3.12.14 版本的 vanilla 内核gconfig。但是,我在任何地方都看不到这个选项。最近的内核中是否有替代配置选项,或者我是否遗漏了某些内容?

答案1

自 Linux 内核源代码发布以来就没有这个CONFIG_IP_FORWARDING选项了2.0.x内核系列。据我所知,不再有编译时选项来默认为构建的内核启用 IP 转发。

自 2.1.x 系列以来,启用 IPv4 IP 转发的正确方法是使用net.ipv4.ip_forward sysctl选项。

将以下行添加到sysctl.conf(或 中的文件/etc/sysctl.d):

net.ipv4.ip_forward = 1

然后,重新sysctl加载配置:

sysctl -p /etc/sysctl.conf

也就是说,如果由于某种原因您需要配置内核,以便/proc不需要在启动时设置 sysctl 选项(或等效选项),您可以sysctl直接在内核源代码树*中更改该选项的默认值。

系统控制表条目/proc/sys/net/ipv4/ip_forward是从定义在的静态结构初始化的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,
        },
        { },
};

data字段被初始化为指向整数数组中的一个条目data,它是静态ipv4_devconf结构中的一个字段。该条目由IPV4_DEVCONF_FORWARDING中定义的枚举值标识include/uapi/linux/ip.h。该结构中包含的数组data仅部分初始化,省略了IPV4_DEVCONF_FORWARDING条目。由于该结构具有静态存储,因此所有整型类型成员都初始化为零。因此,要设置数据字段ip_forward 系统控制表项,以及记录的默认值,我们需要初始化并初始化结构体ipv4_devconf.data[IPV4_DEVCONF_FORWARD - 1]中的相应字段。这可以通过以下补丁来实现:ipv4_devconf_dflt1

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,

*免责声明:我不是 Linux 网络内部的专家,因此这里描述的方法完全有可能错过通常通过devinet_sysctl_forward()启用转发时执行的一些初始化sysctl,因此请小心操作。上述补丁似乎适用于内核版本 3.14,实际上/proc/sys/net/ipv4/ip_forward表明默认情况下启用转发,无需通过sysctl.据我所知,3.12.14 在以下方面似乎没有什么不同:系统控制条目初始化。我包含该补丁是希望它有用,但不提供任何保证。

答案2

我不知道有任何静态启用它的解决方案(至少在最近的内核中没有CONFIG_IP_FORWARD- 只是grep编辑了源代码)。

从安全角度来看,这似乎不是一个好主意,因为在许多情况下,您可能会在启用转发之前配置一些其他内容(例如,过滤规则、QoS 规则、[更准确的]路由规则)。

答案3

IP转发是Linux网络代码的核心功能。这就是为什么它没有配置变量的原因。

相关内容