大橋のページ

iproute2+tcを使って1台で複数インターネット接続

1 複数のインターネット接続
2 インタフェースとルーティングテーブル
3 ifconfigとrouteコマンド
4 Linuxカーネルのコンパイル 1
5 Linuxカーネルのコンパイル 2
6 iproute2+tcのインストール
7 ipコマンドでインタフェースの登録
8 ipコマンドでルーティング設定
9 namedをインタフェースごとに起動する
10 sendmailをインタフェースごとに起動する

4 Linuxカーネルのコンパイル1

カーネルソースをインストールする

iproute2+tcを使うためには、Linuxカーネルをコンパイルしなおす(再構築する)必要があります。また、そのときのカーネルはバージョンが「2.2.x」以上である必要があります。現在では、RedHat社などのディストリビュータから発表されているパッケージ(いわゆるディストリビューションパッケージ)を使うことが多くなってきています。多くのディストリビューションパッケージに収録されているカーネルでは、最初からいろいろなオプションが有効になっているようですが、筆者が使っているRedHat5.1(日本語版)では、必要なオプションが有効になっていないため、カーネルをコンパイルする必要がありました。各ディストリビューションパッケージを調べたわけではありません(調べる予定もありません)が、iproute2+tcを使うために必要なオプションは有効になっていないと思われます。

カーネルをコンパイルするには、当たり前ですが、ソースファイルがなければなりません。ここでは、RedHat 5.1(日本語版)を使うこととし、ソースファイル「kernel-source-2.2.12-32.i386.rpm」をインストールしてから、コンパイルしてみます。

CD-ROMからコピーするなどしてから、Linuxに転送します。転送後、rpmコマンドを使ってインストールします。Windowsからtelnetでログインして作業する場合は、以後、ログをとるようにしておくとあとから確認することができます。

# rpm -ivv --test kernel-source-2.2.12-32.i386.rpm
D: counting packages to install
D: found 1 packages
D: looking for packages to download
D: retrieved 0 packages
D: New Header signature
D: Signature size: 149
D: Signature pad : 3
D: sigsize         : 152
D: Header + Archive: 13061940
D: expected size   : 13061940
D: opening database mode 0x0 in //var/lib/rpm/
D: found 0 source and 1 binary packages
D:   YES    A kernel-headers = 2.2.12-32        B kernel-headers = 2.2.12
D:  requires: kernel-headers = 2.2.12 satisfied by db packages.
D:  requires: /bin/sh   satisfied by db file lists.
D:  requires: ld-linux.so.2  satisfied by db provides.
D:  requires: libc.so.6  satisfied by db provides.
D:  requires: libm.so.6  satisfied by db provides.
D:  requires: /bin/sh  satisfied by db file lists.
D:  requires: /usr/bin/perl  satisfied by db file lists.
D:  requires: libc.so.6(GLIBC_2.0)  satisfied by db provides.
D:  requires: libc.so.6(GLIBC_2.1)  satisfied by db provides.
D:  requires: libm.so.6(GLIBC_2.1)  satisfied by db provides.
D: installing binary packages
D: getting list of mounted filesystems
D: New Header signature
D: Signature size: 149
D: Signature pad : 3
D: sigsize         : 152
D: Header + Archive: 13061940
D: expected size   : 13061940
D: package: kernel-source-2.2.12-32 files test = 1
D:    file: /usr/src/linux-2.2.12/COPYING action: create
D:    file: /usr/src/linux-2.2.12/CREDITS action: create

(略)

D:    file: /usr/src/linux-2.2.12/scripts/tkparse.h action: create
D:    file: /usr/src/linux-2.2.12/scripts/ver_linux action: create
D: stopping install as we're running --test
#

「--test」はテストモードでの実行です。問題ないようなら、インストールを実行します。

# rpm -ivv kernel-source-2.2.12-32.i386.rpm
D: counting packages to install
D: found 1 packages
D: looking for packages to download

(略)

D:    file: /usr/src/linux-2.2.12/scripts/ver_linux action: create
D: running preinstall script (if any)
kernel-source-2.2.12-32
D: running postinstall scripts (if any)
+ cd /usr/src
+ rm -f linux
+ ln -snf linux-2.2.12 linux
#

