カーネルコンパイル時に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の項目を指すように初期化されます。項目は で定義された列挙値で 。この構造に含まれる配列は項目が省略され、部分的にのみ初期化されます。構造には静的リポジトリがあるため、すべての整数型メンバーはゼロに初期化されます。したがって、データフィールドを設定するには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 ネットワーキング コードの重要な機能です。そのため、構成変数はありません。

関連情報