Unix User 7月号 「Linux カーネル2.4 におけるNAT とパケットフィルタ」補足説明

Last updated 2001-06-07 8:39 pm


Unix User 7月号に掲載されました「Linux カーネル2.4 におけるNAT とパケットフィルタ」の記事に補足してコンパイル方法を紹介します。

当記事中で Netfilter のカーネルへの組み込みについて、「ソースツリーにバグがあるため built-in 方式ではコンパイルできない」と説明しましたが、現在のバージョン(2.4.5)にバグはありません。筆者が改変しながら使用していたソースツリーに問題があったようです。謹んでお詫び申し上げます。

平成13年6月7日
西田 亙

ページ数の関係で本文中で十分説明出来なかった点を幾つか補足します。

ネットフィルター・カーネルオプションの意味と選択方法

まず最初に "Networking options" ですが、"Unix domain sockets" と "TCP/IP networking" は必須オプションです。Netfilter を利用するためにはさらに "Network packet filtering (replaces ipchains)" を指定してください。このオプションを指定すると、下の "IP: Netfilter Configuration" を選択することで更にオプションを設定できるようになります。

もしも QUEUE ターゲットを利用して、ユーザースペースツール上からパケット処理を行いたい場合はネットリンク・ソケットが必要になりますので、"Kernel/User netlink socket" を選択してください。

< > Packet socket
[ ]   Packet socket: mmapped IO
[*] Kernel/User netlink socket
[ ]   Routing messages
< >   Netlink device emulation
[*] Network packet filtering (replaces ipchains)
[ ]   Network packet filtering debugging
[ ] Socket Filtering
<*> Unix domain sockets
[*] TCP/IP networking
[ ]   IP: multicasting
[ ]   IP: advanced router
[ ]   IP: kernel level autoconfiguration
< >   IP: tunneling
< >   IP: GRE tunnels over IP
[ ]   IP: TCP Explicit Congestion Notification support
[ ]   IP: TCP syncookie support (disabled per default)
  IP: Netfilter Configuration  --->
< >   The IPv6 protocol (EXPERIMENTAL)
< >   Kernel httpd acceleration (EXPERIMENTAL)
[ ] Asynchronous Transfer Mode (ATM) (EXPERIMENTAL)

次にネットフィルター専用のオプション設定に移ります。下の画面で (EXPERIMENTAL) と付記されているオプションは全てテスト段階のものです。これらはトップメニューの最上段 "Code maturity level options" で "Prompt for development and/or incomplete code/drivers" を予め選択しておかないと表示されませんので注意してください。ちなみに QUEUE ターゲットも現在試験段階の機能です。

<M> Connection tracking (required for masq/NAT)
<M>   FTP protocol support (NEW)
<M> Userspace queueing via NETLINK (EXPERIMENTAL)
<M> IP tables support (required for filtering/masq/NAT)
< >   limit match support
< >   MAC address match support
< >   netfilter MARK match support
< >   Multiple port match support
< >   TOS match support
< >   tcpmss match support
< >   Connection state match support (NEW)
< >   Unclean match support (EXPERIMENTAL)
< >   Owner match support (EXPERIMENTAL)
<M>   Packet filtering
<M>     REJECT target support
< >     MIRROR target support (EXPERIMENTAL)
<M>   Full NAT (NEW)
<M>     MASQUERADE target support (NEW)
< >     REDIRECT target support (NEW)
< >   Packet mangling
<M>   LOG target support
< >   TCPMSS target support
< > ipchains (2.2-style) support
< > ipfwadm (2.0-style) support

詳細は後回しにして、とりあえずこのような設定で型どおりにカーネルを作成します。モジュールはこの設定の場合、次のように展開されます。

# ls -l /lib/modules/2.4.5/kernel/net/ipv4/netfilter/
total 3505
drwxrwxr-x    2 root     root          376 Jun  7 20:06 .
drwxrwxr-x    3 root     root           80 Jun  7 20:06 ..
-rw-rw-r--    1 root     root       905689 Jun  7 20:06 ip_conntrack.o
-rw-rw-r--    1 root     root       180484 Jun  7 20:06 ip_conntrack_ftp.o
-rw-rw-r--    1 root     root       181920 Jun  7 20:06 ip_nat_ftp.o
-rw-rw-r--    1 root     root       176428 Jun  7 20:06 ip_queue.o
-rw-rw-r--    1 root     root       231496 Jun  7 20:06 ip_tables.o
-rw-rw-r--    1 root     root       179452 Jun  7 20:06 ipt_LOG.o
-rw-rw-r--    1 root     root       167244 Jun  7 20:06 ipt_MASQUERADE.o
-rw-rw-r--    1 root     root       179928 Jun  7 20:06 ipt_REJECT.o
-rw-rw-r--    1 root     root       123720 Jun  7 20:06 iptable_filter.o
-rw-rw-r--    1 root     root      1239826 Jun  7 20:06 iptable_nat.o

