直接写入 /proc 与使用 sysctl -w

Joh*_* M. 9 networking linux security kernel

我正在尝试配置我的 Linux 服务器的内核,以便它不会充当路由器,以提高安全性。重点不是转发数据包。

我发现了这个:

echo 0 > /proc/sys/net/ipv4/ip_forward  
Run Code Online (Sandbox Code Playgroud)

和这个:

sysctl -w net.ipv4.ip_forward=0  
Run Code Online (Sandbox Code Playgroud)

显然两者都做同样的事情,但我不确定它们之间的真正区别是什么。如果可能的话,我还想使效果永久化。

Cri*_*itu 6

没有区别。sysctlLinux 上的命令直接写入/proc/sys. 源代码中的这个片段sysctl证明了这一点:

/*
 * Write a sysctl setting
 */
static int WriteSetting(const char *setting)
{
    /* ... */

    /* used to open the file */
    tmpname = xmalloc(equals - name + 1 + strlen(PROC_PATH));
    strcpy(tmpname, PROC_PATH);
    strncat(tmpname, name, (int) (equals - name));
    tmpname[equals - name + strlen(PROC_PATH)] = 0;
    /* change . to / */
    slashdot(tmpname + strlen(PROC_PATH), '.', '/');

    /* ... */

    fp = fopen(tmpname, "w");
    /* some error checking ... */
    rc = fprintf(fp, "%s\n", value);

    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

如果您想要永久的东西,您需要/etc/sysctl.conf/etc/sysctl.d(例如/etc/sysctl.d/99-disable-ip-forwarding.conf)下编辑或添加一个文件,其中包含:

# Disable IP packet forwarding
net.ipv4.ip_forward = 0
Run Code Online (Sandbox Code Playgroud)

顺便说一下,一些发行版默认已经明确禁用了它。例如 RHEL <= 6 或 Fedora <= 15 有这个/etc/sysctl.conf

# Controls IP packet forwarding
net.ipv4.ip_forward = 0
Run Code Online (Sandbox Code Playgroud)

Fedora 20 不再明确禁用它。有没有转发设定/etc/sysctl.conf/etc/sysctl.d//usr/lib/sysctl.d/