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 ターゲットも現在試験段階の機能です。
|
詳細は後回しにして、とりあえずこのような設定で型どおりにカーネルを作成します。モジュールはこの設定の場合、次のように展開されます。
# 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 は最初から実装されていませんので注意してください。