ルーター用のカーネルをコンパイルしています。既存のLinuxシステムでIP転送を有効にする方法を知っています。コンパイル時に、CONFIG_IP_FORWARD
は同じタスクを実行すると言われています。
GTKベースのカーネル構成ツール(gconfig
)を使用して、Vanillaカーネルのバージョン3.12.14を構成しています。ただし、このオプションはどこにも表示されません。最近のカーネルに代替構成オプションがありますか、それとも何かが足りませんか?
2.0.xカーネルシリーズ 以降、LinuxカーネルソースにはCONFIG_IP_FORWARDING
オプションがありません。私の知る限り、ビルドされたカーネルに対してデフォルトで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
とはいえ、何らかの理由で、起動時にsysctlオプション(または同等の/proc
)を設定する必要がないようにカーネルを構成する必要がある場合は、カーネルソースツリーで直接sysctl
オプションのデフォルト値を変更できます* 。
/proc/sys/net/ipv4/ip_forward
のsysctlテーブルエントリは、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_forward
sysctlテーブルエントリのデータフィールドと記録されたデフォルト値を設定するには、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エントリの初期化に関して違いはないようです。私はそれが役立つことを期待してパッチを含めましたが、いかなる保証もありません。
静的に有効にするための解決策はわかりません(少なくとも最近のカーネルでは、CONFIG_IP_FORWARD
はありません-ソースをgrep
しただけです)。
多くの場合、転送を有効にする前に他のいくつかの設定(フィルタリングルール、QoSルール、[より正確な]ルーティングルールなど)を行う可能性があるため、セキュリティの観点からは、これはとにかく良い考えではないようです。