ソースは、「/usr/src」ディレクトリの下に「linux-2.2.12」ディレクトリが作られ、このディレクトリの下にインストールされます。また、同じ「/usr/src」ディレクトリに「linux」という名前のディレクトリがありますが、これは「linux-2.2.12」ディレクトリのシンボリックリンクになっています。

カーネルのコンパイルにあたっては、「kernel-headers-2.2.12-32.i386.rpm」が必要な場合があります(ちょっと不明です)。必要なときは、カーネルソースと同じようにインストールします。

カーネルのコンパイルは、

  • オプションを設定する
  • 依存関係を設定する
  • コンパイルする
  • モジュールをコンパイルする
  • モジュールをインストールする
  • カーネルをインストールする

の順で行ないます。 ちなみに、rpmコマンドを使ってアンインストールするときは、パッケージ名を使って(.i386.rpmのない状態)、

# rpm -evv kernel-source-2.2.12-32

「-e」(erase)とします。「--test」のテストモードも有効です。また、アップグレードするときは、

# rpm -Uvv kernel-source-2.2.12-32.i386.rpm

「-U」(Upgrade)とします。「--test」のテストモードも有効です。強制的にアップグレードするときには「--force」オプションを付けて実行します。

カーネルのオプションを設定する

カーネルにはさまざまな機能がオプションになっています。ここでコンパイルしなおす最大の目的は、iproute2+tcが使える状態にすることです。

オプションを設定するには、いくつかの方法があります。コマンドライン方式が「make config」、GUI形式で設定するのが「make menuconfig」です。「make menuconfig」は階層式でオプションが表示され、マウスを使って設定したりもできますが、telnetでログインして使うことができません(できなくはないのですが、正常に表示されません)。「make config」はテキストベースなので、telnetでログインした状態で行なえます。ここでは、「make config」で設定します。

「/usr/src/linux」(または「/usr/src/linux-2.2.12」)で移動してから、「make config」を実行します。

# cd /usr/src/linux
# make config
rm -f include/asm
( cd include ; ln -sf asm-i386 asm)
/bin/sh scripts/Configure arch/i386/config.in
#
# Using defaults found in arch/i386/defconfig
#
*
* Code maturity level options
*
Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL) [Y/n
/?]

ここからオプションの設定の始まりです。設定のほとんどで、「y」キーと「n」キーが使えます。大文字で「Y」や「N」のように表示されているときは、現在設定されている状態が「y」または「n」であることを表わしています。そのままEnterキーを押すと、そのとき設定されているものがそのまま引き継がれます。

Processor family (386, 486/Cx486, 586/K5/5x86/6x86, Pentium/K6/TSC, PPro/6x86MX)
 [386]

のような場合には、「386」が現在設定されています。設定を変更するときは、「586」のようにそれぞれ文字列を入力します。

Kernel support for a.out binaries (CONFIG_BINFMT_AOUT) [M/n/y/?]

のように「M」が表示されているときは、カーネル本体には取り込まないで、モジュール形式で持っていて、必要なときに有効にすることができます。

オプションの設定は、簡潔で、また英語です。ものによっては、かなり専門的です。もしLinuxが正常に動作しているようなら、へたに変更しないでEnterキーを押しつづけましょう。

さて、iproute2+tcを使うために必要なオプションは、まず次の個所です。

* General setup
*
Networking support (CONFIG_NET) [Y/n/?]

ここは「Y」になっているはずなので、確認します。次の「Networking options」は重要な設定個所です。

*
* Networking options
*
Packet socket (CONFIG_PACKET) [Y/m/n/?]
Kernel/User netlink socket (CONFIG_NETLINK) [Y/n/?]
Routing messages (CONFIG_RTNETLINK) [Y/n/?]
Netlink device emulation (CONFIG_NETLINK_DEV) [Y/m/n/?]
Network firewalls (CONFIG_FIREWALL) [Y/n/?]
Socket Filtering (CONFIG_FILTER) [Y/n/?]
Unix domain sockets (CONFIG_UNIX) [Y/m/n/?]
TCP/IP networking (CONFIG_INET) [Y/n/?]
IP: multicasting (CONFIG_IP_MULTICAST) [Y/n/?]
IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [N/y/?]

