我正在为路由器编译内核。我知道一种在现有 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_dflt
1
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网络代码的核心功能。这就是为什么它没有配置变量的原因。