라우터용 커널을 컴파일 중입니다. 기존 Linux 시스템에서 IP 전달을 활성화하는 방법을 알고 있습니다. 컴파일 타임에 CONFIG_IP_FORWARD
동일한 작업을 수행한다고 합니다.
GTK 기반 커널 구성 도구( )를 사용하여 바닐라 커널 3.12.14 버전을 구성하고 있습니다 gconfig
. 그러나 이 옵션은 어디에도 표시되지 않습니다. 최근 커널에 대체 구성 옵션이 있습니까, 아니면 뭔가 빠졌습니까?
답변1
CONFIG_IP_FORWARDING
이 옵션은 Linux 커널 소스 코드가 출시된 이후로 사용할 수 없습니다.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
정수 배열의 항목을 가리키도록 초기화됩니다 . 항목은 에 정의된 열거 값 으로 . 이 구조에 포함된 배열은 항목이 생략 되어 부분적으로만 초기화됩니다 . 구조에는 정적 저장소가 있으므로 모든 정수 유형 멤버는 0으로 초기화됩니다. 따라서 데이터 필드를 설정하려면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
.시스템 제어항목 초기화. 이 패치가 유용할 것이라는 희망으로 포함시켰으나 어떠한 보장도 없습니다.
답변2
나는 그것을 정적으로 활성화하는 솔루션을 알지 못합니다 (적어도 최근 커널에서는 아닙니다 . 소스 코드를 편집했을 CONFIG_IP_FORWARD
뿐입니다 ).grep
많은 경우 전달을 활성화하기 전에 다른 항목(예: 필터링 규칙, QoS 규칙, [보다 정확한] 라우팅 규칙)을 구성할 수 있으므로 이는 보안 관점에서 좋은 생각이 아닌 것 같습니다.
답변3
IP 전달은 Linux 네트워킹 코드의 핵심 기능입니다. 그렇기 때문에 구성 변수가 없습니다.