LS−GLのiptablesによるルーター化

 我が家にはインターネット回線が2回線入っており、一つはSTNetのFTTHでもう一つはYahooのADSLである。
 この回線に対するルーターは、FTTHの方はメルコ製を使用しているが、Yahooに対しては、直接Linuxを入れたパソコンを繋いでおり、iptablesによるファイアウォールでガードしている。

 したがって、今回のYahooに繋いでいるノートPCの老朽化からLS−GLに置き換えることを試みているが当然このLS−GLでもiptablesを動かす必要があることから挑戦してみた。

 当初この試みについては、これまでTurbopascalで苦労なく動かせていたので簡単に動くのではと思っていた。
 ところが
# apt-get install iptables

でインストールし、
# iptables -L

で状態を確認しようとしたところ
FATAL: Module ip_tables not found.
iptables v1.3.6: can't initialize iptables table `filter': iptables who? (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

なるメッセージが出て動かない。
モジュールip_tablesを組み込めといっているようである。しかし、カーネルの状態を確認してみるとiptables関係のモジュールには全くチェックが入っていない。
 これでは動かないのは当然と納得し、設定の変更に取り掛かったが、何を組み込めばよいのか見当がつかない。ネットを見ている内にその類の記述を発見し、それに倣って設定した。
 今回の設定は
1.カーネルへのiptables関係のモジュール組込み

2.zd1211bのドライバー再コンパイル
3.カーネルモジュールの読み込み
4.iptablesのセットアップスクリプト作成
5.ネットワーク起動スクリプト/etc/network/interfaceの修正

1.カーネルの再構築
 iptablesが使えるようにカーネルを再構築する。
# cd /usr/src/linux/linux-2.6.16_lsp.1.7.8
でカーネルのソースディレクトリーに移動して

# make menuconfig
でカーネル設定画面を呼出し、

Networking --->

  [*] Networking support

     Networking options --->

    [*] Network packet filtering (replaces ipchains) --->チェック後Enterで下に移動
   [*]   Network packet filtering debugging      関係ないかもしれないが念のためチェック
     Core Netfilter Configration ---> ここの下にある全てにチェック

     IP: Netfilter Configration --->  ここの下にある全てにチェック

 なお、IP: Netfilter Configrationの下をチェックすることで上の Core Netfilter Configrationの下の設定が一部変わるので再度 Core Netfilter Configrationに戻り再チェック。

 で修正して

# make uImage
# mkimage arch/arm/boot/uImage
# make modules
# make modules_install
# cp arch/arm/boot/uImage /boot/uImage.buffalo 必要により旧カーネルをuImage.buffalo.oldなどの名前                        で保存

こ こで # make modules_install を実行した時に、module-init-toolsが無いとのメッセージが出た。module-init-toolsは インストールしているのでのでインストールの必要は無いのであるが、もしかしてMakefilesの記述に問題があるのではと思い見てみると /kernel26なるディレクトリーにあるdepmodを指定しているやの記述を発見、おかしいのでディレクトリー指定を削除してdepmodのみとした。結果メッ セージはでなくなった。
  INSTALL net/netfilter/xt_limit.ko
  INSTALL net/netfilter/xt_mac.ko
  INSTALL net/netfilter/xt_mark.ko
  INSTALL net/netfilter/xt_pkttype.ko
  INSTALL net/netfilter/xt_realm.ko
  INSTALL net/netfilter/xt_sctp.ko
  INSTALL net/netfilter/xt_state.ko

if [ -r System.map -a -x depmod ]; then depmod -ae -F System.map -b binaries -r 2.6.16.16-arm1; fi

 しかし、最後にスクリプトのような物が表示されているが、これについては私の知識では意味が分らなかった。

 いずれにせよ、エラー表示はあったがこれはあまり関係なかったようであり、Makefilesを修正する前からモジュールはインストールされていたようである。

2.zd1211bの再コンパイル
  LS−GLをルーターとして使う場合2つのネットワークインタフェースが必要となるが、一つは内蔵LANであり、これはYahooのADSLモデムに接続 する。もう一つはUSB端子に接続する無線LANのUSBタイプのアダプターでメルコのWLI−U2−KG54Lを使ってホームネットワーク
に接続する。
  このためWLI−U2−KG54Lを動かす必要があるが、ドライバーはLS−GLを無線LANのアクセスポイント化した時に組み込んでいたので挿せば動く のではと思っていたが、何故か動かない。iwconfigでパラメータの設定は出来るが動いていないようである。iwlistなど色々いじくっているとメ モリー関係共有違反のようなエラーメッセージが出る。どうも上手く動いていないようである。理由はよくわからないが再コンパイルしてみることにした。
# cd /usr/src/zd1211-driver-r85
でソースのあるディレクトリーに移動し、
# make
# make install
で再コンパイルが出来た。insmodで再度組込み、WLI−U2−KG54Lを挿入してみると上手く動いているようである。
 カーネルソースに無いドライバーを持ってきた時は、カーネルの再構築に併せて再コンパイルが必要なのかもしれない。経験の少ない私には不可解な事ばかりである。

3.カーネルモジュールの読み込み
 iptablesの説明を見ていると必要なモジュールは自動で読み込むとの事であるが、今回のケースではいくらiptablesを起動してもモジュールを読み込む気配が無い。
 同じモジュールでも無線LANのドライバーはアダプターを挿す事で上手く読み込まれている。
 カーネルのモジュールだけが上手く動いていないのは make modules_install が上手く動いていないのだろうか。だとするとMakefilesの設定がまずいのかもしれないが、それを追求する時間も知識も有そうに無い。
 仕方が無いので手動でinsmodを使って読み込ます事とするが、沢山あるのでどれを読み込ませば良いか分らない。
 しかたがないので、現在ルーターとして使っているノートが組込んでいるモジュールを見てみたり、ネットを見たりでこれはと思われるものを組み込んでいくが、時々知らないシンボルがあるなどといってエラーとなる。
# insmod ip_tables.ko
Unknown symbol in module

 その場合は、dmesgでメッセージを見ると具体的なシンボル名があるのでそれからモジュールを推定して組み込んでみる。上手く当たればエラーは出なくなる。
# dmesg
ip_tables: Unknown symbol xt_free_table_info
ip_tables: Unknown symbol xt_register_match
ip_tables: Unknown symbol xt_find_match
ip_tables: Unknown symbol xt_alloc_table_info
ip_tables: Unknown symbol xt_unregister_match
ip_tables: Unknown symbol xt_register_target
ip_tables: Unknown symbol xt_register_table
ip_tables: Unknown symbol xt_proto_init
ip_tables: Unknown symbol xt_replace_table
ip_tables: Unknown symbol xt_find_table_lock
ip_tables: Unknown symbol xt_table_unlock
ip_tables: Unknown symbol xt_proto_fini
ip_tables: Unknown symbol xt_find_revision
ip_tables: Unknown symbol xt_unregister_table
ip_tables: Unknown symbol xt_find_target
ip_tables: Unknown symbol xt_unregister_target

 このケースではxt_tablesを先に組み込むとOKとなった。
 この作業の繰り返しで何とか動く状態になった時の組込みモジュールは以下の通りである。

# lsmod
Module                  Size  Used by
xt_tcpudp               3104  2
xt_state                1728  2
ipt_MASQUERADE          3040  1
iptable_nat             7044  1
iptable_filter          2304  1
ip_nat                 15186  2 ipt_MASQUERADE,iptable_nat
ip_conntrack           51032  4 xt_state,ipt_MASQUERADE,iptable_nat,ip_nat
ip_tables              11528  2 iptable_nat,iptable_filter
nfnetlink               5432  2 ip_nat,ip_conntrack
x_tables               10852  5 xt_tcpudp,xt_state,ipt_MASQUERADE,iptable_nat,ip_tables
zd1211b               298048  0

 これを起動時に組み込む必要があるが、Debian推奨の方法が分らないので、次に示すiptablesの設定ファイルの最初のところに記述することとした。

4.iptablesのセットアップスクリプト作成
  今回必要なFirewallの機能は、
  • 自宅ネットワークの端末からインターネットのwebなどの各種サービスにアクセス出来るアドレス変換機能(IP Masquerade)
  • インターネットから本サーバーのWebとメールサーバーにアクセスを許容する機能
  • 本サーバーからpingをインタネットに対して打てる機能
程度である。
 スクリプトの記述方法をネットで調べてみた結果、以下の設定で取り敢えず動いている。
 セキュリティ面からは、もっと細かく設定すべきであるがそれはこれから少しずつ追加していくこととする。ここで最初にある# set modulesのところが前で述べたカーネルモジュールの組込み部分である。

setiptable.sh
#!/bin/sh

# set modules
insmod /lib/modules/2.6.16.16-arm1/build/net/netfilter/x_tables.ko
insmod /lib/modules/2.6.16.16-arm1/build/net/netfilter/nfnetlink.ko
insmod /lib/modules/2.6.16.16-arm1/build/net/ipv4/netfilter/ip_tables.ko
insmod /lib/modules/2.6.16.16-arm1/build/net/ipv4/netfilter/ip_conntrack.ko
insmod /lib/modules/2.6.16.16-arm1/build/net/ipv4/netfilter/ip_nat.ko
insmod /lib/modules/2.6.16.16-arm1/build/net/ipv4/netfilter/iptable_filter.ko
insmod /lib/modules/2.6.16.16-arm1/build/net/ipv4/netfilter/iptable_nat.ko
insmod /lib/modules/2.6.16.16-arm1/build/net/ipv4/netfilter/ipt_MASQUERADE.ko
insmod /lib/modules/2.6.16.16-arm1/build/net/netfilter/xt_state.ko
insmod /lib/modules/2.6.16.16-arm1/build/net/netfilter/xt_tcpudp.ko

# clear
#iptables -F

# nat
echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

# policy
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
この行がないとpingが通らなかった。

# local
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# client -> server,internet
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# internet -> server
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT


  このスクリプト実行方法であるが、旧サーバーのTurboでは/etcにrc.localなるファイルがあり、DOS時代のautoexec.batファ イルのように起動時実行したい物があればここに書けばいいというような仕組があったが、Debianの場合は良く分らないので調べてみると幾つかあるよう であった。
  • 通常の常駐ソフトの起動と同じように/etc/init.d/にスクリプトを置き起動設定する。
  • 起動時実行する/etc/init.d/networkingのスタート時の記述の最後にsetiptable.shと記述する。
  • Debianの仕組である/etc/network/if-pre-up.d/にsetiptable.shを置く。だだし、この場合は何故かファイル名にピリオド"."があるとダメなようなので、setiptableとする。
 この内二番目が今までやってきた方法に近いがDebianらしさも試す必要があるので三番目の方法を採用した。

 組込みが終わった後は、以下のコマンドでIPマスカレードが設定できたかどうか確認できる。また、現実のネットワークを使ってdefault gatewayをルーターのIPアドレスとして外部のネットワークにpingを打つことでも確認できる。

ybb:/home/anabuki# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  0    --  192.168.0.0/24       anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

 フィルターの確認は、
ybb:/home/anabuki# iptables -L

である。

5.ネットワーク起動スクリプト/etc/network/interfaceの修正
  今回のケースで心配だったのは、USBタイプの無線LANアダプターの起動方法であった。方法はこれも二つほど考えられ、
  • hotplugの挿抜による起動として/etc/hotplug/usb/に起動スクリプトを書いたファイルを置く。
  • システムのネットワーク起動ファイルである/etc/network/interfaceに書き込む。
であったが、USBアダプター検出のタイミングが少し心配だったが、抜き差しをすることも無いだろうということで、後者の/etc/network/interfaceで試したところ上手く動いたのでこちらを採用した。

  ファイルの内容は以下の通りで、Yahooに対してはLAN端子(ここではeth0)を使いDHCPでアドレスを取得し、ホームネットワークに対しては無 線LAN(ここではwlan0)に固定のIPアドレスを付けている。最適な記述方法は分らないが取り敢えずこれで動いている。

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp

allow-hotplug wlan0
auto wlan0
iface wlan0 inet static
address 192.168.0.xx
netmask 255.255.255.0
broadcast 192.168.0.255
wireless_essid xxxxxxxxxxxxxx
wireless_channel x
wireless_rate 54M
 
 なお、無線LANの設定項目は適当であるが、動いているのでこの程度にしている。iwconfigでチェックの上、必要であれば指定項目を追加すべきであろう。 
 
 これによるルーティングテーブルはこんな感じである。
ybb:/home/anabuki# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     *               255.255.255.0   U     0      0        0 wlan0
220.45.72.0     *               255.255.252.0   U     0      0        0 eth0
default         softbank2200450 0.0.0.0         UG    0      0        0 eth0

ホームページトップ  LinkStationトップ