「IP: advanced router (CONFIG_IP_ADVANCED_ROUTER)」を「y」にすると以下のオ プションを設定できるようになります。

IP: policy routing (CONFIG_IP_MULTIPLE_TABLES) [N/y/?] (NEW)
IP: equal cost multipath (CONFIG_IP_ROUTE_MULTIPATH) [N/y/?] (NEW)
IP: use TOS value as routing key (CONFIG_IP_ROUTE_TOS) [N/y/?] (NEW)
IP: verbose route monitoring (CONFIG_IP_ROUTE_VERBOSE) [N/y/?] (NEW)
IP: large routing tables (CONFIG_IP_ROUTE_LARGE_TABLES) [N/y/?] (NEW)
IP: fast network address translation (CONFIG_IP_ROUTE_NAT) [N/y/?] (NEW)


IP: kernel level autoconfiguration (CONFIG_IP_PNP) [N/y/?]

「IP: kernel level autoconfiguration (CONFIG_IP_PNP)」を「y」にすると以下の オプションを設定できるようになります。 BOOTP support (CONFIG_IP_PNP_BOOTP) [N/y/?] (NEW) RARP support (CONFIG_IP_PNP_RARP) [N/y/?] (NEW)

IP: firewalling (CONFIG_IP_FIREWALL) [Y/n/?]
IP: firewall packet netlink device (CONFIG_IP_FIREWALL_NETLINK) [Y/n/?]
IP: transparent proxy support (CONFIG_IP_TRANSPARENT_PROXY) [Y/n/?]
IP: masquerading (CONFIG_IP_MASQUERADE) [Y/n/?]
*
* Protocol-specific masquerading support will be built as modules.
*
IP: ICMP masquerading (CONFIG_IP_MASQUERADE_ICMP) [Y/n/?]
*
* Protocol-specific masquerading support will be built as modules.
*
IP: masquerading special modules support (CONFIG_IP_MASQUERADE_MOD) [Y/n/?]
IP: ipautofw masq support (EXPERIMENTAL) (CONFIG_IP_MASQUERADE_IPAUTOFW) [M/n/y/
?]
IP: ipportfw masq support (EXPERIMENTAL) (CONFIG_IP_MASQUERADE_IPPORTFW) [M/n/y/
?]
IP: ip fwmark masq-forwarding support (EXPERIMENTAL) (CONFIG_IP_MASQUERADE_MFW)
[M/n/y/?]
IP: masquerading virtual server support (EXPERIMENTAL) (CONFIG_IP_MASQUERADE_VS)
 [Y/n/?]
IP masquerading VS table size (the Nth power of 2) (CONFIG_IP_MASQUERADE_VS_TAB_
BITS) [12]
IPVS: round-robin scheduling (CONFIG_IP_MASQUERADE_VS_RR) [M/n/y/?]
IPVS: weighted round-robin scheduling (CONFIG_IP_MASQUERADE_VS_WRR) [M/n/y/?]
IPVS: weighted least-connection scheduling (CONFIG_IP_MASQUERADE_VS_WLC) [M/n/y/
?]
IP: optimize as router not host (CONFIG_IP_ROUTER) [N/y/?]

「IP: optimize as router not host (CONFIG_IP_ROUTER)」は、ルータ専用にする 場合のオプションです(たぶん)。

IP: tunneling (CONFIG_NET_IPIP) [M/n/y/?]
IP: GRE tunnels over IP (CONFIG_NET_IPGRE) [M/n/y/?]
IP: broadcast GRE over IP (CONFIG_NET_IPGRE_BROADCAST) [Y/n/?]
IP: multicast routing (CONFIG_IP_MROUTE) [N/y/?]

「IP: multicast routing (CONFIG_IP_MROUTE)」は、IPマルチキャストルーティング を使うときのためのオプションです。

IP: aliasing support (CONFIG_IP_ALIAS) [Y/n/?]
IP: ARP daemon support (EXPERIMENTAL) (CONFIG_ARPD) [N/y/?]

「IP: ARP daemon support (EXPERIMENTAL) (CONFIG_ARPD) 」は、ARPデーモンをサポ ートするときのためのオプションです。

IP: TCP syncookie support (not enabled per default) (CONFIG_SYN_COOKIES) [Y/n/?]

