web-dev-qa-db-ja.com

カーネルのコンパイル時にIP転送を有効にする

ルーター用のカーネルをコンパイルしています。既存のLinuxシステムでIP転送を有効にする方法を知っています。コンパイル時に、CONFIG_IP_FORWARDは同じタスクを実行すると言われています。

GTKベースのカーネル構成ツール(gconfig)を使用して、Vanillaカーネルのバージョン3.12.14を構成しています。ただし、このオプションはどこにも表示されません。最近のカーネルに代替構成オプションがありますか、それとも何かが足りませんか?

2
JuliandotNut

2.0.xカーネルシリーズ 以降、LinuxカーネルソースにはCONFIG_IP_FORWARDINGオプションがありません。私の知る限り、ビルドされたカーネルに対してデフォルトでIP転送を有効にするコンパイル時オプションはもうありません。

2.1.xシリーズ以降、IPv4のIP転送を有効にする正しい方法は、 net.ipv4.ip_forwardsysctl オプションを使用することでした。

次の行をsysctl.conf(または/etc/sysctl.d内のファイル)に追加します。

net.ipv4.ip_forward = 1

次に、sysctlに構成をリロードさせます。

sysctl -p /etc/sysctl.conf

とはいえ、何らかの理由で、起動時にsysctlオプション(または同等の/proc)を設定する必要がないようにカーネルを構成する必要がある場合は、カーネルソースツリーで直接sysctlオプションのデフォルト値を変更できます* 。

/proc/sys/net/ipv4/ip_forwardsysctlテーブルエントリは、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フィールドは、静的ipv4_devconf構造体のフィールドである整数配列dataのエントリを指すように初期化されます。エントリは、IPV4_DEVCONF_FORWARDINGで定義されたinclude/uapi/linux/ip.h列挙値によって識別されます。構造体に含まれるdata配列は部分的にのみ初期化され、IPV4_DEVCONF_FORWARDINGエントリは省略されます。構造体には静的ストレージがあるため、すべての整数型メンバーはゼロに初期化されます。したがって、ip_forwardsysctlテーブルエントリのデータフィールドと記録されたデフォルト値を設定するには、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を介して有効になっている場合は、注意して続行してください。上記のパッチは、/proc/sys/net/ipv4/ip_forwardが、sysctlによる構成なしで、デフォルトで転送が有効になっていることを実際に示している限り、カーネルバージョン3.14に対して機能するようです。私が見る限り、3.12.14はsysctlエントリの初期化に関して違いはないようです。私はそれが役立つことを期待してパッチを含めましたが、いかなる保証もありません。

5
Thomas Nyman

静的に有効にするための解決策はわかりません(少なくとも最近のカーネルでは、CONFIG_IP_FORWARDはありません-ソースをgrepしただけです)。

多くの場合、転送を有効にする前に他のいくつかの設定(フィルタリングルール、QoSルール、[より正確な]ルーティングルールなど)を行う可能性があるため、セキュリティの観点からは、これはとにかく良い考えではないようです。

0
Andreas Wiese