커널 컴파일 시 IP 전달 활성화

커널 컴파일 시 IP 전달 활성화

라우터용 커널을 컴파일 중입니다. 기존 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으로 초기화됩니다. 따라서 데이터 필드를 설정하려면dataipv4_devconfIPV4_DEVCONF_FORWARDINGinclude/uapi/linux/ip.hdataIPV4_DEVCONF_FORWARDINGip_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_forwardsysctl.시스템 제어항목 초기화. 이 패치가 유용할 것이라는 희망으로 포함시켰으나 어떠한 보장도 없습니다.

답변2

나는 그것을 정적으로 활성화하는 솔루션을 알지 못합니다 (적어도 최근 커널에서는 아닙니다 . 소스 코드를 편집했을 CONFIG_IP_FORWARD뿐입니다 ).grep

많은 경우 전달을 활성화하기 전에 다른 항목(예: 필터링 규칙, QoS 규칙, [보다 정확한] 라우팅 규칙)을 구성할 수 있으므로 이는 보안 관점에서 좋은 생각이 아닌 것 같습니다.

답변3

IP 전달은 Linux 네트워킹 코드의 핵심 기능입니다. 그렇기 때문에 구성 변수가 없습니다.

관련 정보