新しいカーネルで再起動します。この時、Netfilter に関連するバナーメッセージは表示されませんし、iptables も利用できない事に注意してください。まず最初にやるべき事は、ip_tables.o モジュールをシステムに登録することです。このモジュールが登録されると、Netfilter core team の Welcome message が表示され、/proc/net/ に ip_tables_names という項目が現れます。cat /proc/net/ip_tables_names を実行すると、利用可能なテーブル名が出力されますが、この時点では何も表示されません。iptables を -t filter -L オプションで起動しても、「filter table が登録されていない」ためにエラーとなります。フィルタリングを有効にするためには iptable_filter.o モジュールを登録する必要があります。

# insmod /lib/modules/2.4.5/kernel/net/ipv4/netfilter/ip_tables.o

# lsmod
Module                  Size  Used by
ip_tables              15792   0  (unused)

# tail /var/log/syslog
Jun  7 20:13:25 mebius kernel: ip_tables: (c)2000 Netfilter core team

# ls /proc/net
aarp       atalk_iface  dev_mcast        netstat  route     snmp          tcp
appletalk  atalk_route  ip_tables_names  packet   rpc       sockstat      udp
arp        dev          netlink          raw      rt_cache  softnet_stat  unix

# cat /proc/net/ip_tables_names
# iptables -t filter -L
iptables v1.2.2: can't initialize iptables table `filter': Table does not exist (do you need to insm
od?)
Perhaps iptables or your kernel needs to be upgraded.

iptable_filter.o モジュールが登録されると、/proc/net/ip_tables_names に filter table の名前が現れ、フィルタリングが有効になった事が分かります。iptables -t filter -L を実行すると、今度は正常にルールリストが表示されます。しかしながら、nat table はまだ有効ではありません。NAT 関連モジュールを登録する必要があります。

# insmod /lib/modules/2.4.5/kernel/net/ipv4/netfilter/iptable_filter.o

# lsmod
Module                  Size  Used by
iptable_filter          2304   0  (unused)
ip_tables              15792   1  [iptable_filter]

# cat /proc/net/ip_tables_names
filter

# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

# iptables -t nat -L
iptables v1.2.2: can't initialize iptables table `nat': Table does not exist (do you need to insmod?
)
Perhaps iptables or your kernel needs to be upgraded.

NAT 関連モジュールを登録する場合はその順番に注意してください。まず最初に connection tracking 関連のモジュール、ip_conntrack.o と ip_conntrack_ftp.o 、を登録します。ip_conntrack.o を登録すると、"ip_conntrack (1023 buckets, 8184 max)" というシステムメッセージが出力されます。次に iptable_nat.o と ip_nat_ftp.o を登録します。 cat /proc/net/ip_tables_names を実行して、nat table が登録されていることを確認しましょう。ここまで来れば、iptables も nat table に対して正常に作動します。NAT が利用可能になると新たに /proc/net に ip_conntrack という項目が現れ、cat /proc/net/ip_conntrack を実行することで、記録されているトラッキング情報を閲覧することができます。

# insmod /lib/modules/2.4.5/kernel/net/ipv4/netfilter/ip_conntrack.o

# lsmod
Module                  Size  Used by
ip_conntrack           26032   0  (unused)
iptable_filter          2304   0  (unused)
ip_tables              15792   1  [iptable_filter]

# tail /var/log/syslog
Jun  7 20:26:43 mebius kernel: ip_conntrack (1023 buckets, 8184 max)

# insmod /lib/modules/2.4.5/kernel/net/ipv4/netfilter/ip_conntrack_ftp.o
# insmod /lib/modules/2.4.5/kernel/net/ipv4/netfilter/iptable_nat.o
# insmod /lib/modules/2.4.5/kernel/net/ipv4/netfilter/ip_nat_ftp.o

# lsmod
Module                  Size  Used by
ip_nat_ftp              4720   0  (unused)
iptable_nat            25504   1  [ip_nat_ftp]
ip_conntrack_ftp        4240   0  [ip_nat_ftp]
ip_conntrack           26032   2  [ip_nat_ftp iptable_nat ip_conntrack_ftp]
iptable_filter          2304   0  (unused)
ip_tables              15792   4  [iptable_nat iptable_filter]

# cat /proc/net/ip_tables_names
nat
filter

# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

# ls /proc/net
aarp       atalk_iface  dev_mcast        netlink  raw    rt_cache  softnet_stat  unix
appletalk  atalk_route  ip_conntrack     netstat  route  snmp      tcp
arp        dev          ip_tables_names  packet   rpc    sockstat  udp

# cat /proc/net/ip_conntrack
tcp      6 431999 ESTABLISHED src=192.168.1.103 dst=192.168.1.200 sport=2054 dport=23 src=192.168.1.
200 dst=192.168.1.103 sport=23 dport=2054 use=1

以上が NAT とフィルタリングを行う際に最低限必要なモジュール群です。あとは好みに応じて、REJECT, QUEUE, MASQUERADE, LOG, LIMIT モジュールなどを組み込んで行きます。Netfilter ではパケットを拒否する場合、DROP する事が基本になっており REJECT は最初から実装されていませんので注意してください。