とくに重要なのは、「IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [N/y/?]」の「N」を「y」に変更したときに表示される以下のオプションです。

IP: policy routing (CONFIG_IP_MULTIPLE_TABLES) [N/y/?] (NEW)
IP: equal cost multipath (CONFIG_IP_ROUTE_MULTIPATH) [N/y/?] (NEW)
IP: use TOS value as routing key (CONFIG_IP_ROUTE_TOS) [N/y/?] (NEW)
IP: verbose route monitoring (CONFIG_IP_ROUTE_VERBOSE) [N/y/?] (NEW)
IP: large routing tables (CONFIG_IP_ROUTE_LARGE_TABLES) [N/y/?] (NEW)
IP: fast network address translation (CONFIG_IP_ROUTE_NAT) [N/y/?] (NEW)

じつは筆者もそれぞれのオプションの意味を正確に理解できている自信はありませんが、ドキュメントを調べたかぎりでは、以下で使う(iproute2+tcの実際のコマンド)ipコマンド(ip ruleやip route)などでは、カーネルオプションとして、すべて有効になっている必要があるようです。また、ip tunnelコマンドでは、「IP:tunneling」や「IP:GRE tunneling over IP」「IP:broadcast GRE over IP」が有効になっている必要があるようです(標準でモジュール組み込みか「Y」になっています)。

tcコマンド(ipコマンドと同様、iproute2+tcの実際のコマンド)では、「QoS support」と「QoS and/or fair queueing」が有効になっている必要があるようです。

QoS関連は、「QoS and/or fair queueing」セクションで設定します。

*
* QoS and/or fair queueing
*
QoS and/or fair queueing (CONFIG_NET_SCHED) [N/y/?]
CBQ packet scheduler (CONFIG_NET_SCH_CBQ) [N/y/m/?] (NEW)
CSZ packet scheduler (CONFIG_NET_SCH_CSZ) [N/y/m/?] (NEW)
The simplest PRIO pseudoscheduler (CONFIG_NET_SCH_PRIO) [N/y/m/?] (NEW)
RED queue (CONFIG_NET_SCH_RED) [N/y/m/?] (NEW)
SFQ queue (CONFIG_NET_SCH_SFQ) [N/y/m/?] (NEW)
TEQL queue (CONFIG_NET_SCH_TEQL) [N/y/m/?] (NEW)
TBF queue (CONFIG_NET_SCH_TBF) [N/y/m/?] (NEW)
QoS support (CONFIG_NET_QOS) [N/y/?] (NEW)
Rate estimator (CONFIG_NET_ESTIMATOR) [N/y/?] (NEW)
Packet classifier API (CONFIG_NET_CLS) [N/y/?] (NEW)
Routing table based classifier (CONFIG_NET_CLS_ROUTE4) [N/y/m/?] (NEW)
Firewall based classifier (CONFIG_NET_CLS_FW) [N/y/m/?] (NEW)
U32 classifier (CONFIG_NET_CLS_U32) [N/y/m/?] (NEW)
Special RSVP classifier (CONFIG_NET_CLS_RSVP) [N/y/m/?] (NEW)
Special RSVP classifier for IPv6 (CONFIG_NET_CLS_RSVP6) [N/y/m/?] (NEW)
Ingres traffic policing (CONFIG_NET_CLS_POLICE) [N/y/?] (NEW)

必要に応じて有効にします。現状では、筆者もそれぞれのオプションがなにを表わしているか、不明ですm(__)m

ただし、ネットワークセキュリティの観点からは、不用意に有効にしないほうがいいものがある可能性もあります。じゅうぶん注意してから、あるいは個人の責任で、行なってください。筆者はかならずしもここでの設定を勧めているわけではありません。

以上のほかには、

*
* Network device support
*
Network device support (CONFIG_NETDEVICES) [Y/n/?]

が有効になっている必要があります。もともと有効になっているはずなので、確認します。ネットワーク関連では、以下が有効になっていることと、ネットワークカード関連のモジュールが正しく有効になっていることを確認します。

*
* Ethernet (10 or 100Mbit)
*
Ethernet (10 or 100Mbit) (CONFIG_NET_ETHERNET) [Y/n/?]

著作権、商標等について (C) 2000 HyperDyne Inc.